Merge "Add more test cases to OldChangesListTest"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 6 Oct 2015 18:29:31 +0000 (18:29 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 6 Oct 2015 18:29:31 +0000 (18:29 +0000)
868 files changed:
.jscsrc
.mailmap
.travis.yml
CREDITS
HISTORY
RELEASE-NOTES-1.26
RELEASE-NOTES-1.27 [new file with mode: 0644]
UPGRADE
autoload.php
composer.json
docs/hooks.txt
includes/Block.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/Export.php
includes/Feed.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/Html.php
includes/HtmlFormatter.php
includes/HttpFunctions.php
includes/Import.php
includes/LinkFilter.php
includes/Linker.php
includes/MWNamespace.php
includes/MWTimestamp.php
includes/MediaWiki.php
includes/MimeMagic.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Preferences.php
includes/ProtectionForm.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/SiteStats.php
includes/Status.php
includes/TemplateParser.php
includes/Title.php
includes/User.php
includes/UserRightsProxy.php
includes/WebRequest.php
includes/WebResponse.php
includes/WebStart.php
includes/WikiMap.php
includes/Xml.php
includes/ZhConversion.php
includes/actions/Action.php
includes/actions/FormAction.php
includes/actions/InfoAction.php
includes/actions/ProtectAction.php
includes/actions/PurgeAction.php
includes/actions/RevertAction.php
includes/actions/RollbackAction.php
includes/actions/WatchAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiCreateAccount.php
includes/api/ApiFeedContributions.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiHelp.php
includes/api/ApiImport.php
includes/api/ApiMain.php
includes/api/ApiModuleManager.php
includes/api/ApiMove.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParse.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiUpload.php
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/el.json
includes/api/i18n/en-gb.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fa.json
includes/api/i18n/fr.json
includes/api/i18n/frc.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/hu.json
includes/api/i18n/ia.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/ksh.json
includes/api/i18n/ku-latn.json
includes/api/i18n/ky.json
includes/api/i18n/lb.json
includes/api/i18n/lt.json [new file with mode: 0644]
includes/api/i18n/mk.json
includes/api/i18n/ms.json
includes/api/i18n/nb.json
includes/api/i18n/nl.json
includes/api/i18n/oc.json
includes/api/i18n/pam.json
includes/api/i18n/pl.json
includes/api/i18n/ps.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sq.json
includes/api/i18n/sv.json
includes/api/i18n/tl.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/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/LocalisationCache.php
includes/cache/MessageBlobStore.php
includes/cache/MessageCache.php
includes/changes/CategoryMembershipChange.php [new file with mode: 0644]
includes/changes/EnhancedChangesList.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/changetags/ChangeTagsLogList.php
includes/changetags/ChangeTagsRevisionList.php
includes/clientpool/RedisConnectionPool.php
includes/compat/normal/UtfNormalDefines.php
includes/content/AbstractContent.php
includes/content/ContentHandler.php
includes/content/MessageContent.php
includes/context/RequestContext.php
includes/db/CloneDatabase.php
includes/db/DBConnRef.php
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/IDatabase.php
includes/db/LBFactory.php [deleted file]
includes/db/LBFactoryMulti.php [deleted file]
includes/db/LBFactorySingle.php [deleted file]
includes/db/LoadBalancer.php [deleted file]
includes/db/LoadMonitor.php [deleted file]
includes/db/LoadMonitorMySQL.php [deleted file]
includes/db/loadbalancer/LBFactory.php [new file with mode: 0644]
includes/db/loadbalancer/LBFactoryFake.php [new file with mode: 0644]
includes/db/loadbalancer/LBFactoryMulti.php [new file with mode: 0644]
includes/db/loadbalancer/LBFactorySimple.php [new file with mode: 0644]
includes/db/loadbalancer/LBFactorySingle.php [new file with mode: 0644]
includes/db/loadbalancer/LoadBalancer.php [new file with mode: 0644]
includes/db/loadbalancer/LoadMonitor.php [new file with mode: 0644]
includes/db/loadbalancer/LoadMonitorMySQL.php [new file with mode: 0644]
includes/debug/MWDebug.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/monolog/BufferHandler.php
includes/debug/logger/monolog/KafkaHandler.php
includes/deferred/DataUpdate.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksDeletionUpdate.php [new file with mode: 0644]
includes/deferred/LinksUpdate.php
includes/deferred/SearchUpdate.php
includes/deferred/SiteStatsUpdate.php
includes/deferred/SqlDataUpdate.php
includes/deferred/SquidUpdate.php
includes/diff/DifferenceEngine.php
includes/diff/TableDiffFormatter.php
includes/exception/MWExceptionHandler.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/FileBackendGroup.php
includes/filebackend/FileBackendMultiWrite.php
includes/filerepo/FileRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/gallery/TraditionalImageGallery.php
includes/htmlform/HTMLButtonField.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLHiddenField.php
includes/htmlform/HTMLTitleTextField.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/i18n/es.json
includes/installer/i18n/jut.json
includes/installer/i18n/ko.json
includes/installer/i18n/ksh.json
includes/installer/i18n/lt.json
includes/installer/i18n/nah.json
includes/installer/i18n/nap.json
includes/installer/i18n/pa.json
includes/installer/i18n/ps.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/ru.json
includes/installer/i18n/sco.json
includes/installer/i18n/sq.json
includes/installer/i18n/udm.json
includes/installer/i18n/zh-hant.json
includes/interwiki/Interwiki.php
includes/jobqueue/jobs/DeleteLinksJob.php [new file with mode: 0644]
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/jobqueue/jobs/ThumbnailRenderJob.php
includes/libs/BufferingStatsdDataFactory.php
includes/libs/CSSMin.php
includes/libs/HttpStatus.php
includes/libs/MultiHttpClient.php
includes/libs/ReplacementArray.php
includes/libs/SamplingStatsdClient.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/replacers/HashtableReplacer.php
includes/libs/virtualrest/ParsoidVirtualRESTService.php
includes/libs/virtualrest/RestbaseVirtualRESTService.php
includes/logging/BlockLogFormatter.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/LogPager.php
includes/logging/NewUsersLogFormatter.php
includes/logging/ProtectLogFormatter.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/media/Bitmap.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/ExifBitmap.php
includes/media/FormatMetadata.php
includes/media/GIF.php
includes/media/GIFMetadataExtractor.php
includes/media/IPTC.php
includes/media/ImageHandler.php
includes/media/MediaHandler.php
includes/media/PNG.php
includes/media/WebP.php
includes/media/XCF.php
includes/media/XMP.php
includes/media/XMPInfo.php
includes/media/XMPValidate.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/RedisBagOStuff.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/LinkHolderArray.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolCounterRedis.php
includes/profiler/ProfilerFunctions.php
includes/registration/CoreVersionChecker.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderEditToolbarModule.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/search/SearchDatabase.php
includes/search/SearchHighlighter.php
includes/search/SearchMySQL.php
includes/search/SearchPostgres.php
includes/search/SearchResult.php
includes/search/SearchResultSet.php
includes/site/MediaWikiSite.php
includes/site/SiteExporter.php
includes/site/SiteImporter.php
includes/site/SiteList.php
includes/skins/SkinTemplate.php
includes/specialpage/FormSpecialPage.php
includes/specialpage/QueryPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialCategories.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExport.php
includes/specials/SpecialImport.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialListusers.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWhatlinkshere.php
includes/tidy/Html5Depurate.php
includes/tidy/RaggettExternal.php
includes/tidy/RaggettWrapper.php
includes/tidy/TidyDriverBase.php
includes/title/MalformedTitleException.php
includes/title/MediaWikiPageLinkRenderer.php
includes/title/MediaWikiTitleCodec.php
includes/title/NaiveForeignTitleFactory.php
includes/upload/UploadBase.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.php
includes/utils/AvroValidator.php
includes/utils/BatchRowIterator.php
includes/utils/BatchRowUpdate.php
includes/utils/BatchRowWriter.php
includes/utils/FileContentsHasher.php [new file with mode: 0644]
includes/utils/IP.php
includes/utils/MWCryptHash.php [new file with mode: 0644]
includes/utils/MWCryptRand.php
includes/widget/ComplexNamespaceInputWidget.php
includes/widget/ComplexTitleInputWidget.php
includes/widget/TitleInputWidget.php
jsduck.json
languages/Language.php
languages/LanguageConverter.php
languages/Names.php
languages/classes/LanguageFi.php
languages/classes/LanguageRu.php
languages/classes/LanguageTyv.php
languages/classes/LanguageUk.php
languages/classes/data/grammar.ru.json [new file with mode: 0644]
languages/i18n/ace.json
languages/i18n/ady-cyrl.json
languages/i18n/aeb-arab.json
languages/i18n/af.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/anp.json
languages/i18n/ar.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/avk.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/bpy.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ch.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dtp.json
languages/i18n/dty.json
languages/i18n/egl.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/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hil.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.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/kaa.json
languages/i18n/kab.json
languages/i18n/kbd-cyrl.json
languages/i18n/kk-arab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/li.json
languages/i18n/lmo.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/map-bms.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/mzn.json
languages/i18n/nah.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/nso.json
languages/i18n/oc.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sdc.json
languages/i18n/se.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shi.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/srn.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/to.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/wa.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/wuu.json
languages/i18n/xal.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zea.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAn.php
languages/messages/MessagesAst.php
languages/messages/MessagesCa.php
languages/messages/MessagesDty.php
languages/messages/MessagesEs.php
languages/messages/MessagesExt.php
languages/messages/MessagesOlo.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverter.php [deleted file]
languages/utils/CLDRPluralRuleConverterExpression.php [deleted file]
languages/utils/CLDRPluralRuleConverterFragment.php [deleted file]
languages/utils/CLDRPluralRuleConverterOperator.php [deleted file]
languages/utils/CLDRPluralRuleError.php [deleted file]
languages/utils/CLDRPluralRuleEvaluator.php [deleted file]
languages/utils/CLDRPluralRuleEvaluatorRange.php [deleted file]
maintenance/Maintenance.php
maintenance/archives/patch-archive_ar_revid.sql
maintenance/archives/patch-backlinkindexes.sql
maintenance/archives/patch-categorylinksindex.sql
maintenance/backupPrefetch.inc
maintenance/backupTextPass.inc
maintenance/checkComposerLockUpToDate.php
maintenance/cleanupPreferences.php
maintenance/convertLinks.php
maintenance/fetchText.php
maintenance/findHooks.php
maintenance/jsduck/categories.json
maintenance/jsduck/eg-iframe.html
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/simp2trad_noconvert.manual
maintenance/language/zhtable/simpphrases.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/migrateFileRepoLayout.php
maintenance/minify.php
maintenance/populateContentModel.php
maintenance/preprocessorFuzzTest.php
maintenance/rebuildImages.php
maintenance/storage/compressOld.php
maintenance/storage/recompressTracked.php
maintenance/tables.sql
mw-config/config.js
package.json
phpcs.xml
profileinfo.php
resources/Resources.php
resources/lib/oojs-ui/i18n/af.json
resources/lib/oojs-ui/i18n/ca.json
resources/lib/oojs-ui/i18n/el.json
resources/lib/oojs-ui/i18n/en-ca.json
resources/lib/oojs-ui/i18n/en.json
resources/lib/oojs-ui/i18n/eo.json
resources/lib/oojs-ui/i18n/fa.json
resources/lib/oojs-ui/i18n/ia.json
resources/lib/oojs-ui/i18n/it.json
resources/lib/oojs-ui/i18n/ka.json
resources/lib/oojs-ui/i18n/ko.json
resources/lib/oojs-ui/i18n/krc.json
resources/lib/oojs-ui/i18n/krl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ml.json
resources/lib/oojs-ui/i18n/olo.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/pt.json
resources/lib/oojs-ui/i18n/qqq.json
resources/lib/oojs-ui/i18n/vec.json
resources/lib/oojs-ui/i18n/vi.json
resources/lib/oojs-ui/i18n/yue.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/images/icons/picture.png
resources/lib/oojs-ui/themes/apex/images/icons/picture.svg
resources/lib/oojs-ui/themes/apex/images/icons/table.png
resources/lib/oojs-ui/themes/apex/images/icons/table.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/table.svg
resources/src/jquery/jquery.autoEllipsis.js
resources/src/jquery/jquery.expandableField.js
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tablesorter.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.view.categoryPage.less
resources/src/mediawiki.api/mediawiki.ForeignApi.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.category.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.edit.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.login.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.options.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.parse.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.upload.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.watch.js [deleted file]
resources/src/mediawiki.language/languages/ru.js
resources/src/mediawiki.language/languages/uk.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.MessagePoster.js
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.WikitextMessagePoster.js
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js
resources/src/mediawiki.page/mediawiki.page.gallery.css [deleted file]
resources/src/mediawiki.page/mediawiki.page.gallery.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.gallery.print.css [deleted file]
resources/src/mediawiki.page/mediawiki.page.image.pagination.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.ready.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.startup.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.watch.ajax.js [deleted file]
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.toolbar/toolbar.js
resources/src/mediawiki.toolbar/toolbar.less
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less
resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css [deleted file]
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.js [deleted file]
resources/src/mediawiki/ForeignApi.js [new file with mode: 0644]
resources/src/mediawiki/api.js [new file with mode: 0644]
resources/src/mediawiki/api/category.js [new file with mode: 0644]
resources/src/mediawiki/api/edit.js [new file with mode: 0644]
resources/src/mediawiki/api/login.js [new file with mode: 0644]
resources/src/mediawiki/api/options.js [new file with mode: 0644]
resources/src/mediawiki/api/parse.js [new file with mode: 0644]
resources/src/mediawiki/api/upload.js [new file with mode: 0644]
resources/src/mediawiki/api/watch.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js [new file with mode: 0644]
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.htmlform.js
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.log.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/mediawiki.storage.js
resources/src/mediawiki/mediawiki.template.js
resources/src/mediawiki/page/gallery-print.css [new file with mode: 0644]
resources/src/mediawiki/page/gallery.css [new file with mode: 0644]
resources/src/mediawiki/page/gallery.js [new file with mode: 0644]
resources/src/mediawiki/page/image-pagination.js [new file with mode: 0644]
resources/src/mediawiki/page/patrol.js [new file with mode: 0644]
resources/src/mediawiki/page/ready.js [new file with mode: 0644]
resources/src/mediawiki/page/startup.js [new file with mode: 0644]
resources/src/mediawiki/page/watch.js [new file with mode: 0644]
tests/TestsAutoLoader.php
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/LessFileCompilationTest.php
tests/phpunit/MediaWikiPHPUnitTestListener.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/filecontentshasher/hash.svg [new file with mode: 0644]
tests/phpunit/data/filecontentshasher/primes.txt [new file with mode: 0644]
tests/phpunit/includes/ConsecutiveParametersMatcher.php [deleted file]
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/FallbackTest.php
tests/phpunit/includes/FauxResponseTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HtmlFormatterTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/ImportTest.php
tests/phpunit/includes/LinkFilterTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TitleArrayFromResultTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/UserArrayFromResultTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WikiMapTest.php
tests/phpunit/includes/WikiReferenceTest.php
tests/phpunit/includes/actions/ActionTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiContinuationManagerTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiModuleManagerTest.php
tests/phpunit/includes/api/ApiResultTest.php
tests/phpunit/includes/api/ApiRevisionDeleteTest.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/api/format/ApiFormatDbgTest.php
tests/phpunit/includes/api/format/ApiFormatJsonTest.php
tests/phpunit/includes/api/format/ApiFormatNoneTest.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/api/format/ApiFormatTxtTest.php
tests/phpunit/includes/api/format/ApiFormatXmlTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/api/query/ApiQueryTestBase.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/changes/CategoryMembershipChangeTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php
tests/phpunit/includes/content/CssContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentHandlerTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/debug/logger/monolog/AvroFormatterTest.php
tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
tests/phpunit/includes/debug/logger/monolog/LineFormatterTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filebackend/SwiftFileBackendTest.php
tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php
tests/phpunit/includes/libs/RunningStatTest.php
tests/phpunit/includes/libs/XmlTypeCheckTest.php
tests/phpunit/includes/libs/composer/ComposerLockTest.php
tests/phpunit/includes/logging/LogFormatterTest.php
tests/phpunit/includes/logging/LogFormatterTestCase.php
tests/phpunit/includes/logging/ProtectLogFormatterTest.php
tests/phpunit/includes/mail/MailAddressTest.php
tests/phpunit/includes/media/DjVuTest.php
tests/phpunit/includes/media/ExifBitmapTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/GIFTest.php
tests/phpunit/includes/media/PNGTest.php
tests/phpunit/includes/media/WebPTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.php
tests/phpunit/includes/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/page/WikiPageTest.php
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/MediaWikiParserTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/password/BcryptPasswordTest.php
tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php
tests/phpunit/includes/password/UserPasswordPolicyTest.php
tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php [new file with mode: 0644]
tests/phpunit/includes/phpunit/LICENSE [new file with mode: 0644]
tests/phpunit/includes/phpunit/README [new file with mode: 0644]
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/site/SiteTest.php
tests/phpunit/includes/site/TestSites.php
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/utils/AvroValidatorTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php
tests/phpunit/includes/utils/FileContentsHasherTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/MWCryptHKDFTest.php
tests/phpunit/includes/utils/MWCryptHashTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageRuTest.php
tests/phpunit/languages/classes/LanguageSrTest.php
tests/phpunit/languages/classes/LanguageUkTest.php
tests/phpunit/languages/classes/LanguageUzTest.php
tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php [deleted file]
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/phpunit.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/suite.xml
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/testHelpers.inc
thumb.php

diff --git a/.jscsrc b/.jscsrc
index aaa876c..c1fbc9a 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -7,6 +7,9 @@
        "disallowQuotedKeysInObjects": "allButReserved",
        "requireDotNotation": { "allExcept": [ "keywords" ] },
        "jsDoc": {
+               "checkParamNames": true,
+               "checkRedundantReturns": true,
+               "checkTypes": "strictNativeCase",
                "requireNewlineAfterDescription": true,
                "requireParamTypes": true,
                "requireReturnTypes": true
index 12ff31d..5c82af8 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -7,14 +7,25 @@ addshore <addshorewiki@gmail.com>
 Adrian Heine <adrian.heine@wikimedia.de>
 Alex Monk <krenair@gmail.com>
 Alex Monk <krenair@gmail.com> <krenair@wikimedia.org>
+Alex Z <mrzmanwiki@gmail.com> <mrzman@users.mediawiki.org>
 Alexander Emsenhuber <ialex.wiki@gmail.com>
 Alexander Emsenhuber <ialex.wiki@gmail.com> <ialex@users.mediawiki.org>
 Alexander Emsenhuber <ialex.wiki@gmail.com> <mediawiki@emsenhuber.ch>
 Alexia E. Smith <washuu@gmail.com>
 Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
+Amir E. Aharoni <amir.aharoni@mail.huji.ac.il> <amire80@users.mediawiki.org>
+Anders Wegge Jakobsen <awegge@gmail.com> <wegge@users.mediawiki.org>
+Andre Engels <andreengels@gmail.com> <a_engels@users.mediawiki.org>
+Andrew Garrett <agarrett@wikimedia.org> <werdna@users.mediawiki.org>
+Angela Beesley Starling <wiki@nge.la> <angelab@users.mediawiki.org>
 Antoine Musso <hashar@free.fr>
 Antoine Musso <hashar@free.fr> <hashar@users.mediawiki.org>
+Aran Dunkley <aran@organicdesign.co.nz> <nad@users.mediawiki.org>
+Ariel Glenn <ariel@wikimedia.org> <ariel@users.mediawiki.org>
 Arlo Breault <abreault@wikimedia.org>
+Arthur Richards <arichards@wikimedia.org> <awjrichards@users.mediawiki.org>
+Aryeh Gregor <simetrical+mw@gmail.com> <simetrical@users.mediawiki.org>
+Asher Feldman <afeldman@wikimedia.org> <asher@users.mediawiki.org>
 aude <aude.wiki@gmail.com>
 Audrey Tang <audreyt@audreyt.org>
 Audrey Tang <audreyt@audreyt.org> <au@localhost>
@@ -23,37 +34,56 @@ Bahodir Mansurov <bmansurov@wikimedia.org>
 Bartosz Dziewoński <matma.rex@gmail.com>
 Bartosz Dziewoński <matma.rex@gmail.com> <matmarex@wikimedia.org>
 Bartosz Dziewoński <matma.rex@gmail.com> <bdziewonski@wikimedia.org>
+Ben Hartshorne <bhartshorne@wikimedia.org> <ben@users.mediawiki.org>
 Bene <benestar.wikimedia@gmail.com>
+Benjamin Lees <emufarmers@gmail.com> <emufarmers@users.mediawiki.org>
+Benny Situ <bsitu@wikimedia.org> <bsitu@users.mediawiki.org>
+Bertrand Grondin <bertrand.grondin@tiscali.fr> <grondin@users.mediawiki.org>
 Brad Jorsch <bjorsch@wikimedia.org>
+Brandon Harris <bharris@wikimedia.org> <bharris@users.mediawiki.org>
+Brian Wolff <bawolff+svn@gmail.com> <bawolff@users.mediawiki.org>
 Brian Wolff <bawolff+wn@gmail.com>
 Brion Vibber <brion@wikimedia.org>
 Brion Vibber <brion@wikimedia.org> <brion@pobox.com>
 Brion Vibber <brion@wikimedia.org> <brion@users.mediawiki.org>
 Bryan Davis <bd808@wikimedia.org>
+Bryan Tong Minh <bryan.tongminh@gmail.com> <btongminh@users.mediawiki.org>
 C. Scott Ananian <cscott@cscott.net>
 C. Scott Ananian <cscott@cscott.net> <cananian@wikimedia.org>
 cacycle@gerrit.wikimedia.org <cacyclewp@gmail.com>
 cenarium <cenarium.sysop@gmail.com>
 Chad Horohoe <chadh@wikimedia.org>
+Chad Horohoe <chadh@wikimedia.org> <demon@users.mediawiki.org>
+Charles Melbye <charlie@yourwiki.net> <charlie@users.mediawiki.org>
 Chiefwei <chiefwei1989@gmail.com>
 Chris McMahon <cmcmahon@wikimedia.org>
 Chris Steipp <csteipp@wikimedia.org>
+Christian Aistleitner <christian@quelltextlich.at> <qchris@users.mediawiki.org>
 Christian Aistleitner <christian@quelltextlich.at>
 Christian Williams <orbit@framezero.com>
 Christian Williams <orbit@framezero.com> <christian@localhost>
 Christian Williams <orbit@framezero.com> <christian@wikia-inc.com>
 ckoerner <nobelx@gmail.com>
+Conrad Irwin <conrad.irwin+wiki@gmail.com> <conrad@users.mediawiki.org>
 Dan Duvall <dduvall@wikimedia.org>
 dan-nl <d_entous@yahoo.com>
-Daniel Kinzler <daniel.kinzler@wikimedia.de>
 Daniel A. R. Werner <daniel.a.r.werner@gmail.com>
+Daniel Cannon <cannon.danielc@gmail.com> <amidaniel@users.mediawiki.org>
+Daniel Friesen <mediawiki@danielfriesen.name> <dantman@users.mediawiki.org>
+Daniel Kinzler <daniel.kinzler@wikimedia.de>
+Daniel Kinzler <daniel.kinzler@wikimedia.de> <daniel@users.mediawiki.org>
+Danny B <Wikipedia.Danny.B@email.cz> <danny_b@users.mediawiki.org>
 David Chan <david@sheetmusic.org.uk>
+Derk-Jan Hartman <hartman@videolan.org> <hartman@users.mediawiki.org>
 Derk-Jan Hartman <hartman.wiki@gmail.com>
+Diederik van Liere <dvanliere@gmail.com> <diederik@users.mediawiki.org>
+Domas Mituzas <domas.mituzas@gmail.com> <midom@users.mediawiki.org>
 Douglas Gardner <douglas@chippy.ch>
 DPStokesNZ <duncan.stokes@gmail.com>
 Ebrahim Byagowi <ebrahim@gnu.org>
 Ed Sanders <esanders@wikimedia.org>
 Elliott Eggleston <ejegg@ejegg.com>
+Emmanuel Engelhart <kelson@kiwix.org> <kelson42@users.mediawiki.org>
 eranroz <eranroz89@gmail.com>
 Erik Bernhardson <ebernhardson@wikimedia.org>
 Erik Moeller <erik@wikimedia.org>
@@ -61,8 +91,11 @@ Erik Moeller <erik@wikimedia.org> <erik@users.mediawiki.org>
 Erwin Dokter <erwin@darcoury.nl>
 Evan McIntire <mcintire.evan@gmail.com>
 Federico Leva <federicoleva@tiscali.it>
-Florianschmidtwelzow <florian.schmidt.welzow@t-online.de>
+Fenzik Joseph <fenzik@gmail.com> <fenzik@users.mediawiki.org>
+Florianschmidtwelzow <florian.schmidt.welzow@t-online.de> <florian.schmidt.stargatewissen@gmail.com>
+Florianschmidtwelzow <florian.schmidt.welzow@t-online.de> Florian <florian.schmidt.welzow@t-online.de>
 Fomafix <fomafix@googlemail.com>
+Fran Rogers <fran@dumetella.net> <krimpet@users.mediawiki.org>
 FunPika <funpikawiki@gmail.com>
 Gabriel Wicke <gwicke@wikimedia.org>
 Gabriel Wicke <gwicke@wikimedia.org> <gwicke@users.mediawiki.org>
@@ -74,111 +107,183 @@ Giftpflanze <gifti@tools.wmflabs.org>
 Gilles Dubuc <gdubuc@wikimedia.org>
 gladoscc <admin@glados.cc>
 glaisher <glaisher.wiki@gmail.com>
+Greg Sabino Mullane <greg@turnstep.com>
+Greg Sabino Mullane <greg@turnstep.com> <greg@endpoint.com>
+Greg Sabino Mullane <greg@turnstep.com> <greg@users.mediawiki.org>
+Guy Van den Broeck <guyvdb@gmail.com> <guyvdb@users.mediawiki.org>
+Happy-melon <happy-melon@live.com> <happy-melon@users.mediawiki.org>
 Helder <he7d3r@gmail.com>
 Helder <he7d3r@gmail.com> <helder.wiki@gmail.com>
 Hoo man <hoo@online.de>
+Huji <huji.huji@gmail.com> <huji@users.mediawiki.org>
+Ian Baker <ibaker@wikimedia.org> <raindrift@users.mediawiki.org>
+Ilmari Karonen <nospam@vyznev.net> <vyznev@users.mediawiki.org>
 Inez Korczyński <inez@wikia-inc.com>
 Inez Korczyński <inez@wikia-inc.com> <inez@users.mediawiki.org>
 isarra <s@zaori.org>
+Ivan Lanin <ivanlanin@gmail.com> <ivanlanin@users.mediawiki.org>
+Jack Phoenix <jack@countervandalism.net> <ashley@users.mediawiki.org>
 Jack Phoenix <jack@countervandalism.net>
 Jackmcbarn <jackmcbarn@gmail.com>
 Jackmcbarn <jackmcbarn@users.noreply.github.com>
 jagori <jagori79@gmail.com>
 James D. Forrester <jforrester@wikimedia.org>
+Jan Gerber <j@thing.net> <j@users.mediawiki.org>
+Jan Luca Naumann <jan@jans-seite.de> <jan@users.mediawiki.org>
+Jan Paul Posma <jp.posma@gmail.com> <janpaul123@users.mediawiki.org>
 Jan Zerebecki <jan.wikimedia@zerebecki.de>
 Jaroslav Škarvada <jskarvad@redhat.com>
 jarrettmunton <jmuntjmunt@gmail.com>
+Jason Richey <jasonr@wikia.com> <jasonr@users.mediawiki.org>
 Jeff Hall <jeffreyehall@gmail.com>
 Jeff Hall <jeffreyehall@gmail.com> <jhall@wikimedia.org>
 Jeff Janes <jeff.janes@gmail.com>
-jeroendedauw <jeroendedauw@gmail.com>
+Jeremy Postlethwaite <jpostlethwaite@wikimedia.org> <jpostlethwaite@users.mediawiki.org>
+Jeroen De Dauw <jeroendedauw@gmail.com>
+Jeroen De Dauw <jeroendedauw@gmail.com> <jeroendedauw@users.mediawiki.org>
 Jesús Martínez Novo <martineznovo@gmail.com>
 Jiabao <jiabao.foss@gmail.com>
+Jimmy Collins <jimmy.collins@web.de> <collinj@users.mediawiki.org>
+John Du Hart <john@compwhizii.net> <johnduhart@users.mediawiki.org>
+Jon Harald Søby <jhsoby@gmail.com> <jhsoby@users.mediawiki.org>
 Jon Robson <jrobson@wikimedia.org>
 Jon Robson <jrobson@wikimedia.org> <jdlrobson@gmail.com>
 Juliusz Gonera <jgonera@gmail.com>
 Juliusz Gonera <jgonera@gmail.com> <jgonera@wikimedia.org>
 JuneHyeon Bae <devunt@gmail.com>
+Jure Kajzer <freak@drajv.si> <freakolowsky@users.mediawiki.org>
+Katie Filbert <aude.wiki@gmail.com> <aude@users.mediawiki.org>
 Kevin Israel <pleasestand@live.com>
 Kunal Mehta <legoktm@gmail.com>
 Kunal Mehta <legoktm@gmail.com> <legoktm.wikipedia@gmail.com>
+Kwan Ting Chan <ktc@ktchan.info> <ktchan@users.mediawiki.org>
 lekshmi <andnlnbn18@gmail.com>
+Leo Koppelkamm <diebuche@gmail.com> <diebuche@users.mediawiki.org>
+Leon Weber <leon@vserver152.masterssystems.com> <leon@users.mediawiki.org>
+Leonardo Gregianin <leogregianin@googlemail.com> <leogregianin@users.mediawiki.org>
+Leons Petrazickis <leons.petrazickis.haveyouconsiderednotincludingthisphrase@gmail.com> <leonsp@users.mediawiki.org>
 Liangent <liangent@gmail.com>
+Lisa Ridley <lhridley@gmail.com> <lhridley@users.mediawiki.org>
 Ljudusika <plo2000@i.ua>
 Luis Felipe Schenone <schenonef@gmail.com>
 m4tx <m4tx@m4tx.pl>
+Magnus Manske <magnusmanske@googlemail.com> <magnusmanske@users.mediawiki.org>
+Manuel Schneider <manuel.schneider@wikimedia.ch> <80686@users.mediawiki.org>
+Marcin Cieślak <saper@saper.info> <saper@users.mediawiki.org>
 Marielle Volz <marielle.volz@gmail.com>
 Marius Hoch <hoo@online.de>
 Mark A. Hershberger <mah@everybody.org>
 Mark A. Hershberger <mah@everybody.org> <mah@nichework.com>
 Mark A. Hershberger <mah@everybody.org> <mah@users.mediawiki.org>
+Mark Clements <mediawiki@kennel17.co.uk> <happydog@users.mediawiki.org>
 Mark Holmquist <mtraceur@member.fsf.org>
 Marko Obrovac <mobrovac@wikimedia.org>
+Matt Johnston <mattj@emazestudios.com> <mattj@users.mediawiki.org>
+Matthew Britton <hugglegurch@gmail.com> <gurch@users.mediawiki.org>
 Matthew Flaschen <mflaschen@wikimedia.org>
 Matthias Mullie <git@mullie.eu>
+Matěj Grabovský <mgrabovsky@yahoo.com> <mgrabovsky@users.mediawiki.org>
 Max Semenik <maxsem.wiki@gmail.com>
+Max Semenik <maxsem.wiki@gmail.com> <maxsem@users.mediawiki.org>
 mgooley <g0013y@gmail.com>
+Michael Dale <mdale@wikimedia.org> <dale@users.mediawiki.org>
 mjbmr <mjbmri@gmail.com>
+Mohamed Magdy <mohamedmk@gmail.com> <alnokta@users.mediawiki.org>
 Moriel Schottlender <mschottlender@wikimedia.org>
 Moriel Schottlender <mschottlender@wikimedia.org> <moriel@gmail.com>
 Mormegil <mormegil@centrum.cz>
 Mukunda Modell <mmodell@wikimedia.org>
 MZMcBride <g@mzmcbride.com>
+nadeesha <nadeesha@calcey.com> <nadeesha@users.mediawiki.org>
 Namit <namit.ohri@gmail.com>
+Nathaniel Herman <redwwjd@yahoo.com> <pinky@users.mediawiki.org>
+Neil Kandalgaonkar <neilk@wikimedia.org> <neilk@users.mediawiki.org>
 Nemo bis <federicoleva@tiscali.it>
+Nephele <nephele@skyhighway.com> <nephele@users.mediawiki.org>
+Nick Jenkins <nickpj@gmail.com> <nickj@users.mediawiki.org>
 Nik Everett <neverett@wikimedia.org>
 Niklas Laxström <niklas.laxstrom@gmail.com>
+Niklas Laxström <niklas.laxstrom@gmail.com> <nikerabbit@users.mediawiki.org>
+Nimish Gautam <nimishg@wikimedia.org> <nimishg@users.mediawiki.org>
 Nuria Ruiz <nuria@wikimedia.org>
 Ori.livneh <ori@wikimedia.org>
+OverlordQ <wikipedia@thedarkcitadel.com> <overlordq@users.mediawiki.org>
 paladox <thomasmulhall410@yahoo.com>
+Patrick Reilly <preilly@wikimedia.org> <preilly@users.mediawiki.org>
 Patrick Westerhoff <PatrickWesterhoff@gmail.com>
+Paul Copperman <paul.copperman@gmail.com> <pcopp@users.mediawiki.org>
 Peter Coti <petercoti@gmail.com>
+Peter Potrowl <peter017@gmail.com> <peter17@users.mediawiki.org>
 Petr Kadlec <mormegil@centrum.cz>
+Philip Tzou <philip.npc@gmail.com> <philip@users.mediawiki.org>
 physikerwelt (Moritz Schubotz) <wiki@physikerwelt.de>
 PiRSquared17 <pirsquared@tools.wmflabs.org>
+Platonides <platonides@gmail.com> <platonides@users.mediawiki.org>
 PranavK <pranavmk98@gmail.com>
 Prateek Saxena <psaxena@wikimedia.org>
 Prateek Saxena <psaxena@wikimedia.org> <prtksxna@gmail.com>
-Purodha <purodha@blissenbach.org>
+Priyanka Dhanda <pdhanda@wikimedia.org> <pdhanda@users.mediawiki.org>
+Purodha B Blissenbach <purodha@blissenbach.org>
+Purodha B Blissenbach <purodha@blissenbach.org> <purodha@users.mediawiki.org>
+Purodha B Blissenbach <purodha@blissenbach.org> <publi@web.de>
 Raimond Spekking <raimond.spekking@gmail.com>
 Raimond Spekking <raimond.spekking@gmail.com> <raymond@users.mediawiki.org>
+Remember the dot <rememberthedot@gmail.com> <rememberthedot@users.mediawiki.org>
 Reza <reza.energy@gmail.com>
 Ricordisamoa <ricordisamoa@openmailbox.org>
 rillke <rillke@wikipedia.de>
 rillke <rillke@wikipedia.de> <rainerrillke@hotmail.com>
+River Tarnell <river@wikimedia.org> <river@users.mediawiki.org>
+River Tarnell <river@wikimedia.org> <kateturner@users.mediawiki.org>
 Roan Kattouw <roan.kattouw@gmail.com>
 Roan Kattouw <roan.kattouw@gmail.com> <catrope@users.mediawiki.org>
 Roan Kattouw <roan.kattouw@gmail.com> <roan@wikimedia.org>
+Rob Church <robchur@gmail.com> <robchurch@users.mediawiki.org>
+Rob Lanphier <robla@robla.net> <robla@users.mediawiki.org>
 Rob Moen <rmoen@mediawiki.org>
 Rob Moen <rmoen@mediawiki.org> <rmoen@users.mediawiki.org>
 Rob Moen <rmoen@mediawiki.org> <rmoen@wikimedia.org>
 Robert Hoenig <indielives010@gmail.com>
+Robert Leverington <robert@rhl.me.uk> <roberthl@users.mediawiki.org>
+Robert Rohde <rarohde@gmail.com> <rarohde@users.mediawiki.org>
+Robert Stojnić <rainmansr@gmail.com> <rainman@users.mediawiki.org>
+Robin Pepermans <robinp.1273@gmail.com> <robin@users.mediawiki.org>
 robinhood701 <robinhood70@live.ca>
 Rohan <rohan1395@yahoo.com>
+Rotem Liss <rotemliss@gmail.com> <rotem@users.mediawiki.org>
 Rummana Yasmeen <ryasmeen@wikimedia.org>
+Russ Nelson <russnelson@gmail.com> <nelson@users.mediawiki.org>
+Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@users.mediawiki.org>
 Ryan Kaldari <rkaldari@wikimedia.org>
 Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@gmail.com>
+Ryan Lane <rlane32@gmail.com> <laner@users.mediawiki.org>
+Ryan Schmidt <skizzerz@gmail.com> <skizzerz@users.mediawiki.org>
 S Page <spage@wikimedia.org>
 Sam Reed <reedy@wikimedia.org>
 Sam Reed <reedy@wikimedia.org> <reedy@users.mediawiki.org>
 Sam Smith <git@samsmith.io>
+Santhosh Thottingal <santhosh.thottingal@gmail.com> <santhosh@users.mediawiki.org>
 Santhosh Thottingal <santhosh.thottingal@gmail.com>
 saper <saper@saper.info>
 Schnark <listenleser@gmail.com>
 Scimonster <tehalmightyscimonster@gmail.com>
+Sean Colombo <sean.colombo@gmail.com> <sean_colombo@users.mediawiki.org>
 Sean Pringle <springle@wikimedia.org>
 Seb35 <seb35wikipedia@gmail.com>
 Sergio Santoro <santoro.srg@gmail.com>
 Shahyar <shahyar@gmail.com>
+Shinjiman <shinjiman@gmail.com> <shinjiman@users.mediawiki.org>
 Siebrand Mazeland <s.mazeland@xs4all.nl>
 Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@kitano.nl>
 Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@users.mediawiki.org>
 Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@wikimedia.org>
 Southparkfan <southparkfan223@hotmail.com>
+SQL <sxwiki@gmail.com> <sql@users.mediawiki.org>
 Stanislav Malyshev <smalyshev@gmail.com>
 Stephan Gambke <s7eph4n@gmail.com>
 Stephane Bisson <sbisson@wikimedia.org>
 Stephen Liang <github@stephenliang.pw>
+Steve Sanbeg <ffnaort@jro.qr> <sanbeg@users.mediawiki.org>
 Steven Roddis <StevenRoddis@users.noreply.github.com>
 Subramanya Sastry <ssastry@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
@@ -188,12 +293,20 @@ TheDJ <hartman.wiki@gmail.com>
 Thiemo Mättig (WMDE) <thiemo.maettig@wikimedia.de>
 This, that and the other <at.light@live.com.au>
 tholam <t.lam@lamsinfosystem.com>
+Thomas Bleher <ThomasBleher@gmx.de> <tbleher@users.mediawiki.org>
+Thomas Dalton <thomas.dalton@gmail.com> <tango@users.mediawiki.org>
+Thomas Gries <mail@tgries.de> <wikinaut@users.mediawiki.org>
 Tim Landscheidt <tim@tim-landscheidt.de>
+Tim Laqua <t.laqua@gmail.com> <tlaqua@users.mediawiki.org>
 Tim Starling <tstarling@wikimedia.org>
+Tim Starling <tstarling@wikimedia.org> <tstarling@users.mediawiki.org>
 Timo Tijhof <krinklemail@gmail.com>
+Timo Tijhof <krinklemail@gmail.com> <krinkle@users.mediawiki.org>
 Timo Tijhof <krinklemail@gmail.com> <timo@wikimedia.org>
 Timo Tijhof <krinklemail@gmail.com> <ttijhof@wikimedia.org>
 Tina Johnson <tinajohnson.1234@gmail.com>
+Tom Maaswinkel <tom.maaswinkel@12wiki.eu> <thedevilonline@users.mediawiki.org>
+Tomasz Finc <tfinc@wikimedia.org> <tomasz@users.mediawiki.org>
 Tony Thomas <01tonythomas@gmail.com>
 Trevor Parscal <trevorparscal@gmail.com>
 Trevor Parscal <trevorparscal@gmail.com> <tparscal@users.mediawiki.org>
@@ -201,13 +314,20 @@ Trevor Parscal <trevorparscal@gmail.com> <tparscal@wikimedia.org>
 Tyler Cipriani <tcipriani@wikimedia.org>
 Tyler Romeo <tylerromeo@gmail.com>
 umherirrender <umherirrender_de.wp@web.de>
+Victor Vasiliev <vasilvv@mit.edu> <vasilievvv@users.mediawiki.org>
 Vikas S Yaligar <vikasyaligar.it@gmail.com>
 Vivek Ghaisas <v.a.ghaisas@gmail.com>
 wctaiwan <wctaiwan@gmail.com>
 withoutaname <drevitchi@gmail.com>
+X! <soxred93@gmail.com> <soxred93@users.mediawiki.org>
 Yaroslav Melnychuk <yaroslavmelnuchuk@gmail.com>
 Yuri Astrakhan <yurik@wikimedia.org>
+Yuri Astrakhan <yurik@wikimedia.org> <yurik@users.mediawiki.org>
 Yusuke Matsubara <whym@whym.org>
 YuviPanda <yuvipanda@gmail.com>
+Zak Greant <zak+mediawiki@fooassociates.com> <zak@users.mediawiki.org>
+Ævar Arnfjörð Bjarmason <avarab@gmail.com> <avar@users.mediawiki.org>
 Željko Filipin <zeljko.filipin@gmail.com>
 Željko Filipin <zeljko.filipin@gmail.com> <zfilipin@wikimedia.org>
+Zhengzhu Feng <zhengzhu@gmail.com>
+Zhengzhu Feng <zhengzhu@gmail.com> <zhengzhu@users.mediawiki.org>
index 8ba46b5..2d07596 100644 (file)
@@ -24,16 +24,13 @@ services:
   - mysql
 
 branches:
-  # Test changes in master, in Wikimedia's production and in arbitrary
-  # Travis CI branches.  The latter allows developers to enable Travis
-  # CI in their GitHub fork of wikimedia/mediawiki and then push
-  # changes they like to test to branches like
-  # "travis-ci/test-this-awesome-change" without having to mess up the
-  # master and wmf/* branches and their defined meaning.
+  # Test changes in master and arbitrary Travis CI branches only.
+  # The latter allows developers to enable Travis CI in their GitHub fork of
+  # wikimedia/mediawiki and then push changes they like to test to branches like
+  # "travis-ci/test-this-awesome-change".
   only:
     - master
     - /^travis-ci\/.*$/
-    - /^wmf\/.*$/
 
 before_install:
   - sudo apt-get install -qq djvulibre-bin tidy
diff --git a/CREDITS b/CREDITS
index 44adc4f..76d2107 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,6 +1,6 @@
 {{int:version-credits-summary}}
 <!--
-MediaWiki 1.26 is a collaborative project released under the
+MediaWiki 1.27 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 -->
diff --git a/HISTORY b/HISTORY
index 07f0fac..0c2b8ac 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,4 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.26.
+Change notes from older releases. For current info see RELEASE-NOTES-1.27.
 
 == MediaWiki 1.25 ==
 
index 47c751e..efca318 100644 (file)
@@ -41,6 +41,10 @@ production.
 * 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.
@@ -70,6 +74,9 @@ production.
 * 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
@@ -84,14 +91,33 @@ production.
   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.
-
-==== External libraries ====
-* Update es5-shim from v4.0.0 to v4.1.5.
-* Update json2 from revision 2014-02-04 to 2015-05-03.
-* Update Sinon.JS from 1.10.3 to 1.15.4.
-* Upgrade jQuery Client from v1.0.0 to v2.0.0.
-* Added mediawiki/at-ease 1.0.0.
-* Update QUnit from v1.17.1 to v1.18.0.
+* 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.
+
+== 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
@@ -125,6 +151,7 @@ production.
 * 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
@@ -145,6 +172,8 @@ changes to languages because of Phabricator reports.
 ** 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
@@ -198,9 +227,21 @@ changes to languages because of Phabricator reports.
 * 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 ==
 
diff --git a/RELEASE-NOTES-1.27 b/RELEASE-NOTES-1.27
new file mode 100644 (file)
index 0000000..65e0799
--- /dev/null
@@ -0,0 +1,107 @@
+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.27 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.27 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.27 ===
+* Removed $wgUseLinkNamespaceDBFields
+* Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and
+  $wgResourceLoaderMinifierMaxLineLength, because there was little value in
+  making the behavior configurable. The default values (`false` for the former,
+  1000 for the latter) are now hard-coded.
+* $wgDebugDumpSqlLength was removed (deprecated in 1.24).
+* $wgDebugDBTransactions was removed (deprecated in 1.20).
+
+=== New features in 1.27 ===
+* $wgDataCenterId and $wgDataCenterRoles where added, which will serve as
+  basic configuration settings needed for multi-datacenter setups.
+  $wgDataCenterUpdateStickTTL was also added.
+
+==== External libraries ====
+
+=== Bug fixes in 1.27 ===
+
+=== Action API changes in 1.27 ===
+
+=== Action API internal changes in 1.27 ===
+
+=== 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.
+
+
+=== Other changes in 1.27 ===
+
+
+== Compatibility ==
+
+MediaWiki 1.27 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.27 has several database changes since 1.26, 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.26.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.
diff --git a/UPGRADE b/UPGRADE
index 1ff98cd..088701a 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -5,7 +5,7 @@ specific problems, check
 * the documentation at https://www.mediawiki.org
 * the mediawiki-l mailing list archive at
   http://lists.wikimedia.org/pipermail/mediawiki-l/
-* the bug tracker at https://bugzilla.wikimedia.org
+* the bug tracker at https://phabricator.wikimedia.org
 
 for information and workarounds to common issues.
 
index bdcbe5a..6820fc7 100644 (file)
@@ -184,13 +184,6 @@ $wgAutoloadLocalClasses = array(
        'BmpHandler' => __DIR__ . '/includes/media/BMP.php',
        'BrokenRedirectsPage' => __DIR__ . '/includes/specials/SpecialBrokenRedirects.php',
        'BufferingStatsdDataFactory' => __DIR__ . '/includes/libs/BufferingStatsdDataFactory.php',
-       'CLDRPluralRuleConverter' => __DIR__ . '/languages/utils/CLDRPluralRuleConverter.php',
-       'CLDRPluralRuleConverterExpression' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterExpression.php',
-       'CLDRPluralRuleConverterFragment' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterFragment.php',
-       'CLDRPluralRuleConverterOperator' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterOperator.php',
-       'CLDRPluralRuleError' => __DIR__ . '/languages/utils/CLDRPluralRuleError.php',
-       'CLDRPluralRuleEvaluator' => __DIR__ . '/languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleEvaluatorRange' => __DIR__ . '/languages/utils/CLDRPluralRuleEvaluatorRange.php',
        'CLIParser' => __DIR__ . '/maintenance/parse.php',
        'CSSMin' => __DIR__ . '/includes/libs/CSSMin.php',
        'CacheDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
@@ -201,6 +194,7 @@ $wgAutoloadLocalClasses = array(
        'CapsCleanup' => __DIR__ . '/maintenance/cleanupCaps.php',
        'Category' => __DIR__ . '/includes/Category.php',
        'CategoryFinder' => __DIR__ . '/includes/CategoryFinder.php',
+       'CategoryMembershipChange' => __DIR__ . '/includes/changes/CategoryMembershipChange.php',
        'CategoryPage' => __DIR__ . '/includes/page/CategoryPage.php',
        'CategoryPager' => __DIR__ . '/includes/specials/SpecialCategories.php',
        'CategoryViewer' => __DIR__ . '/includes/CategoryViewer.php',
@@ -283,7 +277,7 @@ $wgAutoloadLocalClasses = array(
        'CsvStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
        'CurlHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
        'DBAccessBase' => __DIR__ . '/includes/dao/DBAccessBase.php',
-       'DBAccessError' => __DIR__ . '/includes/db/LBFactory.php',
+       'DBAccessError' => __DIR__ . '/includes/db/loadbalancer/LBFactory.php',
        'DBAccessObjectUtils' => __DIR__ . '/includes/dao/DBAccessObjectUtils.php',
        'DBConnRef' => __DIR__ . '/includes/db/DBConnRef.php',
        'DBConnectionError' => __DIR__ . '/includes/db/DatabaseError.php',
@@ -296,6 +290,7 @@ $wgAutoloadLocalClasses = array(
        'DBSiteStore' => __DIR__ . '/includes/site/DBSiteStore.php',
        'DBUnexpectedError' => __DIR__ . '/includes/db/DatabaseError.php',
        'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
+       'Database' => __DIR__ . '/includes/db/Database.php',
        'DatabaseBase' => __DIR__ . '/includes/db/Database.php',
        'DatabaseInstaller' => __DIR__ . '/includes/installer/DatabaseInstaller.php',
        'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
@@ -321,6 +316,7 @@ $wgAutoloadLocalClasses = array(
        'DeleteDefaultMessages' => __DIR__ . '/maintenance/deleteDefaultMessages.php',
        'DeleteEqualMessages' => __DIR__ . '/maintenance/deleteEqualMessages.php',
        'DeleteFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'DeleteLinksJob' => __DIR__ . '/includes/jobqueue/jobs/DeleteLinksJob.php',
        'DeleteLogFormatter' => __DIR__ . '/includes/logging/DeleteLogFormatter.php',
        'DeleteOldRevisions' => __DIR__ . '/maintenance/deleteOldRevisions.php',
        'DeleteOrphanedRevisions' => __DIR__ . '/maintenance/deleteOrphanedRevisions.php',
@@ -384,6 +380,7 @@ $wgAutoloadLocalClasses = array(
        'EnhancedChangesList' => __DIR__ . '/includes/changes/EnhancedChangesList.php',
        'EnotifNotifyJob' => __DIR__ . '/includes/jobqueue/jobs/EnotifNotifyJob.php',
        'EnqueueJob' => __DIR__ . '/includes/jobqueue/jobs/EnqueueJob.php',
+       'EnqueueableDataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
        'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
        'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
@@ -436,6 +433,7 @@ $wgAutoloadLocalClasses = array(
        'FileBackendStoreShardListIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
        'FileBasedSiteLookup' => __DIR__ . '/includes/site/FileBasedSiteLookup.php',
        'FileCacheBase' => __DIR__ . '/includes/cache/FileCacheBase.php',
+       'FileContentsHasher' => __DIR__ . '/includes/utils/FileContentsHasher.php',
        'FileDeleteForm' => __DIR__ . '/includes/FileDeleteForm.php',
        'FileDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
        'FileDuplicateSearchPage' => __DIR__ . '/includes/specials/SpecialFileDuplicateSearch.php',
@@ -609,11 +607,11 @@ $wgAutoloadLocalClasses = array(
        'JsonContentHandler' => __DIR__ . '/includes/content/JsonContentHandler.php',
        'KkConverter' => __DIR__ . '/languages/classes/LanguageKk.php',
        'KuConverter' => __DIR__ . '/languages/classes/LanguageKu.php',
-       'LBFactory' => __DIR__ . '/includes/db/LBFactory.php',
-       'LBFactoryFake' => __DIR__ . '/includes/db/LBFactory.php',
-       'LBFactoryMulti' => __DIR__ . '/includes/db/LBFactoryMulti.php',
-       'LBFactorySimple' => __DIR__ . '/includes/db/LBFactory.php',
-       'LBFactorySingle' => __DIR__ . '/includes/db/LBFactorySingle.php',
+       'LBFactory' => __DIR__ . '/includes/db/loadbalancer/LBFactory.php',
+       'LBFactoryFake' => __DIR__ . '/includes/db/loadbalancer/LBFactoryFake.php',
+       'LBFactoryMulti' => __DIR__ . '/includes/db/loadbalancer/LBFactoryMulti.php',
+       'LBFactorySimple' => __DIR__ . '/includes/db/loadbalancer/LBFactorySimple.php',
+       'LBFactorySingle' => __DIR__ . '/includes/db/loadbalancer/LBFactorySingle.php',
        'LCStore' => __DIR__ . '/includes/cache/LocalisationCache.php',
        'LCStoreCDB' => __DIR__ . '/includes/cache/LocalisationCache.php',
        'LCStoreDB' => __DIR__ . '/includes/cache/LocalisationCache.php',
@@ -679,16 +677,16 @@ $wgAutoloadLocalClasses = array(
        'LinkHolderArray' => __DIR__ . '/includes/parser/LinkHolderArray.php',
        'LinkSearchPage' => __DIR__ . '/includes/specials/SpecialLinkSearch.php',
        'Linker' => __DIR__ . '/includes/Linker.php',
-       'LinksDeletionUpdate' => __DIR__ . '/includes/deferred/LinksUpdate.php',
+       'LinksDeletionUpdate' => __DIR__ . '/includes/deferred/LinksDeletionUpdate.php',
        'LinksUpdate' => __DIR__ . '/includes/deferred/LinksUpdate.php',
        'ListDuplicatedFilesPage' => __DIR__ . '/includes/specials/SpecialListDuplicatedFiles.php',
        'ListVariants' => __DIR__ . '/maintenance/language/listVariants.php',
        'ListredirectsPage' => __DIR__ . '/includes/specials/SpecialListredirects.php',
-       'LoadBalancer' => __DIR__ . '/includes/db/LoadBalancer.php',
-       'LoadBalancerSingle' => __DIR__ . '/includes/db/LBFactorySingle.php',
-       'LoadMonitor' => __DIR__ . '/includes/db/LoadMonitor.php',
-       'LoadMonitorMySQL' => __DIR__ . '/includes/db/LoadMonitorMySQL.php',
-       'LoadMonitorNull' => __DIR__ . '/includes/db/LoadMonitor.php',
+       'LoadBalancer' => __DIR__ . '/includes/db/loadbalancer/LoadBalancer.php',
+       'LoadBalancerSingle' => __DIR__ . '/includes/db/loadbalancer/LBFactorySingle.php',
+       'LoadMonitor' => __DIR__ . '/includes/db/loadbalancer/LoadMonitor.php',
+       'LoadMonitorMySQL' => __DIR__ . '/includes/db/loadbalancer/LoadMonitorMySQL.php',
+       'LoadMonitorNull' => __DIR__ . '/includes/db/loadbalancer/LoadMonitor.php',
        'LocalFile' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileDeleteBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileMoveBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
@@ -713,6 +711,7 @@ $wgAutoloadLocalClasses = array(
        'MWCallableUpdate' => __DIR__ . '/includes/deferred/CallableUpdate.php',
        'MWContentSerializationException' => __DIR__ . '/includes/content/ContentHandler.php',
        'MWCryptHKDF' => __DIR__ . '/includes/utils/MWCryptHKDF.php',
+       'MWCryptHash' => __DIR__ . '/includes/utils/MWCryptHash.php',
        'MWCryptRand' => __DIR__ . '/includes/utils/MWCryptRand.php',
        'MWDebug' => __DIR__ . '/includes/debug/MWDebug.php',
        'MWDocGen' => __DIR__ . '/maintenance/mwdocgen.php',
@@ -935,7 +934,6 @@ $wgAutoloadLocalClasses = array(
        'PostgresBlob' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'PostgresField' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
-       'PostgresTransactionState' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
        'Preferences' => __DIR__ . '/includes/Preferences.php',
        'PreferencesForm' => __DIR__ . '/includes/Preferences.php',
index cce664a..6f859bd 100644 (file)
                "wiki": "https://www.mediawiki.org/"
        },
        "require": {
-               "composer/semver": "0.1.0",
+               "composer/semver": "1.0.0",
                "cssjanus/cssjanus": "1.1.1",
                "ext-iconv": "*",
                "liuggio/statsd-php-client": "1.0.16",
-               "oyejorge/less.php": "1.7.0.5",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.12.8.1",
+               "oojs/oojs-ui": "0.12.10",
+               "oyejorge/less.php": "1.7.0.9",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/assert": "0.2.2",
                "wikimedia/cdb": "1.3.0",
+               "wikimedia/cldr-plural-rule-parser": "1.0.0",
                "wikimedia/composer-merge-plugin": "1.2.1",
                "wikimedia/ip-set": "1.0.1",
+               "wikimedia/relpath": "1.0.3",
                "wikimedia/utfnormal": "1.0.3",
                "wikimedia/wrappedstring": "2.0.0",
                "zordius/lightncandy": "0.21"
        "require-dev": {
                "jakub-onderka/php-parallel-lint": "0.9",
                "justinrainbow/json-schema": "~1.3",
+               "mediawiki/mediawiki-codesniffer": "0.4.0",
+               "monolog/monolog": "1.14.0",
+               "nmred/kafka-php": "0.1.4",
                "phpunit/phpunit": "3.7.37",
-               "mediawiki/mediawiki-codesniffer": "0.3.0"
+               "wikimedia/avro": "1.7.7"
        },
        "suggest": {
+               "ext-apc": "Local data and opcode cache",
                "ext-fileinfo": "Improved mime magic detection",
                "ext-intl": "ICU integration",
                "ext-mbstring": "Multibyte string support",
                "ext-wikidiff2": "Diff accelerator",
-               "ext-apc": "Local data and opcode cache",
                "monolog/monolog": "Flexible debug logging system",
                "nmred/kafka-php": "Send debug log events to kafka",
                "pear/mail": "Mail sending support",
        "scripts": {
                "lint": "parallel-lint --exclude vendor",
                "phpcs": "phpcs -p $PHPCS_ARGS",
+               "pre-install-cmd": "ComposerHookHandler::onPreInstall",
+               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
                "test": [
                        "composer lint",
                        "composer phpcs"
-               ],
-               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
-               "pre-install-cmd": "ComposerHookHandler::onPreInstall"
+               ]
        },
        "config": {
-               "prepend-autoloader": false,
-               "optimize-autoloader": true
+               "optimize-autoloader": true,
+               "prepend-autoloader": false
        },
        "extra": {
                "merge-plugin": {
index 0b9f249..2d268b8 100644 (file)
@@ -641,16 +641,14 @@ $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
-$protect: boolean whether this is a protect or an unprotect
+$protect: Set of restriction keys
 $reason: Reason for protect
-$moveonly: boolean whether this is for move only or not
 
 'ArticleProtectComplete': After an article is protected.
 $wikiPage: the WikiPage that was protected
 $user: the user who did the protection
-$protect: boolean whether it was a protect or an unprotect
+$protect: Set of restriction keys
 $reason: Reason for protect
-$moveonly: boolean whether it was for move only or not
 
 'ArticlePurge': Before executing "&action=purge".
 $wikiPage: WikiPage (object) to purge
@@ -1581,9 +1579,10 @@ $imagePage: ImagePage object ($this)
 &$html: HTML for the hook to add
 
 'ImagePageFileHistoryLine': Called when a file history line is constructed.
+$imagePage: ImagePage object ($this)
 $file: the file
-$line: the HTML of the history line
-$css: the line CSS class
+&$line: the HTML of the history line
+&$css: the line CSS class
 
 'ImagePageFindFile': Called when fetching the file associated with an image
 page.
@@ -1633,6 +1632,11 @@ Return false to stop further processing of the tag
 $reader: XMLReader object
 $revisionInfo: Array of information
 
+'ImportSources': Called when reading from the $wgImportSources configuration
+variable. Can be used to lazy-load the import sources list.
+&$importSources: The value of $wgImportSources. Modify as necessary. See the
+comment in DefaultSettings.php for the detail of how to structure this array.
+
 'InfoAction': When building information to display on the action=info page.
 $context: IContextSource object
 &$pageInfo: Array of information
@@ -2164,9 +2168,10 @@ $article: the article that the history is loading for
 $context: RequestContext object
 
 'PageHistoryLineEnding': Right before the end <li> is added to a history line.
-$row: the revision row for this line
-$s: the string representing this parsed line
-$classes: array containing the <li> element classes
+$historyAction: the action object
+&$row: the revision row for this line
+&$s: the string representing this parsed line
+&$classes: array containing the <li> element classes
 
 'PageHistoryPager::doBatchLookups': Called after the pager query was run, before
 any output is generated, to allow batch lookups for prefetching information
@@ -2185,6 +2190,7 @@ which depends on user options should install this hook and append its values to
 the key.
 &$confstr: reference to a hash key string which can be modified
 $user: User (object) requesting the page
+&$forOptions: array of options the hash is for
 
 'PageViewUpdates': Allow database (or other) changes to be made after a
 page view is seen by MediaWiki.  Note this does not capture views made
@@ -2669,8 +2675,10 @@ $out: OutputPage object
 
 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink': After creating the "permanent
 link" tab.
-$sktemplate: SkinTemplate object
-$nav_urls: array of tabs
+&$sktemplate: SkinTemplate object
+&$nav_urls: array of tabs
+&$revid: The revision id of the permanent link
+&$revid2: The revision id of the permanent link, second time
 
 'SkinTemplateGetLanguageLink': After building the data for a language link from
 which the actual html is constructed.
@@ -3110,7 +3118,9 @@ $descriptor: (array) the HTMLForm descriptor
 
 'UploadFormSourceDescriptors': after the standard source inputs have been
 added to the descriptor
-$descriptor: (array) the HTMLForm descriptor
+&$descriptor: (array) the HTMLForm descriptor
+&$radio: Boolean, if source type should be shown as radio button
+$selectedSourceType: The selected source type
 
 'UploadVerification': Additional chances to reject an uploaded file. Consider
 using UploadVerifyFile instead.
@@ -3209,6 +3219,7 @@ $user: User to get rights for
 $user: User whose groups changed
 $added: Groups added
 $removed: Groups removed
+$performer: User who performed the change, false if via autopromotion
 
 'UserIsBlockedFrom': Check if a user is blocked from a specific page (for
 specific block exemptions).
index c5a16fc..0ec4ad1 100644 (file)
@@ -452,7 +452,7 @@ class Block {
         * Insert a block into the block table. Will fail if there is a conflicting
         * block (same name and options) already in the database.
         *
-        * @param DatabaseBase $dbw If you have one available
+        * @param IDatabase $dbw If you have one available
         * @return bool|array False on failure, assoc array on success:
         *      ('id' => block ID, 'autoIds' => array of autoblock IDs)
         */
@@ -556,7 +556,7 @@ class Block {
 
        /**
         * Get an array suitable for passing to $dbw->insert() or $dbw->update()
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return array
         */
        protected function getDatabaseArray( $db = null ) {
index 37429b9..deb85f5 100644 (file)
@@ -75,7 +75,7 @@ $wgConfigRegistry = array(
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.26alpha';
+$wgVersion = '1.27alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -525,6 +525,14 @@ $wgForeignFileRepos = array();
  */
 $wgUseInstantCommons = false;
 
+/**
+ * Name of the remote repository to which users will be allowed to upload
+ * files in their editors. Used to find a set of message names to describe
+ * the legal requirements for uploading to that wiki, and suggestions for
+ * when those requirements are not met.
+ */
+$wgRemoteUploadTarget = 'default';
+
 /**
  * File backend structure configuration.
  *
@@ -867,12 +875,12 @@ $wgUploadSizeWarning = false;
  * [[media:...]] links for non-trusted formats.
  */
 $wgTrustedMediaFormats = array(
-       MEDIATYPE_BITMAP, //all bitmap formats
-       MEDIATYPE_AUDIO, //all audio formats
-       MEDIATYPE_VIDEO, //all plain video formats
-       "image/svg+xml", //svg (only needed if inline rendering of svg is not supported)
-       "application/pdf", //PDF files
-       #"application/x-shockwave-flash", //flash/shockwave movie
+       MEDIATYPE_BITMAP, // all bitmap formats
+       MEDIATYPE_AUDIO, // all audio formats
+       MEDIATYPE_VIDEO, // all plain video formats
+       "image/svg+xml", // svg (only needed if inline rendering of svg is not supported)
+       "application/pdf", // PDF files
+       # "application/x-shockwave-flash", //flash/shockwave movie
 );
 
 /**
@@ -1173,7 +1181,7 @@ $wgAntivirus = null;
  */
 $wgAntivirusSetup = array(
 
-       #setup for clamav
+       # setup for clamav
        'clamav' => array(
                'command' => 'clamscan --no-summary ',
                'codemap' => array(
@@ -1860,6 +1868,32 @@ $wgDBservers = false;
  */
 $wgLBFactoryConf = array( 'class' => 'LBFactorySimple' );
 
+/**
+ * The ID of the current data center
+ * @since 1.27
+ */
+$wgDataCenterId = 'default';
+
+/**
+ * Map of data center IDs to their role ("master" or "slave")
+ *
+ * Multiple data centers can be setup to handle MediaWiki, with HTTP
+ * POSTs routed to the master data center and GET/HEAD/OPTION routed to
+ * any data center (usually the closest to the end user). In such setups,
+ * this setting should be set to the appropriate value in the site
+ * config for each data center.
+ * @since 1.27
+ */
+$wgDataCenterRoles = array( 'default' => 'master' );
+
+/**
+ * After a state-changing request is done by a client, this determines
+ * how many seconds that client should keep using the master datacenter.
+ * This avoids unexpected stale or 404 responses due to replication lag.
+ * @since 1.27
+ */
+$wgDataCenterUpdateStickTTL = 10;
+
 /**
  * File to log database errors to
  */
@@ -3515,6 +3549,8 @@ $wgResourceLoaderDebug = false;
 /**
  * Put each statement on its own line when minifying JavaScript. This makes
  * debugging in non-debug mode a bit easier.
+ *
+ * @deprecated since 1.27: Always false; no longer configurable.
  */
 $wgResourceLoaderMinifierStatementsOnOwnLine = false;
 
@@ -3522,6 +3558,8 @@ $wgResourceLoaderMinifierStatementsOnOwnLine = false;
  * Maximum line length when minifying JavaScript. This is not a hard maximum:
  * the minifier will try not to produce lines longer than this, but may be
  * forced to do so in certain cases.
+ *
+ * @deprecated since 1.27: Always 1,000; no longer configurable.
  */
 $wgResourceLoaderMinifierMaxLineLength = 1000;
 
@@ -4003,7 +4041,7 @@ $wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk', 'Redirect' );
  */
 $wgParserConf = array(
        'class' => 'Parser',
-       #'preprocessorClass' => 'Preprocessor_Hash',
+       # 'preprocessorClass' => 'Preprocessor_Hash',
 );
 
 /**
@@ -4462,6 +4500,7 @@ $wgReservedUsernames = array(
        'msg:usermessage-editor', // Default user for leaving user messages
        'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
        'msg:spambot_username', // Used by cleanupSpam.php
+       'msg:autochange-username', // Used by anon category RC entries (parser functions, Lua & purges)
 );
 
 /**
@@ -4573,7 +4612,7 @@ $wgAutoblockExpiry = 86400;
 /**
  * Set this to true to allow blocked users to edit their own user talk page.
  */
-$wgBlockAllowsUTEdit = false;
+$wgBlockAllowsUTEdit = true;
 
 /**
  * Allow sysops to ban users from accessing Emailuser
@@ -4702,7 +4741,7 @@ $wgGroupPermissions['*']['editmywatchlist'] = true;
 $wgGroupPermissions['*']['viewmyprivateinfo'] = true;
 $wgGroupPermissions['*']['editmyprivateinfo'] = true;
 $wgGroupPermissions['*']['editmyoptions'] = true;
-#$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
+# $wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
 
 // Implicit group for all logged-in accounts
 $wgGroupPermissions['user']['move'] = true;
@@ -4780,8 +4819,8 @@ $wgGroupPermissions['sysop']['noratelimit'] = true;
 $wgGroupPermissions['sysop']['movefile'] = true;
 $wgGroupPermissions['sysop']['unblockself'] = true;
 $wgGroupPermissions['sysop']['suppressredirect'] = true;
-#$wgGroupPermissions['sysop']['pagelang'] = true;
-#$wgGroupPermissions['sysop']['upload_by_url'] = true;
+# $wgGroupPermissions['sysop']['pagelang'] = true;
+# $wgGroupPermissions['sysop']['upload_by_url'] = true;
 $wgGroupPermissions['sysop']['mergehistory'] = true;
 $wgGroupPermissions['sysop']['managechangetags'] = true;
 
@@ -4789,20 +4828,20 @@ $wgGroupPermissions['sysop']['managechangetags'] = true;
 $wgGroupPermissions['bureaucrat']['userrights'] = true;
 $wgGroupPermissions['bureaucrat']['noratelimit'] = true;
 // Permission to change users' groups assignments across wikis
-#$wgGroupPermissions['bureaucrat']['userrights-interwiki'] = true;
+# $wgGroupPermissions['bureaucrat']['userrights-interwiki'] = true;
 // Permission to export pages including linked pages regardless of $wgExportMaxLinkDepth
-#$wgGroupPermissions['bureaucrat']['override-export-depth'] = true;
+# $wgGroupPermissions['bureaucrat']['override-export-depth'] = true;
 
-#$wgGroupPermissions['sysop']['deletelogentry'] = true;
-#$wgGroupPermissions['sysop']['deleterevision'] = true;
+# $wgGroupPermissions['sysop']['deletelogentry'] = true;
+# $wgGroupPermissions['sysop']['deleterevision'] = true;
 // To hide usernames from users and Sysops
-#$wgGroupPermissions['suppress']['hideuser'] = true;
+# $wgGroupPermissions['suppress']['hideuser'] = true;
 // To hide revisions/log items from users and Sysops
-#$wgGroupPermissions['suppress']['suppressrevision'] = true;
+# $wgGroupPermissions['suppress']['suppressrevision'] = true;
 // To view revisions/log items hidden from users and Sysops
-#$wgGroupPermissions['suppress']['viewsuppressed'] = true;
+# $wgGroupPermissions['suppress']['viewsuppressed'] = true;
 // For private suppression log access
-#$wgGroupPermissions['suppress']['suppressionlog'] = true;
+# $wgGroupPermissions['suppress']['suppressionlog'] = true;
 
 /**
  * The developer group is deprecated, but can be activated if need be
@@ -5208,6 +5247,13 @@ $wgRateLimits = array(
                'user' => null,
                'newbie' => null,
        ),
+       'purge' => array( // purging pages
+               'anon' => null,
+               'user' => null,
+               'newbie' => null,
+               'ip' => null,
+               'subnet' => null,
+       ),
 );
 
 /**
@@ -5407,13 +5453,6 @@ $wgDebugRawPage = false;
  */
 $wgDebugComments = false;
 
-/**
- * Extensive database transaction state debugging
- *
- * @since 1.20
- */
-$wgDebugDBTransactions = false;
-
 /**
  * Write SQL queries to the debug log.
  *
@@ -5424,13 +5463,6 @@ $wgDebugDBTransactions = false;
  */
 $wgDebugDumpSql = false;
 
-/**
- * Trim logged SQL queries to this many bytes. Set 0/false/null to do no
- * trimming.
- * @since 1.24
- */
-$wgDebugDumpSqlLength = 500;
-
 /**
  * Performance expectations for DB usage
  *
@@ -6363,8 +6395,8 @@ $wgShowCreditsIfMax = true;
 
 /**
  * List of interwiki prefixes for wikis we'll accept as sources for
- * Special:Import (for sysops). Since complete page history can be imported,
- * these should be 'trusted'.
+ * Special:Import and API action=import. Since complete page history can be
+ * imported, these should be 'trusted'.
  *
  * This can either be a regular array, or an associative map specifying
  * subprojects on the interwiki map of the target wiki, or a mix of the two,
@@ -6377,6 +6409,9 @@ $wgShowCreditsIfMax = true;
  *     );
  * @endcode
  *
+ * If you have a very complex import sources setup, you can lazy-load it using
+ * the ImportSources hook.
+ *
  * If a user has the 'import' permission but not the 'importupload' permission,
  * they will only be able to run imports through this transwiki interface.
  */
@@ -6661,6 +6696,7 @@ $wgHooks = array();
  */
 $wgJobClasses = array(
        'refreshLinks' => 'RefreshLinksJob',
+       'deleteLinks' => 'DeleteLinksJob',
        'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
        'sendMail' => 'EmaillingJob',
        'enotifNotify' => 'EnotifNotifyJob',
@@ -6931,11 +6967,7 @@ $wgLogHeaders = array(
  *
  * Extensions with custom log types may add to this array.
  */
-$wgLogActions = array(
-       'protect/modify' => 'modifiedarticleprotection',
-       'protect/protect' => 'protectedarticle',
-       'protect/unprotect' => 'unprotectedarticle',
-);
+$wgLogActions = array();
 
 /**
  * The same as above, but here values are names of classes,
@@ -6962,7 +6994,10 @@ $wgLogActionsHandlers = array(
        'move/move' => 'MoveLogFormatter',
        'move/move_redir' => 'MoveLogFormatter',
        'patrol/patrol' => 'PatrolLogFormatter',
+       'protect/modify' => 'ProtectLogFormatter',
        'protect/move_prot' => 'ProtectLogFormatter',
+       'protect/protect' => 'ProtectLogFormatter',
+       'protect/unprotect' => 'ProtectLogFormatter',
        'rights/autopromote' => 'RightsLogFormatter',
        'rights/rights' => 'RightsLogFormatter',
        'suppress/block' => 'BlockLogFormatter',
@@ -7470,7 +7505,7 @@ $wgRunJobsAsync = true;
 /**
  * Number of rows to update per job
  */
-$wgUpdateRowsPerJob = 500;
+$wgUpdateRowsPerJob = 300;
 
 /**
  * Number of rows to update per query
@@ -7665,14 +7700,6 @@ $wgHKDFAlgorithm = 'sha256';
  */
 $wgPageLanguageUseDB = false;
 
-/**
- * Enable use of the *_namespace fields of the pagelinks, redirect, and templatelinks tables.
- * Set this only if the fields are fully populated. This may be removed in 1.25.
- * @var bool
- * @since 1.24
- */
-$wgUseLinkNamespaceDBFields = true;
-
 /**
  * Global configuration variable for Virtual REST Services.
  * Parameters for different services are to be declared inside
@@ -7704,14 +7731,13 @@ $wgVirtualRestConfig = array(
 );
 
 /**
- * Controls the percentage of zero-result search queries with suggestions that
- * run the suggestion automatically. Must be a number between 0 and 1.  This
- * can be lowered to reduce query volume at the expense of result quality.
+ * Controls whether zero-result search queries with suggestions should display results for
+ * these suggestions.
  *
- * @var float
+ * @var bool
  * @since 1.26
  */
-$wgSearchRunSuggestedQueryPercent = 1;
+$wgSearchRunSuggestedQuery = true;
 
 /**
  * For really cool vim folding this needs to be at the end:
index d55bbcf..b8a0ec0 100644 (file)
@@ -33,7 +33,7 @@ define( 'DBO_IGNORE', 4 );
 define( 'DBO_TRX', 8 ); // automatically start transaction on first query
 define( 'DBO_DEFAULT', 16 );
 define( 'DBO_PERSISTENT', 32 );
-define( 'DBO_SYSDBA', 64 ); //for oracle maintenance
+define( 'DBO_SYSDBA', 64 ); // for oracle maintenance
 define( 'DBO_DDLMODE', 128 ); // when using schema files: mostly for Oracle
 define( 'DBO_SSL', 256 );
 define( 'DBO_COMPRESS', 512 );
@@ -135,10 +135,10 @@ define( 'MEDIATYPE_ARCHIVE', 'ARCHIVE' );
 /**@{
  * Antivirus result codes, for use in $wgAntivirusSetup.
  */
-define( 'AV_NO_VIRUS', 0 );  #scan ok, no virus found
-define( 'AV_VIRUS_FOUND', 1 );  #virus found!
-define( 'AV_SCAN_ABORTED', -1 );  #scan aborted, the file is probably immune
-define( 'AV_SCAN_FAILED', false );  #scan failed (scanner not found or error in scanner)
+define( 'AV_NO_VIRUS', 0 );  # scan ok, no virus found
+define( 'AV_VIRUS_FOUND', 1 );  # virus found!
+define( 'AV_SCAN_ABORTED', -1 );  # scan aborted, the file is probably immune
+define( 'AV_SCAN_FAILED', false );  # scan failed (scanner not found or error in scanner)
 /**@}*/
 
 /**@{
@@ -170,6 +170,7 @@ define( 'RC_EDIT', 0 );
 define( 'RC_NEW', 1 );
 define( 'RC_LOG', 3 );
 define( 'RC_EXTERNAL', 5 );
+define( 'RC_CATEGORIZE', 6 );
 /**@}*/
 
 /**@{
index 05e0ac0..dac482c 100644 (file)
@@ -980,7 +980,7 @@ class EditPage {
                global $wgUser;
                $this->edittime = $this->mArticle->getTimestamp();
 
-               $content = $this->getContentObject( false ); #TODO: track content object?!
+               $content = $this->getContentObject( false ); # TODO: track content object?!
                if ( $content === false ) {
                        return false;
                }
@@ -1228,7 +1228,7 @@ class EditPage {
                $title = Title::newFromText( $preload );
                # Check for existence to avoid getting MediaWiki:Noarticletext
                if ( $title === null || !$title->exists() || !$title->userCan( 'read', $wgUser ) ) {
-                       //TODO: somehow show a warning to the user!
+                       // TODO: somehow show a warning to the user!
                        return $handler->makeEmptyContent();
                }
 
@@ -1237,7 +1237,7 @@ class EditPage {
                        $title = $page->getRedirectTarget();
                        # Same as before
                        if ( $title === null || !$title->exists() || !$title->userCan( 'read', $wgUser ) ) {
-                               //TODO: somehow show a warning to the user!
+                               // TODO: somehow show a warning to the user!
                                return $handler->makeEmptyContent();
                        }
                        $page = WikiPage::factory( $title );
@@ -1247,7 +1247,7 @@ class EditPage {
                $content = $page->getContent( Revision::RAW );
 
                if ( !$content ) {
-                       //TODO: somehow show a warning to the user!
+                       // TODO: somehow show a warning to the user!
                        return $handler->makeEmptyContent();
                }
 
@@ -1255,7 +1255,7 @@ class EditPage {
                        $converted = $content->convert( $handler->getModelID() );
 
                        if ( !$converted ) {
-                               //TODO: somehow show a warning to the user!
+                               // TODO: somehow show a warning to the user!
                                wfDebug( "Attempt to preload incompatible content: " .
                                        "can't convert " . $content->getModel() .
                                        " to " . $handler->getModelID() );
@@ -1312,7 +1312,7 @@ class EditPage {
                }
 
                $response = RequestContext::getMain()->getRequest()->response();
-               $response->setcookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION, array(
+               $response->setCookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION, array(
                        'httpOnly' => false,
                ) );
        }
@@ -2514,7 +2514,7 @@ class EditPage {
                # user preference is active, pass a hidden tag as wpIgnoreBlankSummary. This will stop the
                # user being bounced back more than once in the event that a summary
                # is not required.
-               #####
+               # ####
                # For a bit more sophisticated detection of blank summaries, hash the
                # automatic one and pass that in the hidden field wpAutoSummary.
                if ( $this->missingSummary || ( $this->section == 'new' && $this->nosummary ) ) {
@@ -2681,7 +2681,7 @@ class EditPage {
 
                        if ( $this->section != '' && $this->section != 'new' ) {
                                if ( !$this->summary && !$this->preview && !$this->diff ) {
-                                       $sectionTitle = self::extractSectionTitle( $this->textbox1 ); //FIXME: use Content object
+                                       $sectionTitle = self::extractSectionTitle( $this->textbox1 ); // FIXME: use Content object
                                        if ( $sectionTitle !== false ) {
                                                $this->summary = "/* $sectionTitle */ ";
                                        }
@@ -3705,7 +3705,7 @@ HTML
                $imagesAvailable = $wgEnableUploads || count( $wgForeignFileRepos );
                $showSignature = true;
                if ( $title ) {
-                        $showSignature = MWNamespace::wantSignatures( $title->getNamespace() );
+                       $showSignature = MWNamespace::wantSignatures( $title->getNamespace() );
                }
 
                /**
index adab21c..b4d7737 100644 (file)
@@ -79,7 +79,7 @@ class WikiExporter {
         * make additional queries to pull source data while the
         * main query is still running.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
         *   WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
         *   - offset: non-inclusive offset at which to start the query
index 600b136..2133dae 100644 (file)
@@ -141,7 +141,7 @@ class FeedItem {
         */
        public function getLanguage() {
                global $wgLanguageCode;
-               return $wgLanguageCode;
+               return wfBCP47( $wgLanguageCode );
        }
 
        /**
index a01d642..57ba4b3 100644 (file)
@@ -128,11 +128,11 @@ class FeedUtils {
 
                if ( $oldid ) {
 
-                       #$diffText = $de->getDiff( wfMessage( 'revisionasof',
-                       #       $wgLang->timeanddate( $timestamp ),
-                       #       $wgLang->date( $timestamp ),
-                       #       $wgLang->time( $timestamp ) )->text(),
-                       #       wfMessage( 'currentrev' )->text() );
+                       # $diffText = $de->getDiff( wfMessage( 'revisionasof',
+                       #       $wgLang->timeanddate( $timestamp ),
+                       #       $wgLang->date( $timestamp ),
+                       #       $wgLang->time( $timestamp ) )->text(),
+                       #       wfMessage( 'currentrev' )->text() );
 
                        $diffText = '';
                        // Don't bother generating the diff if we won't be able to show it
@@ -185,10 +185,10 @@ class FeedUtils {
                                        $html = nl2br( htmlspecialchars( $text ) );
                                }
                        } else {
-                               //XXX: we could get an HTML representation of the content via getParserOutput, but that may
+                               // XXX: we could get an HTML representation of the content via getParserOutput, but that may
                                //     contain JS magic and generally may not be suitable for inclusion in a feed.
                                //     Perhaps Content should have a getDescriptiveHtml method and/or a getSourceText method.
-                               //Compare also ApiFeedContributions::feedItemDesc
+                               // Compare also ApiFeedContributions::feedItemDesc
                                $html = null;
                        }
 
index bcd6db2..ae186bc 100644 (file)
@@ -195,9 +195,7 @@ class FileDeleteForm {
                                // or revision is missing, so check for isOK() rather than isGood()
                                if ( $deleteStatus->isOK() ) {
                                        $status = $file->delete( $reason, $suppress, $user );
-                                       if ( $status->isOK() ) {
-                                               $dbw->commit( __METHOD__ );
-                                       } else {
+                                       if ( !$status->isOK() ) {
                                                $dbw->rollback( __METHOD__ );
                                        }
                                }
index 486926f..496992b 100644 (file)
@@ -635,7 +635,7 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
        $bits = wfParseUrl( $url );
 
        // ensure proper port for HTTPS arrives in URL
-       // https://bugzilla.wikimedia.org/show_bug.cgi?id=65184
+       // https://phabricator.wikimedia.org/T67184
        if ( $defaultProto === PROTO_HTTPS && $wgHttpsPort != 443 ) {
                $bits['port'] = $wgHttpsPort;
        }
@@ -1342,33 +1342,57 @@ function wfReadOnly() {
 }
 
 /**
- * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile.
+ * Check if the site is in read-only mode and return the message if so
+ *
+ * This checks wfConfiguredReadOnlyReason() and the main load balancer
+ * for slave lag. This may result in DB_SLAVE connection being made.
  *
  * @return string|bool String when in read-only mode; false otherwise
  */
 function wfReadOnlyReason() {
-       global $wgReadOnly, $wgReadOnlyFile;
+       $readOnly = wfConfiguredReadOnlyReason();
+       if ( $readOnly !== false ) {
+               return $readOnly;
+       }
 
-       if ( $wgReadOnly === null ) {
-               // Set $wgReadOnly for faster access next time
-               if ( is_file( $wgReadOnlyFile ) && filesize( $wgReadOnlyFile ) > 0 ) {
-                       $wgReadOnly = file_get_contents( $wgReadOnlyFile );
-               } else {
-                       $wgReadOnly = false;
-               }
+       static $autoReadOnly = null;
+       if ( $autoReadOnly === null ) {
                // Callers use this method to be aware that data presented to a user
                // may be very stale and thus allowing submissions can be problematic.
                try {
-                       if ( $wgReadOnly === false && wfGetLB()->getLaggedSlaveMode() ) {
-                               $wgReadOnly = 'The database has been automatically locked ' .
+                       if ( wfGetLB()->getLaggedSlaveMode() ) {
+                               $autoReadOnly = 'The database has been automatically locked ' .
                                        'while the slave database servers catch up to the master';
+                       } else {
+                               $autoReadOnly = false;
                        }
                } catch ( DBConnectionError $e ) {
-                       $wgReadOnly = 'The database has been automatically locked ' .
+                       $autoReadOnly = 'The database has been automatically locked ' .
                                'until the slave database servers become available';
                }
        }
 
+       return $autoReadOnly;
+}
+
+/**
+ * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile.
+ *
+ * @return string|bool String when in read-only mode; false otherwise
+ * @since 1.27
+ */
+function wfConfiguredReadOnlyReason() {
+       global $wgReadOnly, $wgReadOnlyFile;
+
+       if ( $wgReadOnly === null ) {
+               // Set $wgReadOnly for faster access next time
+               if ( is_file( $wgReadOnlyFile ) && filesize( $wgReadOnlyFile ) > 0 ) {
+                       $wgReadOnly = file_get_contents( $wgReadOnlyFile );
+               } else {
+                       $wgReadOnly = false;
+               }
+       }
+
        return $wgReadOnly;
 }
 
@@ -2542,7 +2566,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
        MediaWiki\restoreWarnings();
 
        if ( !$ok ) {
-               //directory may have been created on another request since we last checked
+               // directory may have been created on another request since we last checked
                if ( is_dir( $dir ) ) {
                        return true;
                }
@@ -4072,13 +4096,10 @@ function wfUnpack( $format, $data, $length = false ) {
  * @return bool
  */
 function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
-       static $badImageCache = null; // based on bad_image_list msg
-
-       # Handle redirects
-       $redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
-       if ( $redirectTitle ) {
-               $name = $redirectTitle->getDBkey();
-       }
+       # Handle redirects; callers almost always hit wfFindFile() anyway,
+       # so just use that method because it has a fast process cache.
+       $file = wfFindFile( $name ); // get the final name
+       $name = $file ? $file->getTitle()->getDBkey() : $name;
 
        # Run the extension hook
        $bad = false;
@@ -4086,10 +4107,11 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
                return $bad;
        }
 
-       $cacheable = ( $blacklist === null );
-       if ( $cacheable && $badImageCache !== null ) {
-               $badImages = $badImageCache;
-       } else { // cache miss
+       $cache = ObjectCache::newAccelerator( 'hash' );
+       $key = wfMemcKey( 'bad-image-list', ( $blacklist === null ) ? 'default' : md5( $blacklist ) );
+       $badImages = $cache->get( $key );
+
+       if ( $badImages === false ) { // cache miss
                if ( $blacklist === null ) {
                        $blacklist = wfMessage( 'bad_image_list' )->inContentLanguage()->plain(); // site list
                }
@@ -4125,13 +4147,12 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
                                $badImages[$imageDBkey] = $exceptions;
                        }
                }
-               if ( $cacheable ) {
-                       $badImageCache = $badImages;
-               }
+               $cache->set( $key, $badImages, 60 );
        }
 
        $contextKey = $contextTitle ? $contextTitle->getPrefixedDBkey() : false;
        $bad = isset( $badImages[$name] ) && !isset( $badImages[$name][$contextKey] );
+
        return $bad;
 }
 
index 62ae0b8..c61dca8 100644 (file)
@@ -857,7 +857,7 @@ class Html {
                        } elseif ( is_int( $nsId ) ) {
                                $nsName = $wgContLang->convertNamespace( $nsId );
                        }
-                       $optionsOut[ $nsId ] = $nsName;
+                       $optionsOut[$nsId] = $nsName;
                }
 
                return $optionsOut;
index 221cefb..83db268 100644 (file)
@@ -75,7 +75,7 @@ class HtmlFormatter {
 
                        // Workaround for bug that caused spaces before references
                        // to disappear during processing:
-                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+                       // https://phabricator.wikimedia.org/T55086
                        //
                        // Please replace with a better fix if one can be found.
                        $html = str_replace( ' <', '&#32;<', $html );
index bc5a957..bbf3de6 100644 (file)
@@ -250,7 +250,9 @@ class MWHttpRequest {
         * @param string $caller The method making this request, for profiling
         * @param Profiler $profiler An instance of the profiler for profiling, or null
         */
-       protected function __construct( $url, $options = array(), $caller = __METHOD__, $profiler = null ) {
+       protected function __construct(
+               $url, $options = array(), $caller = __METHOD__, $profiler = null
+       ) {
                global $wgHTTPTimeout, $wgHTTPConnectTimeout;
 
                $this->url = wfExpandUrl( $url, PROTO_HTTP );
@@ -678,7 +680,7 @@ class MWHttpRequest {
        public function getFinalUrl() {
                $headers = $this->getResponseHeaders();
 
-               //return full url (fix for incorrect but handled relative location)
+               // return full url (fix for incorrect but handled relative location)
                if ( isset( $headers['location'] ) ) {
                        $locations = $headers['location'];
                        $domain = '';
@@ -690,7 +692,7 @@ class MWHttpRequest {
 
                                if ( isset( $url['host'] ) ) {
                                        $domain = $url['scheme'] . '://' . $url['host'];
-                                       break; //found correct URI (with host)
+                                       break; // found correct URI (with host)
                                } else {
                                        $foundRelativeURI = true;
                                }
@@ -838,17 +840,19 @@ class CurlHttpRequest extends MWHttpRequest {
         * @return bool
         */
        public function canFollowRedirects() {
-               if ( strval( ini_get( 'open_basedir' ) ) !== '' || wfIniGetBool( 'safe_mode' ) ) {
-                       wfDebug( "Cannot follow redirects in safe mode\n" );
-                       return false;
-               }
-
                $curlVersionInfo = curl_version();
                if ( $curlVersionInfo['version_number'] < 0x071304 ) {
                        wfDebug( "Cannot follow redirects with libcurl < 7.19.4 due to CVE-2009-0037\n" );
                        return false;
                }
 
+               if ( version_compare( PHP_VERSION, '5.6.0', '<' ) ) {
+                       if ( strval( ini_get( 'open_basedir' ) ) !== '' || wfIniGetBool( 'safe_mode' ) ) {
+                               wfDebug( "Cannot follow redirects in safe mode\n" );
+                               return false;
+                       }
+               }
+
                return true;
        }
 }
@@ -868,8 +872,10 @@ class PhpHttpRequest extends MWHttpRequest {
        }
 
        /**
-        * Returns an array with a 'capath' or 'cafile' key that is suitable to be merged into the 'ssl' sub-array of a
-        * stream context options array. Uses the 'caInfo' option of the class if it is provided, otherwise uses the system
+        * Returns an array with a 'capath' or 'cafile' key
+        * that is suitable to be merged into the 'ssl' sub-array of
+        * a stream context options array.
+        * Uses the 'caInfo' option of the class if it is provided, otherwise uses the system
         * default CA bundle if PHP supports that, or searches a few standard locations.
         * @return array
         * @throws DomainException
@@ -880,10 +886,13 @@ class PhpHttpRequest extends MWHttpRequest {
                if ( $this->caInfo ) {
                        $certLocations = array( 'manual' => $this->caInfo );
                } elseif ( version_compare( PHP_VERSION, '5.6.0', '<' ) ) {
+                       // @codingStandardsIgnoreStart Generic.Files.LineLength
                        // Default locations, based on
                        // https://www.happyassassin.net/2015/01/12/a-note-about-ssltls-trusted-certificate-stores-and-platforms/
-                       // PHP 5.5 and older doesn't have any defaults, so we try to guess ourselves. PHP 5.6+ gets the CA location
-                       // from OpenSSL as long as it is not set manually, so we should leave capath/cafile empty there.
+                       // PHP 5.5 and older doesn't have any defaults, so we try to guess ourselves.
+                       // PHP 5.6+ gets the CA location from OpenSSL as long as it is not set manually,
+                       // so we should leave capath/cafile empty there.
+                       // @codingStandardsIgnoreEnd
                        $certLocations = array_filter( array(
                                getenv( 'SSL_CERT_DIR' ),
                                getenv( 'SSL_CERT_PATH' ),
@@ -895,7 +904,7 @@ class PhpHttpRequest extends MWHttpRequest {
                        ) );
                }
 
-               foreach( $certLocations as $key => $cert ) {
+               foreach ( $certLocations as $key => $cert ) {
                        if ( is_dir( $cert ) ) {
                                $certOptions['capath'] = $cert;
                                break;
@@ -912,8 +921,10 @@ class PhpHttpRequest extends MWHttpRequest {
        }
 
        /**
-        * Custom error handler for dealing with fopen() errors. fopen() tends to fire multiple errors in succession, and the last one
-        * is completely useless (something like "fopen: failed to open stream") so normal methods of handling errors programmatically
+        * Custom error handler for dealing with fopen() errors.
+        * fopen() tends to fire multiple errors in succession, and the last one
+        * is completely useless (something like "fopen: failed to open stream")
+        * so normal methods of handling errors programmatically
         * like get_last_error() don't work.
         */
        public function errorHandler( $errno, $errstr ) {
index 6a0bfd0..60d4a1f 100644 (file)
@@ -265,7 +265,7 @@ class WikiImporter {
                        // No rootpage
                        $this->setImportTitleFactory( new NaiveImportTitleFactory() );
                } elseif ( $rootpage !== '' ) {
-                       $rootpage = rtrim( $rootpage, '/' ); //avoid double slashes
+                       $rootpage = rtrim( $rootpage, '/' ); // avoid double slashes
                        $title = Title::newFromText( $rootpage );
 
                        if ( !$title || $title->isExternal() ) {
@@ -728,13 +728,14 @@ class WikiImporter {
                                        $title = $this->processTitle( $pageInfo['title'],
                                                isset( $pageInfo['ns'] ) ? $pageInfo['ns'] : null );
 
-                                       if ( !$title ) {
+                                       // $title is either an array of two titles or false.
+                                       if ( is_array( $title ) ) {
+                                               $this->pageCallback( $title );
+                                               list( $pageInfo['_title'], $foreignTitle ) = $title;
+                                       } else {
                                                $badTitle = true;
                                                $skip = true;
                                        }
-
-                                       $this->pageCallback( $title );
-                                       list( $pageInfo['_title'], $foreignTitle ) = $title;
                                }
 
                                if ( $title ) {
@@ -750,10 +751,17 @@ class WikiImporter {
                        }
                }
 
-               $this->pageOutCallback( $pageInfo['_title'], $foreignTitle,
+               // @note $pageInfo is only set if a valid $title is processed above with
+               //       no error. If we have a valid $title, then pageCallback is called
+               //       above, $pageInfo['title'] is set and we do pageOutCallback here.
+               //       If $pageInfo['_title'] is not set, then $foreignTitle is also not
+               //       set since they both come from $title above.
+               if ( array_key_exists( '_title', $pageInfo ) ) {
+                       $this->pageOutCallback( $pageInfo['_title'], $foreignTitle,
                                        $pageInfo['revisionCount'],
                                        $pageInfo['successfulRevisionCount'],
                                        $pageInfo );
+               }
        }
 
        /**
@@ -1605,7 +1613,7 @@ class WikiRevision {
                        'page' => $pageId,
                        'content_model' => $this->getModel(),
                        'content_format' => $this->getFormat(),
-                       //XXX: just set 'content' => $this->getContent()?
+                       // XXX: just set 'content' => $this->getContent()?
                        'text' => $this->getContent()->serialize( $this->getFormat() ),
                        'comment' => $this->getComment(),
                        'user' => $userId,
@@ -1646,7 +1654,7 @@ class WikiRevision {
                                'log_namespace' => $this->getTitle()->getNamespace(),
                                'log_title' => $this->getTitle()->getDBkey(),
                                'log_comment' => $this->getComment(),
-                               #'log_user_text' => $this->user_text,
+                               # 'log_user_text' => $this->user_text,
                                'log_params' => $this->params ),
                        __METHOD__
                );
@@ -1664,7 +1672,7 @@ class WikiRevision {
                        'log_action' => $this->action,
                        'log_timestamp' => $dbw->timestamp( $this->timestamp ),
                        'log_user' => User::idFromName( $this->user_text ),
-                       #'log_user_text' => $this->user_text,
+                       # 'log_user_text' => $this->user_text,
                        'log_namespace' => $this->getTitle()->getNamespace(),
                        'log_title' => $this->getTitle()->getDBkey(),
                        'log_comment' => $this->getComment(),
index 99aaaa0..7215cec 100644 (file)
@@ -41,7 +41,7 @@ class LinkFilter {
         */
        static function matchEntry( Content $content, $filterEntry ) {
                if ( !( $content instanceof TextContent ) ) {
-                       //TODO: handle other types of content too.
+                       // TODO: handle other types of content too.
                        //      Maybe create ContentHandler::matchFilter( LinkFilter ).
                        //      Think about a common base class for LinkFilter and MagicWord.
                        return 0;
index 9b5ff27..2e33bd1 100644 (file)
@@ -1274,14 +1274,17 @@ class Linker {
         * temporarily to a value pass. Should be adjusted further. --brion
         *
         * @param string $comment
-        * @param Title|null $title Title object (to generate link to the section in autocomment) or null
+        * @param Title|null $title Title object (to generate link to the section in autocomment)
+        *  or null
         * @param bool $local Whether section links should refer to local page
-        * @param string|null $wikiId Id (as used by WikiMap) of the wiki to generate links to. For use with external changes.
+        * @param string|null $wikiId Id (as used by WikiMap) of the wiki to generate links to.
+        *  For use with external changes.
         *
         * @return mixed|string
         */
-       public static function formatComment( $comment, $title = null, $local = false, $wikiId = null ) {
-
+       public static function formatComment(
+               $comment, $title = null, $local = false, $wikiId = null
+       ) {
                # Sanitize text a bit:
                $comment = str_replace( "\n", " ", $comment );
                # Allow HTML entities (for bug 13815)
@@ -1306,11 +1309,14 @@ class Linker {
         * @param string $comment Comment text
         * @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), as used by WikiMap.
+        * @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
+        *  as used by WikiMap.
         *
         * @return string Formatted comment (wikitext)
         */
-       private static function formatAutocomments( $comment, $title = null, $local = false, $wikiId = null ) {
+       private static function formatAutocomments(
+               $comment, $title = null, $local = false, $wikiId = null
+       ) {
                // @todo $append here is something of a hack to preserve the status
                // quo. Someone who knows more about bidi and such should decide
                // (1) what sane rendering even *is* for an LTR edit summary on an RTL
@@ -1334,7 +1340,12 @@ class Linker {
                                $auto = $match[2];
                                $post = $match[3] !== '';
                                $comment = null;
-                               Hooks::run( 'FormatAutocomments', array( &$comment, $pre, $auto, $post, $title, $local, $wikiId ) );
+
+                               Hooks::run(
+                                       'FormatAutocomments',
+                                       array( &$comment, $pre, $auto, $post, $title, $local, $wikiId )
+                               );
+
                                if ( $comment === null ) {
                                        $link = '';
                                        if ( $title ) {
@@ -1386,7 +1397,8 @@ class Linker {
         * @param string $comment Text to format links in
         * @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), as used by WikiMap.
+        * @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
+        *  as used by WikiMap.
         *
         * @return string
         */
@@ -1489,18 +1501,25 @@ class Linker {
         *
         * @param Title $title
         * @param string $text
-        * @param string|null $wikiId Id of the wiki to link to (if not the local wiki), as used by WikiMap.
+        * @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
+        *  as used by WikiMap.
         * @param string|string[] $options See the $options parameter in Linker::link.
         *
         * @return string HTML link
         */
-       public static function makeCommentLink( Title $title, $text, $wikiId = null, $options = array() ) {
+       public static function makeCommentLink(
+               Title $title, $text, $wikiId = null, $options = array()
+       ) {
                if ( $wikiId !== null && !$title->isExternal() ) {
                        $link = Linker::makeExternalLink(
-                                       WikiMap::getForeignURL( $wikiId, $title->getPrefixedText(), $title->getFragment() ),
-                                       $text,
-                                       /* escape = */ false // Already escaped
-                               );
+                               WikiMap::getForeignURL(
+                                       $wikiId,
+                                       $title->getPrefixedText(),
+                                       $title->getFragment()
+                               ),
+                               $text,
+                               /* escape = */ false // Already escaped
+                       );
                } else {
                        $link = Linker::link( $title, $text, array(), array(), $options );
                }
@@ -1594,11 +1613,14 @@ class Linker {
         * @param string $comment
         * @param Title|null $title Title object (to generate link to section in autocomment) or null
         * @param bool $local Whether section links should refer to local page
-        * @param string|null $wikiId Id (as used by WikiMap) of the wiki to generate links to. For use with external changes.
+        * @param string|null $wikiId Id (as used by WikiMap) of the wiki to generate links to.
+        *  For use with external changes.
         *
         * @return string
         */
-       public static function commentBlock( $comment, $title = null, $local = false, $wikiId = null ) {
+       public static function commentBlock(
+               $comment, $title = null, $local = false, $wikiId = null
+       ) {
                // '*' used to be the comment inserted by the software way back
                // in antiquity in case none was provided, here for backwards
                // compatibility, acc. to brion -ævar
index 8ca205a..0dd709f 100644 (file)
@@ -271,6 +271,8 @@ class MWNamespace {
                                        $mValidNamespaces[] = $ns;
                                }
                        }
+                       // T109137: sort numerically
+                       sort( $mValidNamespaces, SORT_NUMERIC );
                }
 
                return $mValidNamespaces;
index d28f88e..639403d 100644 (file)
@@ -106,7 +106,7 @@ class MWTimestamp {
                        $ts,
                        $da
                ) ) {
-                       #TS_ISO_8601_BASIC
+                       # TS_ISO_8601_BASIC
                } elseif ( preg_match(
                        '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',
                        $ts,
@@ -203,11 +203,15 @@ class MWTimestamp {
         * @deprecated since 1.26 Use Language::getHumanTimestamp directly
         *
         * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
-        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
-        * @param Language|null $lang Language to use to make the human timestamp (or null to use main context's language)
+        * @param User|null $user User the timestamp is being generated for
+        *  (or null to use main context's user)
+        * @param Language|null $lang Language to use to make the human timestamp
+        *  (or null to use main context's language)
         * @return string Formatted timestamp
         */
-       public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
+       public function getHumanTimestamp(
+               MWTimestamp $relativeTo = null, User $user = null, Language $lang = null
+       ) {
                if ( $lang === null ) {
                        $lang = RequestContext::getMain()->getLanguage();
                }
@@ -367,6 +371,26 @@ class MWTimestamp {
                return $this->timestamp->getTimezone();
        }
 
+       /**
+        * Get the localized timezone message, if available.
+        *
+        * 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
+        * @return Message The localized timezone message
+        */
+       public function getTimezoneMessage() {
+               $tzMsg = $this->format( 'T' );  // might vary on DST changeover!
+               $key = 'timezone-' . strtolower( trim( $tzMsg ) );
+               $msg = wfMessage( $key );
+               if ( $msg->exists() ) {
+                       return $msg;
+               } else {
+                       return new RawMessage( $tzMsg );
+               }
+       }
+
        /**
         * Format the timestamp in a given format.
         *
index fbacb25..e29319b 100644 (file)
@@ -471,7 +471,6 @@ class MediaWiki {
         */
        public function run() {
                try {
-                       $this->checkMaxLag();
                        try {
                                $this->main();
                        } catch ( ErrorPageError $e ) {
@@ -504,6 +503,14 @@ class MediaWiki {
                $factory->shutdown();
 
                wfDebug( __METHOD__ . ' completed; all transactions committed' );
+
+               // 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();
+               if ( $request->wasPosted() && $factory->hasOrMadeRecentMasterChanges() ) {
+                       $expires = time() + $this->config->get( 'DataCenterUpdateStickTTL' );
+                       $request->response()->setCookie( 'UseDC', 'master', $expires );
+               }
        }
 
        /**
@@ -546,33 +553,6 @@ class MediaWiki {
                }
        }
 
-       /**
-        * Checks if the request should abort due to a lagged server,
-        * for given maxlag parameter.
-        * @return bool
-        */
-       private function checkMaxLag() {
-               $maxLag = $this->context->getRequest()->getVal( 'maxlag' );
-               if ( !is_null( $maxLag ) ) {
-                       list( $host, $lag ) = wfGetLB()->getMaxLag();
-                       if ( $lag > $maxLag ) {
-                               $resp = $this->context->getRequest()->response();
-                               $resp->statusHeader( 503 );
-                               $resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
-                               $resp->header( 'X-Database-Lag: ' . intval( $lag ) );
-                               $resp->header( 'Content-Type: text/plain' );
-                               if ( $this->config->get( 'ShowHostnames' ) ) {
-                                       echo "Waiting for $host: $lag seconds lagged\n";
-                               } else {
-                                       echo "Waiting for a database server: $lag seconds lagged\n";
-                               }
-
-                               exit;
-                       }
-               }
-               return true;
-       }
-
        private function main() {
                global $wgTitle, $wgTrxProfilerLimits;
 
index 2b240c3..8ab92b4 100644 (file)
@@ -323,7 +323,7 @@ class MimeMagic {
                                continue;
                        }
 
-                       #print "processing MIME INFO line $s<br>";
+                       # print "processing MIME INFO line $s<br>";
 
                        $match = array();
                        if ( preg_match( '!\[\s*(\w+)\s*\]!', $s, $match ) ) {
@@ -957,7 +957,7 @@ class MimeMagic {
 
                if ( $m ) {
                        # normalize
-                       $m = preg_replace( '![;, ].*$!', '', $m ); #strip charset, etc
+                       $m = preg_replace( '![;, ].*$!', '', $m ); # strip charset, etc
                        $m = trim( $m );
                        $m = strtolower( $m );
 
index 552e181..f680d45 100644 (file)
@@ -2988,7 +2988,8 @@ class OutputPage extends ContextSource {
        function getExternalHeadScripts() {
                $links = array();
 
-               // Startup - this provides the client with the module manifest and loads jquery and mediawiki base modules
+               // Startup - this provides the client with the module
+               // manifest and loads jquery and mediawiki base modules
                $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS );
 
                return self::getHtmlFromLoaderLinks( $links );
@@ -3022,9 +3023,15 @@ class OutputPage extends ContextSource {
                // This needs to be TYPE_COMBINED so these modules are properly wrapped
                // in mw.loader.implement() calls and deferred until mw.user is available
                $embedScripts = array( 'user.options' );
-               $links[] = $this->makeResourceLoaderLink( $embedScripts, ResourceLoaderModule::TYPE_COMBINED );
+               $links[] = $this->makeResourceLoaderLink(
+                       $embedScripts,
+                       ResourceLoaderModule::TYPE_COMBINED
+               );
                // Separate user.tokens as otherwise caching will be allowed (T84960)
-               $links[] = $this->makeResourceLoaderLink( 'user.tokens', ResourceLoaderModule::TYPE_COMBINED );
+               $links[] = $this->makeResourceLoaderLink(
+                       'user.tokens',
+                       ResourceLoaderModule::TYPE_COMBINED
+               );
 
                // Modules requests - let the client calculate dependencies and batch requests as it likes
                // Only load modules that have marked themselves for loading at the top
@@ -3109,16 +3116,19 @@ class OutputPage extends ContextSource {
                        // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
                        // asynchronously and may arrive *after* the inline script here. So the previewed code
                        // may execute before ./common.js runs. Normally, ./common.js runs before ./vector.js.
-                       // Similarly, when previewing ./common.js and the user module does arrive first, it will
-                       // arrive without common.js and the inline script runs after. Thus running common after
-                       // the excluded subpage.
+                       // Similarly, when previewing ./common.js and the user module does arrive first,
+                       // it will arrive without common.js and the inline script runs after.
+                       // Thus running common after the excluded subpage.
                } else {
                        // Include the user module normally, i.e., raw to avoid it being wrapped in a closure.
                        $links[] = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_COMBINED );
                }
 
                // Group JS is only enabled if site JS is enabled.
-               $links[] = $this->makeResourceLoaderLink( 'user.groups', ResourceLoaderModule::TYPE_COMBINED );
+               $links[] = $this->makeResourceLoaderLink(
+                       'user.groups',
+                       ResourceLoaderModule::TYPE_COMBINED
+               );
 
                return self::getHtmlFromLoaderLinks( $links );
        }
@@ -3375,7 +3385,9 @@ class OutputPage extends ContextSource {
                if ( $config->get( 'UniversalEditButton' ) && $this->isArticleRelated() ) {
                        $user = $this->getUser();
                        if ( $this->getTitle()->quickUserCan( 'edit', $user )
-                               && ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create', $user ) ) ) {
+                               && ( $this->getTitle()->exists() ||
+                                       $this->getTitle()->quickUserCan( 'create', $user ) )
+                       ) {
                                // Original UniversalEditButton
                                $msg = $this->msg( 'edit' )->text();
                                $tags['universal-edit-button'] = Html::element( 'link', array(
@@ -3427,8 +3439,9 @@ class OutputPage extends ContextSource {
                        $tags['rsd'] = Html::element( 'link', array(
                                'rel' => 'EditURI',
                                'type' => 'application/rsd+xml',
-                               // Output a protocol-relative URL here if $wgServer is protocol-relative
-                               // Whether RSD accepts relative or protocol-relative URLs is completely undocumented, though
+                               // Output a protocol-relative URL here if $wgServer is protocol-relative.
+                               // Whether RSD accepts relative or protocol-relative URLs is completely
+                               // undocumented, though.
                                'href' => wfExpandUrl( wfAppendQuery(
                                        wfScript( 'api' ),
                                        array( 'action' => 'rsd' ) ),
@@ -3446,7 +3459,9 @@ class OutputPage extends ContextSource {
                                        $tags["variant-$variant"] = Html::element( 'link', array(
                                                'rel' => 'alternate',
                                                'hreflang' => wfBCP47( $variant ),
-                                               'href' => $this->getTitle()->getLocalURL( array( 'variant' => $variant ) ) )
+                                               'href' => $this->getTitle()->getLocalURL(
+                                                       array( 'variant' => $variant ) )
+                                               )
                                        );
                                }
                                # x-default link per https://support.google.com/webmasters/answer/189077?hl=en
@@ -3494,7 +3509,9 @@ class OutputPage extends ContextSource {
                                        $format,
                                        $link,
                                        # Used messages: 'page-rss-feed' and 'page-atom-feed' (for an easier grep)
-                                       $this->msg( "page-{$format}-feed", $this->getTitle()->getPrefixedText() )->text()
+                                       $this->msg(
+                                               "page-{$format}-feed", $this->getTitle()->getPrefixedText()
+                                       )->text()
                                );
                        }
 
@@ -3701,7 +3718,8 @@ class OutputPage extends ContextSource {
                                continue;
                        }
                        $group = $module->getGroup();
-                       // Modules in groups other than the ones needing special treatment (see $styles assignment)
+                       // Modules in groups other than the ones needing special treatment
+                       // (see $styles assignment)
                        // will be placed in the "other" style category.
                        $styles[isset( $styles[$group] ) ? $group : 'other'][] = $name;
                }
@@ -3711,10 +3729,14 @@ class OutputPage extends ContextSource {
                // statically added styles from other modules. So the order has to be
                // other, dynamic, site, private, user. Add statically added styles for
                // other modules
-               $links[] = $this->makeResourceLoaderLink( $styles['other'], ResourceLoaderModule::TYPE_STYLES );
+               $links[] = $this->makeResourceLoaderLink(
+                       $styles['other'],
+                       ResourceLoaderModule::TYPE_STYLES
+               );
                // Add normal styles added through addStyle()/addInlineStyle() here
                $links[] = implode( "\n", $this->buildCssLinksArray() ) . $this->mInlineStyles;
-               // Add marker tag to mark the place where the client-side loader should inject dynamic styles
+               // Add marker tag to mark the place where the client-side
+               // loader should inject dynamic styles
                // We use a <meta> tag with a made-up name for this because that's valid HTML
                $links[] = Html::element(
                        'meta',
@@ -3784,7 +3806,8 @@ class OutputPage extends ContextSource {
                        $url = $style;
                } else {
                        $config = $this->getConfig();
-                       $url = $config->get( 'StylePath' ) . '/' . $style . '?' . $config->get( 'StyleVersion' );
+                       $url = $config->get( 'StylePath' ) . '/' . $style . '?' .
+                               $config->get( 'StyleVersion' );
                }
 
                $link = Html::linkedStyle( $url, $media );
@@ -3973,7 +3996,7 @@ class OutputPage extends ContextSource {
                $themes = ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
                // Make keys (skin names) lowercase for case-insensitive matching.
                $themes = array_change_key_case( $themes, CASE_LOWER );
-               $theme = isset( $themes[ $skinName ] ) ? $themes[ $skinName ] : 'MediaWiki';
+               $theme = isset( $themes[$skinName] ) ? $themes[$skinName] : 'MediaWiki';
                // For example, 'OOUI\MediaWikiTheme'.
                $themeClass = "OOUI\\{$theme}Theme";
                OOUI\Theme::setSingleton( new $themeClass() );
index 9dec950..233ebf2 100644 (file)
@@ -30,7 +30,7 @@
  * version are hardcoded here
  */
 function wfEntryPointCheck( $entryPoint ) {
-       $mwVersion = '1.26';
+       $mwVersion = '1.27';
        $minimumVersionPHP = '5.3.3';
        $phpVersion = PHP_VERSION;
 
@@ -188,12 +188,14 @@ function wfMissingVendorError( $type, $mwVersion ) {
                . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
                . "for help on installing the required components.";
 
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        $longHtml = <<<HTML
-                       MediaWiki now also has some external dependencies that need to be installed via
-                       composer or from a separate git repo. 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.
+               MediaWiki now also has some external dependencies that need to be installed via
+               composer or from a separate git repo. 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.
 HTML;
+       // @codingStandardsIgnoreEnd
 
        wfGenericError( $type, $mwVersion, 'External dependencies', $shortText, $longText, $longHtml );
 }
index d0475c1..b3ee207 100644 (file)
@@ -112,20 +112,20 @@ class Preferences {
         * @return array|null
         */
        static function loadPreferenceValues( $user, $context, &$defaultPreferences ) {
-               ## Remove preferences that wikis don't want to use
+               # # Remove preferences that wikis don't want to use
                foreach ( $context->getConfig()->get( 'HiddenPrefs' ) as $pref ) {
                        if ( isset( $defaultPreferences[$pref] ) ) {
                                unset( $defaultPreferences[$pref] );
                        }
                }
 
-               ## Make sure that form fields have their parent set. See bug 41337.
+               # # Make sure that form fields have their parent set. See bug 41337.
                $dummyForm = new HTMLForm( array(), $context );
 
                $disable = !$user->isAllowed( 'editmyoptions' );
 
                $defaultOptions = User::getDefaultOptions();
-               ## Prod in defaults from the user
+               # # Prod in defaults from the user
                foreach ( $defaultPreferences as $name => &$info ) {
                        $prefFromUser = self::getOptionFromUser( $name, $info, $user );
                        if ( $disable && !in_array( $name, self::$saveBlacklist ) ) {
@@ -211,7 +211,7 @@ class Preferences {
                // retrieving user name for GENDER and misc.
                $userName = $user->getName();
 
-               ## User info #####################################
+               # # User info #####################################
                // Information panel
                $defaultPreferences['username'] = array(
                        'type' => 'info',
@@ -427,7 +427,7 @@ class Preferences {
                        'section' => 'personal/signature'
                );
 
-               ## Email stuff
+               # # Email stuff
 
                if ( $config->get( 'EnableEmail' ) ) {
                        if ( $canViewPrivateInfo ) {
@@ -571,7 +571,7 @@ class Preferences {
         * @return void
         */
        static function skinPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Skin #####################################
+               # # Skin #####################################
 
                // Skin selector, if there is at least one valid skin
                $skinOptions = self::generateSkinOptions( $user, $context );
@@ -620,7 +620,7 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function filesPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Files #####################################
+               # # Files #####################################
                $defaultPreferences['imagesize'] = array(
                        'type' => 'select',
                        'options' => self::getImageSizes( $context ),
@@ -642,7 +642,7 @@ class Preferences {
         * @return void
         */
        static function datetimePreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Date and time #####################################
+               # # Date and time #####################################
                $dateOptions = self::getDateOptions( $context );
                if ( $dateOptions ) {
                        $defaultPreferences['date'] = array(
@@ -715,7 +715,7 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function renderingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Diffs ####################################
+               # # Diffs ####################################
                $defaultPreferences['diffonly'] = array(
                        'type' => 'toggle',
                        'section' => 'rendering/diffs',
@@ -727,7 +727,7 @@ class Preferences {
                        'label-message' => 'tog-norollbackdiff',
                );
 
-               ## Page Rendering ##############################
+               # # Page Rendering ##############################
                if ( $context->getConfig()->get( 'AllowUserCssPrefs' ) ) {
                        $defaultPreferences['underline'] = array(
                                'type' => 'select',
@@ -777,7 +777,7 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Editing #####################################
+               # # Editing #####################################
                $defaultPreferences['editsectiononrightclick'] = array(
                        'type' => 'toggle',
                        'section' => 'editing/advancedediting',
@@ -865,7 +865,7 @@ class Preferences {
        static function rcPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                $config = $context->getConfig();
                $rcMaxAge = $config->get( 'RCMaxAge' );
-               ## RecentChanges #####################################
+               # # RecentChanges #####################################
                $defaultPreferences['rcdays'] = array(
                        'type' => 'float',
                        'label-message' => 'recentchangesdays',
@@ -926,7 +926,7 @@ class Preferences {
                $config = $context->getConfig();
                $watchlistdaysMax = ceil( $config->get( 'RCMaxAge' ) / ( 3600 * 24 ) );
 
-               ## Watchlist #####################################
+               # # Watchlist #####################################
                if ( $user->isAllowed( 'editmywatchlist' ) ) {
                        $editWatchlistLinks = array();
                        $editWatchlistModes = array(
index 4cad7b7..b6ba918 100644 (file)
@@ -384,7 +384,11 @@ class ProtectionForm {
                                "mwProtect-$action-expires"
                        );
 
-                       $expiryFormOptions = new XmlSelect( "wpProtectExpirySelection-$action", "mwProtectExpirySelection-$action", $this->mExpirySelection[$action] );
+                       $expiryFormOptions = new XmlSelect(
+                               "wpProtectExpirySelection-$action",
+                               "mwProtectExpirySelection-$action",
+                               $this->mExpirySelection[$action]
+                       );
                        $expiryFormOptions->setAttribute( 'tabindex', '2' );
                        if ( $this->disabled ) {
                                $expiryFormOptions->setAttribute( 'disabled', 'disabled' );
@@ -397,12 +401,20 @@ class ProtectionForm {
                                        $timestamp = $lang->userTimeAndDate( $this->mExistingExpiry[$action], $user );
                                        $d = $lang->userDate( $this->mExistingExpiry[$action], $user );
                                        $t = $lang->userTime( $this->mExistingExpiry[$action], $user );
-                                       $existingExpiryMessage = $context->msg( 'protect-existing-expiry', $timestamp, $d, $t );
+                                       $existingExpiryMessage = $context->msg(
+                                               'protect-existing-expiry',
+                                               $timestamp,
+                                               $d,
+                                               $t
+                                       );
                                }
                                $expiryFormOptions->addOption( $existingExpiryMessage->text(), 'existing' );
                        }
 
-                       $expiryFormOptions->addOption( $context->msg( 'protect-othertime-op' )->text(), 'othertime' );
+                       $expiryFormOptions->addOption(
+                               $context->msg( 'protect-othertime-op' )->text(),
+                               'othertime'
+                       );
                        foreach ( explode( ',', $scExpiryOptions ) as $option ) {
                                if ( strpos( $option, ":" ) === false ) {
                                        $show = $value = $option;
index 32ee259..24c025f 100644 (file)
@@ -223,7 +223,7 @@ class Revision implements IDBAccessObject {
         * Load a page revision from a given revision ID number.
         * Returns null if no such revision can be found.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int $id
         * @return Revision|null
         */
@@ -236,7 +236,7 @@ class Revision implements IDBAccessObject {
         * that's attached to a given page. If not attached
         * to that page, will return null.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int $pageid
         * @param int $id
         * @return Revision|null
@@ -256,7 +256,7 @@ class Revision implements IDBAccessObject {
         * that's attached to a given page. If not attached
         * to that page, will return null.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param Title $title
         * @param int $id
         * @return Revision|null
@@ -281,7 +281,7 @@ class Revision implements IDBAccessObject {
         * WARNING: Timestamps may in some circumstances not be unique,
         * so this isn't the best key to use.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param Title $title
         * @param string $timestamp
         * @return Revision|null
@@ -333,7 +333,7 @@ class Revision implements IDBAccessObject {
         * Given a set of conditions, fetch a revision from
         * the given database connection.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param array $conditions
         * @param int $flags (optional)
         * @return Revision|null
@@ -375,7 +375,7 @@ class Revision implements IDBAccessObject {
         * which will return matching database rows with the
         * fields necessary to build Revision objects.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param array $conditions
         * @param int $flags (optional)
         * @return ResultWrapper
@@ -519,7 +519,7 @@ class Revision implements IDBAccessObject {
 
        /**
         * Do a batched query to get the parent revision lengths
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param array $revIds
         * @return array
         */
@@ -773,7 +773,7 @@ class Revision implements IDBAccessObject {
                if ( $this->mTitle !== null ) {
                        return $this->mTitle;
                }
-               //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
+               // rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
                if ( $this->mId !== null ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow(
@@ -948,18 +948,25 @@ class Revision implements IDBAccessObject {
        /**
         * Get the RC object belonging to the current revision, if there's one
         *
+        * @param int $flags (optional) $flags include:
+        *      Revision::READ_LATEST  : Select the data from the master
+        *
         * @since 1.22
         * @return RecentChange|null
         */
-       public function getRecentChange() {
+       public function getRecentChange( $flags = 0 ) {
                $dbr = wfGetDB( DB_SLAVE );
+
+               list( $dbType, ) = DBAccessObjectUtils::getDBOptions( $flags );
+
                return RecentChange::newFromConds(
                        array(
                                'rc_user_text' => $this->getUserText( Revision::RAW ),
                                'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
                                'rc_this_oldid' => $this->getId()
                        ),
-                       __METHOD__
+                       __METHOD__,
+                       $dbType
                );
        }
 
@@ -1199,7 +1206,7 @@ class Revision implements IDBAccessObject {
         * Get previous revision Id for this page_id
         * This is used to populate rev_parent_id on save
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return int
         */
        private function getPreviousRevisionId( $db ) {
@@ -1352,7 +1359,7 @@ class Revision implements IDBAccessObject {
         * Insert a new revision into the database, returning the new revision ID
         * number on success and dies horribly on failure.
         *
-        * @param DatabaseBase $dbw (master connection)
+        * @param IDatabase $dbw (master connection)
         * @throws MWException
         * @return int
         */
@@ -1418,8 +1425,8 @@ class Revision implements IDBAccessObject {
                );
 
                if ( $wgContentHandlerUseDB ) {
-                       //NOTE: Store null for the default model and format, to save space.
-                       //XXX: Makes the DB sensitive to changed defaults.
+                       // NOTE: Store null for the default model and format, to save space.
+                       // XXX: Makes the DB sensitive to changed defaults.
                        // Make this behavior optional? Only in miser mode?
 
                        $model = $this->getContentModel();
@@ -1459,7 +1466,8 @@ class Revision implements IDBAccessObject {
        protected function checkContentModel() {
                global $wgContentHandlerUseDB;
 
-               $title = $this->getTitle(); //note: may return null for revisions that have not yet been inserted.
+               // Note: may return null for revisions that have not yet been inserted
+               $title = $this->getTitle();
 
                $model = $this->getContentModel();
                $format = $this->getContentFormat();
@@ -1588,7 +1596,7 @@ class Revision implements IDBAccessObject {
         * Such revisions can for instance identify page rename
         * operations and other such meta-modifications.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param int $pageId ID number of the page to read from
         * @param string $summary Revision's summary
         * @param bool $minor Whether the revision should be considered as minor
@@ -1738,7 +1746,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get count of revisions per page...not very efficient
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int $id Page id
         * @return int
         */
@@ -1754,7 +1762,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get count of revisions per page...not very efficient
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param Title $title
         * @return int
         */
@@ -1774,7 +1782,7 @@ class Revision implements IDBAccessObject {
         * @since 1.20
         * @deprecated since 1.24
         *
-        * @param DatabaseBase|int $db The Database to perform the check on. May be given as a
+        * @param IDatabase|int $db The Database to perform the check on. May be given as a
         *        Database object or a database identifier usable with wfGetDB.
         * @param int $pageId The ID of the page in question
         * @param int $userId The ID of the user in question
index e417473..1df0ca0 100644 (file)
@@ -121,7 +121,7 @@ abstract class RevisionListBase extends ContextSource {
 
        /**
         * Do the DB query to iterate through the objects.
-        * @param DatabaseBase $db DatabaseBase object to use for the query
+        * @param IDatabase $db DatabaseBase object to use for the query
         */
        abstract public function doQuery( $db );
 
@@ -264,7 +264,7 @@ class RevisionList extends RevisionListBase {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return mixed
         */
        public function doQuery( $db ) {
index de63af7..f88dd05 100644 (file)
@@ -536,7 +536,7 @@ class Sanitizer {
                                                        $badtag = true;
                                                } elseif ( in_array( $t, $tagstack ) && !isset( $htmlnest[$t] ) ) {
                                                        $badtag = true;
-                                               # Is it a self closed htmlpair ? (bug 5487)
+                                               #  Is it a self closed htmlpair ? (bug 5487)
                                                } elseif ( $brace == '/>' && isset( $htmlpairs[$t] ) ) {
                                                        $badtag = true;
                                                } elseif ( isset( $htmlsingleonly[$t] ) ) {
@@ -738,7 +738,7 @@ class Sanitizer {
 
                $out = array();
                foreach ( $attribs as $attribute => $value ) {
-                       #allow XML namespace declaration if RDFa is enabled
+                       # allow XML namespace declaration if RDFa is enabled
                        if ( $wgAllowRdfaAttributes && preg_match( self::XMLNS_ATTRIBUTE_PATTERN, $attribute ) ) {
                                if ( !preg_match( self::EVIL_URI_PATTERN, $value ) ) {
                                        $out[$attribute] = $value;
@@ -784,7 +784,7 @@ class Sanitizer {
                                || $attribute === 'itemref' || $attribute === 'itemscope'
                                || $attribute === 'itemtype'
                        ) {
-                               //Paranoia. Allow "simple" values but suppress javascript
+                               // Paranoia. Allow "simple" values but suppress javascript
                                if ( preg_match( self::EVIL_URI_PATTERN, $value ) ) {
                                        continue;
                                }
@@ -794,7 +794,7 @@ class Sanitizer {
                        #       validation code that can be used by tag hook handlers, etc
                        if ( $attribute === 'href' || $attribute === 'src' ) {
                                if ( !preg_match( $hrefExp, $value ) ) {
-                                       continue; //drop any href or src attributes not using an allowed protocol.
+                                       continue; // drop any href or src attributes not using an allowed protocol.
                                        // NOTE: this also drops all relative URLs
                                }
                        }
@@ -1697,7 +1697,7 @@ class Sanitizer {
                        # rbc
                        'rb'         => $common,
                        'rp'         => $common,
-                       'rt'         => $common, #array_merge( $common, array( 'rbspan' ) ),
+                       'rt'         => $common, # array_merge( $common, array( 'rbspan' ) ),
                        'rtc'         => $common,
 
                        # MathML root element, where used for extensions
@@ -1807,7 +1807,9 @@ class Sanitizer {
                        $host = preg_replace( $strip, '', $host );
 
                        // IPv6 host names are bracketed with [].  Url-decode these.
-                       if ( substr_compare( "//%5B", $host, 0, 5 ) === 0 && preg_match( '!^//%5B([0-9A-Fa-f:.]+)%5D((:\d+)?)$!', $host, $matches ) ) {
+                       if ( substr_compare( "//%5B", $host, 0, 5 ) === 0 &&
+                               preg_match( '!^//%5B([0-9A-Fa-f:.]+)%5D((:\d+)?)$!', $host, $matches )
+                       ) {
                                $host = '//[' . $matches[1] . ']' . $matches[2];
                        }
 
index 81172a1..64e5ea0 100644 (file)
@@ -98,7 +98,7 @@ class SiteStats {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return bool|ResultWrapper
         */
        static function doLoad( $db ) {
@@ -364,7 +364,7 @@ class SiteStatsInit {
         * Do all updates and commit them. More or less a replacement
         * for the original initStats, but without output.
         *
-        * @param DatabaseBase|bool $database
+        * @param IDatabase|bool $database
         * - Boolean: whether to use the master DB
         * - DatabaseBase: database connection to use
         * @param array $options Array of options, may contain the following values
index 28af7f5..752cc5d 100644 (file)
@@ -361,7 +361,7 @@ class Status {
         *
         * @note: this handles RawMessage poorly
         *
-        * @param string $type
+        * @param string|bool $type
         * @return array
         */
        protected function getStatusArray( $type = false ) {
index d6b101b..3c62c14 100644 (file)
@@ -79,7 +79,9 @@ class TemplateParser {
         */
        protected function getTemplate( $templateName ) {
                // If a renderer has already been defined for this template, reuse it
-               if ( isset( $this->renderers[$templateName] ) && is_callable( $this->renderers[$templateName] ) ) {
+               if ( isset( $this->renderers[$templateName] ) &&
+                       is_callable( $this->renderers[$templateName] )
+               ) {
                        return $this->renderers[$templateName];
                }
 
index b347edb..e2cbc8e 100644 (file)
@@ -206,7 +206,7 @@ class Title {
         * @return TitleFormatter
         */
        private static function getTitleFormatter() {
-               //NOTE: we know that getTitleParser() returns a MediaWikiTitleCodec,
+               // NOTE: we know that getTitleParser() returns a MediaWikiTitleCodec,
                //      which implements TitleFormatter.
                return self::getTitleParser();
        }
@@ -266,7 +266,11 @@ class Title {
                        throw new InvalidArgumentException( '$text must be a string.' );
                } elseif ( !is_string( $text ) ) {
                        wfDebugLog( 'T76305', wfGetAllCallers( 5 ) );
-                       wfWarn( __METHOD__ . ': $text must be a string. This will throw an InvalidArgumentException in future.', 2 );
+                       wfWarn(
+                               __METHOD__ . ': $text must be a string. ' .
+                                       'This will throw an InvalidArgumentException in future.',
+                               2
+                       );
                }
 
                try {
@@ -526,7 +530,7 @@ class Title {
         * @param string $title Database key form
         * @param string $fragment The link fragment (after the "#")
         * @param string $interwiki Interwiki prefix
-        * @return Title The new object, or null on an error
+        * @return Title|null The new object, or null on an error
         */
        public static function makeTitleSafe( $ns, $title, $fragment = '', $interwiki = '' ) {
                if ( !MWNamespace::exists( $ns ) ) {
@@ -2944,7 +2948,7 @@ class Title {
                                        $this->mRestrictions['move'] = explode( ',', trim( $temp[0] ) );
                                } else {
                                        $restriction = trim( $temp[1] );
-                                       if ( $restriction != '' ) { //some old entries are empty
+                                       if ( $restriction != '' ) { // some old entries are empty
                                                $this->mRestrictions[$temp[0]] = explode( ',', $restriction );
                                        }
                                }
@@ -4379,7 +4383,7 @@ class Title {
        /**
         * Updates page_touched for this page; called from LinksUpdate.php
         *
-        * @param integer $purgeTime TS_MW timestamp [optional]
+        * @param string $purgeTime [optional] TS_MW timestamp
         * @return bool True if the update succeeded
         */
        public function invalidateCache( $purgeTime = null ) {
@@ -4426,7 +4430,7 @@ class Title {
        /**
         * Get the last touched timestamp
         *
-        * @param DatabaseBase $db Optional db
+        * @param IDatabase $db Optional db
         * @return string Last-touched timestamp
         */
        public function getTouched( $db = null ) {
index e3636a0..20b75bf 100644 (file)
@@ -129,7 +129,7 @@ class User implements IDBAccessObject {
                'editmyuserjs',
                'editmywatchlist',
                'editsemiprotected',
-               'editusercssjs', #deprecated
+               'editusercssjs', # deprecated
                'editusercss',
                'edituserjs',
                'hideuser',
@@ -184,7 +184,7 @@ class User implements IDBAccessObject {
        protected static $mAllRights = false;
 
        /** Cache variables */
-       //@{
+       // @{
        public $mId;
        /** @var string */
        public $mName;
@@ -228,19 +228,19 @@ class User implements IDBAccessObject {
        protected $mOptionOverrides;
        /** @var string */
        protected $mPasswordExpires;
-       //@}
+       // @}
 
        /**
         * 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:
@@ -385,10 +385,10 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               // Try cache (unless this needs to lock the DB).
+               // Try cache (unless this needs data from the master DB).
                // NOTE: if this thread called saveSettings(), the cache was cleared.
-               $locking = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING );
-               if ( $locking || !$this->loadFromCache() ) {
+               $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() ) {
@@ -458,11 +458,12 @@ class User implements IDBAccessObject {
                $data['mVersion'] = self::VERSION;
                $key = wfMemcKey( 'user', 'id', $this->mId );
 
-               ObjectCache::getMainWANInstance()->set( $key, $data, 3600 );
+               $opts = DatabaseBase::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+               ObjectCache::getMainWANInstance()->set( $key, $data, 3600, $opts );
        }
 
        /** @name newFrom*() static factory methods */
-       //@{
+       // @{
 
        /**
         * Static factory method for creation from username.
@@ -573,7 +574,7 @@ class User implements IDBAccessObject {
                return $user;
        }
 
-       //@}
+       // @}
 
        /**
         * Get the username corresponding to a given user ID
@@ -799,7 +800,7 @@ class User implements IDBAccessObject {
         * @return bool
         */
        public function isValidPassword( $password ) {
-               //simple boolean wrapper for getPasswordValidity
+               // simple boolean wrapper for getPasswordValidity
                return $this->getPasswordValidity( $password ) === true;
        }
 
@@ -856,7 +857,7 @@ class User implements IDBAccessObject {
                );
 
                $status = Status::newGood();
-               $result = false; //init $result to false for the internal checks
+               $result = false; // init $result to false for the internal checks
 
                if ( !Hooks::run( 'isValidPassword', array( $password, &$result, $this ) ) ) {
                        $status->error( $result );
@@ -870,7 +871,7 @@ class User implements IDBAccessObject {
                        return $status;
                } else {
                        $status->error( $result );
-                       return $status; //the isValidPassword hook set a string $result and returned true
+                       return $status; // the isValidPassword hook set a string $result and returned true
                }
        }
 
@@ -934,7 +935,7 @@ class User implements IDBAccessObject {
         * the cached User object, we assume that whatever mechanism is setting
         * the expiration date is also expiring the User cache.
         * @since 1.23
-        * @return string|bool The datestamp of the expiration, or null if not set
+        * @return string|null The datestamp of the expiration, or null if not set
         */
        public function getPasswordExpireDate() {
                $this->load();
@@ -1203,18 +1204,15 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               $db = ( $flags & self::READ_LATEST )
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
+               list( $index, $options ) = DBAccessObjectUtils::getDBOptions( $flags );
+               $db = wfGetDB( $index );
 
                $s = $db->selectRow(
                        'user',
                        self::selectFields(),
                        array( 'user_id' => $this->mId ),
                        __METHOD__,
-                       ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING )
-                               ? array( 'LOCK IN SHARE MODE' )
-                               : array()
+                       $options
                );
 
                $this->queryFlagsUsed = $flags;
@@ -1431,7 +1429,7 @@ class User implements IDBAccessObject {
                        $this->addGroup( $group );
                }
                // update groups in external authentication database
-               Hooks::run( 'UserGroupsChanged', array( $this, $toPromote, array() ) );
+               Hooks::run( 'UserGroupsChanged', array( $this, $toPromote, array(), false ) );
                $wgAuth->updateExternalDBGroups( $this, $toPromote );
 
                $newGroups = array_merge( $oldGroups, $toPromote ); // all groups
@@ -1484,11 +1482,12 @@ class User implements IDBAccessObject {
 
                if ( $success ) {
                        $this->mTouched = $newTouched;
+                       $this->clearSharedCache();
+               } else {
+                       // Clears on failure too since that is desired if the cache is stale
+                       $this->clearSharedCache( 'refresh' );
                }
 
-               // Clears on failure too since that is desired if the cache is stale
-               $this->clearSharedCache();
-
                return $success;
        }
 
@@ -1694,6 +1693,7 @@ class User implements IDBAccessObject {
                        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
@@ -1701,6 +1701,7 @@ class User implements IDBAccessObject {
                                        } else {
                                                $host = "$ipReversed.{$base[0]}";
                                        }
+                                       $basename = $base[0];
                                } else {
                                        $host = "$ipReversed.$base";
                                }
@@ -1709,11 +1710,11 @@ class User implements IDBAccessObject {
                                $ipList = gethostbynamel( $host );
 
                                if ( $ipList ) {
-                                       wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $base!" );
+                                       wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $basename!" );
                                        $found = true;
                                        break;
                                } else {
-                                       wfDebugLog( 'dnsblacklist', "Requested $host, not found in $base." );
+                                       wfDebugLog( 'dnsblacklist', "Requested $host, not found in $basename." );
                                }
                        }
                }
@@ -2280,17 +2281,28 @@ class User implements IDBAccessObject {
        }
 
        /**
-        * Clear user data from memcached.
-        * Use after applying fun updates to the database; caller's
+        * 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() {
+       public function clearSharedCache( $mode = 'changed' ) {
                $id = $this->getId();
-               if ( $id ) {
-                       $key = wfMemcKey( 'user', 'id', $id );
-                       ObjectCache::getMainWANInstance()->delete( $key );
+               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 );
+                       } );
                }
        }
 
@@ -3496,7 +3508,7 @@ class User implements IDBAccessObject {
                        $request = $this->getRequest();
                }
                $params['secure'] = $secure;
-               $request->response()->setcookie( $name, $value, $exp, $params );
+               $request->response()->setCookie( $name, $value, $exp, $params );
        }
 
        /**
@@ -3696,7 +3708,7 @@ class User implements IDBAccessObject {
 
                if ( !$dbw->affectedRows() ) {
                        // Maybe the problem was a missed cache update; clear it to be safe
-                       $this->clearSharedCache();
+                       $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(
@@ -4840,7 +4852,7 @@ class User implements IDBAccessObject {
                $dbw->update(
                        'user',
                        array( 'user_editcount=user_editcount+1' ),
-                       array( 'user_id' => $this->getId() ),
+                       array( 'user_id' => $this->getId(), 'user_editcount IS NOT NULL' ),
                        __METHOD__
                );
                // Lazy initialization check...
@@ -5203,7 +5215,7 @@ class User implements IDBAccessObject {
                # 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( 'required' );
                $ret = array();
 
                # We can't actually do this right now, because Opera 9.6 will print out
index a19f698..0d1708f 100644 (file)
@@ -31,7 +31,7 @@ class UserRightsProxy {
         *
         * @see newFromId()
         * @see newFromName()
-        * @param DatabaseBase $db Db connection
+        * @param IDatabase $db Db connection
         * @param string $database Database name
         * @param string $name User name
         * @param int $id User ID
@@ -278,8 +278,9 @@ class UserRightsProxy {
                        array( 'user_id' => $this->id ),
                        __METHOD__ );
 
-               $cache = ObjectCache::getMainWANInstance();
                $key = wfForeignMemcKey( $this->database, false, 'user', 'id', $this->id );
-               $cache->delete( $key );
+               $this->db->onTransactionPreCommitOrIdle( function() use ( $key ) {
+                       ObjectCache::getMainWANInstance()->delete( $key );
+               } );
        }
 }
index b4b8be9..f402f3b 100644 (file)
@@ -315,7 +315,9 @@ class WebRequest {
                        }
                } else {
                        global $wgContLang;
-                       $data = isset( $wgContLang ) ? $wgContLang->normalize( $data ) : UtfNormal\Validator::cleanUp( $data );
+                       $data = isset( $wgContLang ) ?
+                               $wgContLang->normalize( $data ) :
+                               UtfNormal\Validator::cleanUp( $data );
                }
                return $data;
        }
@@ -754,7 +756,8 @@ class WebRequest {
         * Appends or replaces value of query variables.
         *
         * @param array $array Array of values to replace/add to query
-        * @param bool $onlyquery Whether to only return the query string and not the complete URL [deprecated]
+        * @param bool $onlyquery Whether to only return the query string
+        *  and not the complete URL [deprecated]
         * @return string
         */
        public function appendQueryArray( $array, $onlyquery = true ) {
index 1b6947c..bb7682d 100644 (file)
@@ -81,7 +81,7 @@ class WebResponse {
         *   'prefix', 'domain', and 'secure'
         * @since 1.22 Replaced $prefix, $domain, and $forceSecure with $options
         */
-       public function setcookie( $name, $value, $expire = 0, $options = array() ) {
+       public function setCookie( $name, $value, $expire = 0, $options = array() ) {
                global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
                global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
 
@@ -207,18 +207,74 @@ class FauxResponse extends WebResponse {
         * @param int|null $expire Ignored in this faux subclass.
         * @param array $options Ignored in this faux subclass.
         */
-       public function setcookie( $name, $value, $expire = 0, $options = array() ) {
-               $this->cookies[$name] = $value;
+       public function setCookie( $name, $value, $expire = 0, $options = array() ) {
+               global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
+               global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
+
+               if ( !is_array( $options ) ) {
+                       // Backwards compatibility
+                       $options = array( 'prefix' => $options );
+                       if ( func_num_args() >= 5 ) {
+                               $options['domain'] = func_get_arg( 4 );
+                       }
+                       if ( func_num_args() >= 6 ) {
+                               $options['secure'] = func_get_arg( 5 );
+                       }
+               }
+               $options = array_filter( $options, function ( $a ) {
+                       return $a !== null;
+               } ) + array(
+                       'prefix' => $wgCookiePrefix,
+                       'domain' => $wgCookieDomain,
+                       'path' => $wgCookiePath,
+                       'secure' => $wgCookieSecure,
+                       'httpOnly' => $wgCookieHttpOnly,
+                       'raw' => false,
+               );
+
+               if ( $expire === null ) {
+                       $expire = 0; // Session cookie
+               } elseif ( $expire == 0 && $wgCookieExpiration != 0 ) {
+                       $expire = time() + $wgCookieExpiration;
+               }
+
+               $this->cookies[$options['prefix'] . $name] = array(
+                       'value' => (string)$value,
+                       'expire' => (int)$expire,
+                       'path' => (string)$options['path'],
+                       'domain' => (string)$options['domain'],
+                       'secure' => (bool)$options['secure'],
+                       'httpOnly' => (bool)$options['httpOnly'],
+                       'raw' => (bool)$options['raw'],
+               );
        }
 
        /**
         * @param string $name
         * @return string|null
         */
-       public function getcookie( $name ) {
+       public function getCookie( $name ) {
+               if ( isset( $this->cookies[$name] ) ) {
+                       return $this->cookies[$name]['value'];
+               }
+               return null;
+       }
+
+       /**
+        * @param string $name
+        * @return array|null
+        */
+       public function getCookieData( $name ) {
                if ( isset( $this->cookies[$name] ) ) {
                        return $this->cookies[$name];
                }
                return null;
        }
+
+       /**
+        * @return array
+        */
+       public function getCookies() {
+               return $this->cookies;
+       }
 }
index f5a4f93..b095577 100644 (file)
 # Die if register_globals is enabled (PHP <=5.3)
 # This must be done before any globals are set by the code
 if ( ini_get( 'register_globals' ) ) {
-       die( 'MediaWiki does not support installations where register_globals is enabled. '
-               . 'Please see <a href="https://www.mediawiki.org/wiki/register_globals">mediawiki.org</a> '
+       die( 'MediaWiki does not support installations where register_globals is enabled. Please see '
+               . '<a href="https://www.mediawiki.org/wiki/register_globals">mediawiki.org</a> '
                . 'for help on how to disable it.' );
 }
 
 if ( function_exists( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc() ) {
-       die( 'MediaWiki does not function when magic quotes are enabled. '
-               . 'Please see the <a href="https://php.net/manual/security.magicquotes.disabling.php">PHP Manual</a> '
+       die( 'MediaWiki does not function when magic quotes are enabled. Please see the '
+               . '<a href="https://php.net/manual/security.magicquotes.disabling.php">PHP Manual</a> '
                . 'for help on how to disable magic quotes.' );
 }
 
index 027ff72..6215af1 100644 (file)
@@ -51,7 +51,7 @@ class WikiMap {
 
                $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
                        array( 'lang' => $minor, 'site' => $major ) );
-               return new WikiReference( $major, $minor, $canonicalServer, $path, $server );
+               return new WikiReference( $canonicalServer, $path, $server );
        }
 
        /**
@@ -127,22 +127,16 @@ class WikiMap {
  * Reference to a locally-hosted wiki
  */
 class WikiReference {
-       private $mMinor; ///< 'en', 'meta', 'mediawiki', etc
-       private $mMajor; ///< 'wiki', 'wiktionary', etc
        private $mCanonicalServer; ///< canonical server URL, e.g. 'https://www.mediawiki.org'
        private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
        private $mPath;   ///< path, '/wiki/$1'
 
        /**
-        * @param string $major
-        * @param string $minor
         * @param string $canonicalServer
         * @param string $path
         * @param null|string $server
         */
-       public function __construct( $major, $minor, $canonicalServer, $path, $server = null ) {
-               $this->mMajor = $major;
-               $this->mMinor = $minor;
+       public function __construct( $canonicalServer, $path, $server = null ) {
                $this->mCanonicalServer = $canonicalServer;
                $this->mPath = $path;
                $this->mServer = $server === null ? $canonicalServer : $server;
@@ -159,7 +153,8 @@ class WikiReference {
                if ( $parsed ) {
                        return $parsed['host'];
                } else {
-                       // Invalid server spec. There's no sane thing to do here, so just return the canonical server name in full
+                       // Invalid server spec.
+                       // There's no sane thing to do here, so just return the canonical server name in full.
                        return $this->mCanonicalServer;
                }
        }
@@ -169,7 +164,8 @@ class WikiReference {
         *
         * @todo FIXME: This may be generalized...
         *
-        * @param string $page Page name (must be normalised before calling this function! May contain a section part.)
+        * @param string $page Page name (must be normalised before calling this function!
+        *  May contain a section part.)
         * @param string|null $fragmentId
         *
         * @return string relative URL, without the server part.
index 37cffde..11f14db 100644 (file)
@@ -711,10 +711,10 @@ class Xml {
                xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
 
                if ( !xml_parse( $parser, $text, true ) ) {
-                       //$err = xml_error_string( xml_get_error_code( $parser ) );
-                       //$position = xml_get_current_byte_index( $parser );
-                       //$fragment = $this->extractFragment( $html, $position );
-                       //$this->mXmlError = "$err at byte $position:\n$fragment";
+                       // $err = xml_error_string( xml_get_error_code( $parser ) );
+                       // $position = xml_get_current_byte_index( $parser );
+                       // $fragment = $this->extractFragment( $html, $position );
+                       // $this->mXmlError = "$err at byte $position:\n$fragment";
                        xml_parser_free( $parser );
                        return false;
                }
index 893ae04..9e7d12c 100644 (file)
@@ -239,7 +239,7 @@ $zh2Hant = array(
 '决' => '決',
 '况' => '況',
 '冻' => '凍',
-'净' => '',
+'净' => '',
 '凄' => '淒',
 '凉' => '涼',
 '减' => '減',
@@ -3720,7 +3720,7 @@ $zh2Hant = array(
 '人生天里' => '人生天里',
 '人发指' => '人髮指',
 '什锦面' => '什錦麵',
-'ä»\87ä»\87' => 'ä»\87è®\8e',
+'ä»\81è´µ' => 'ä»\81è²´',
 '介胄' => '介冑',
 '他干的' => '他幹的',
 '他钟' => '他鐘',
@@ -3846,7 +3846,6 @@ $zh2Hant = array(
 '倦游' => '倦遊',
 '假里' => '假裡',
 '假托' => '假託',
-'假里白' => '假里白',
 '假发' => '假髮',
 '偎干' => '偎乾',
 '停停当当' => '停停當當',
@@ -4144,7 +4143,6 @@ $zh2Hant = array(
 '力拼众敌' => '力拼眾敵',
 '力争上游' => '力爭上遊',
 '功勋' => '功勳',
-'功致' => '功緻',
 '加氢精制' => '加氫精制',
 '劣于' => '劣於',
 '助于' => '助於',
@@ -4237,6 +4235,7 @@ $zh2Hant = array(
 '去山里' => '去山裡',
 '参数只' => '參數只',
 '参数里' => '參數裡',
+'反应制得' => '反應製得',
 '反朴' => '反樸',
 '反冲' => '反衝',
 '反复制' => '反複製',
@@ -4408,6 +4407,7 @@ $zh2Hant = array(
 '命中注定' => '命中注定',
 '和奸' => '和姦',
 '和制汉' => '和製漢',
+'和制英语' => '和製英語',
 '咎征' => '咎徵',
 '咕咕钟' => '咕咕鐘',
 '咪表' => '咪錶',
@@ -4672,6 +4672,7 @@ $zh2Hant = array(
 '大只' => '大隻',
 '大风后' => '大風後',
 '天克地冲' => '天克地衝',
+'天台' => '天台',
 '天后' => '天后',
 '天后宫' => '天后宮',
 '天地志狼' => '天地志狼',
@@ -4928,7 +4929,6 @@ $zh2Hant = array(
 '巡回' => '巡迴',
 '巡游' => '巡遊',
 '工作台' => '工作檯',
-'工致' => '工緻',
 '左冲右突' => '左衝右突',
 '巧干' => '巧幹',
 '巧历' => '巧曆',
@@ -5034,6 +5034,7 @@ $zh2Hant = array(
 '几只' => '幾隻',
 '几出' => '幾齣',
 '广部' => '广部',
+'庄司' => '庄司',
 '床席' => '床蓆',
 '店里' => '店裡',
 '府干卿' => '府干卿',
@@ -5130,7 +5131,7 @@ $zh2Hant = array(
 '影后' => '影后',
 '影相吊' => '影相弔',
 '役于' => '役於',
-'往日仇' => '往日無讎',
+'往日仇' => '往日無讎',
 '往里' => '往裡',
 '待复' => '待覆',
 '很干' => '很乾',
@@ -5382,6 +5383,7 @@ $zh2Hant = array(
 '凄酸' => '悽酸',
 '情欲' => '情慾',
 '惇朴' => '惇樸',
+'惠文后' => '惠文后',
 '恶仆' => '惡僕',
 '恶直丑正' => '惡直醜正',
 '恶斗' => '惡鬥',
@@ -5417,6 +5419,8 @@ $zh2Hant = array(
 '宪法里' => '憲法裡',
 '恳托' => '懇託',
 '懈松' => '懈鬆',
+'应制得' => '應制得',
+'應制得' => '應制得',
 '应征' => '應徵',
 '应钟' => '應鐘',
 '懔栗' => '懍慄',
@@ -5504,8 +5508,7 @@ $zh2Hant = array(
 '批复' => '批覆',
 '批注' => '批註',
 '批斗' => '批鬥',
-'抑制作用' => '抑制作用',
-'抑制剂' => '抑制劑',
+'抑制' => '抑制',
 '抑郁' => '抑鬱',
 '抓奸' => '抓姦',
 '抓斗' => '抓鬥',
@@ -5762,7 +5765,6 @@ $zh2Hant = array(
 '摭采' => '摭採',
 '摸棱' => '摸稜',
 '摸钟' => '摸鐘',
-'折合' => '摺合',
 '折奏' => '摺奏',
 '折子' => '摺子',
 '折尺' => '摺尺',
@@ -5797,7 +5799,6 @@ $zh2Hant = array(
 '据云' => '據云',
 '擢发' => '擢髮',
 '擦干' => '擦乾',
-'擦干净' => '擦乾淨',
 '拧干' => '擰乾',
 '摆钟' => '擺鐘',
 '摄制' => '攝製',
@@ -5935,6 +5936,7 @@ $zh2Hant = array(
 '历始' => '曆始',
 '历室' => '曆室',
 '历尾' => '曆尾',
+'历局' => '曆局',
 '历数书' => '曆數書',
 '历日' => '曆日',
 '历书' => '曆書',
@@ -6074,7 +6076,6 @@ $zh2Hant = array(
 '栗栖溪' => '栗栖溪',
 '校准' => '校準',
 '校舍' => '校舍',
-'校仇学' => '校讎學',
 '核准的' => '核准的',
 '格于' => '格於',
 '格范' => '格範',
@@ -6130,8 +6131,6 @@ $zh2Hant = array(
 '标志' => '標誌',
 '模棱' => '模稜',
 '模范' => '模範',
-'模范14棒' => '模范14棒',
-'模范21棒' => '模范21棒',
 '模范七棒' => '模范七棒',
 '模范三军' => '模范三軍',
 '模范三軍' => '模范三軍',
@@ -6178,6 +6177,7 @@ $zh2Hant = array(
 '台面上' => '檯面上',
 '台面化' => '檯面化',
 '柜台' => '櫃檯',
+'柜里' => '櫃裡',
 '栉发工' => '櫛髮工',
 '欲海难填' => '欲海難填',
 '欺蒙' => '欺矇',
@@ -6540,6 +6540,7 @@ $zh2Hant = array(
 '为准' => '為準',
 '为鉴' => '為鑑',
 '乌兹冲锋枪' => '烏茲衝鋒槍',
+'乌苏里' => '烏蘇里',
 '乌发' => '烏髮',
 '乌龙面' => '烏龍麵',
 '烘干' => '烘乾',
@@ -6551,7 +6552,6 @@ $zh2Hant = array(
 '无征不信' => '無徵不信',
 '无业游民' => '無業游民',
 '无梁楼盖' => '無樑樓蓋',
-'無言不仇' => '無言不讎',
 '无余' => '無餘',
 '炼制' => '煉製',
 '煎面' => '煎麵',
@@ -6589,6 +6589,7 @@ $zh2Hant = array(
 '爽荡' => '爽蕩',
 '尔冬陞' => '爾冬陞',
 '墙里' => '牆裡',
+'片里' => '片裡',
 '片言只语' => '片言隻語',
 '版图里' => '版圖裡',
 '牙签' => '牙籤',
@@ -6860,7 +6861,7 @@ $zh2Hant = array(
 '磨炼' => '磨鍊',
 '磬钟' => '磬鐘',
 '硗确' => '磽确',
-'砻谷机' => '礱穀機',
+'砻谷' => '礱穀',
 '示范' => '示範',
 '社里' => '社裡',
 '祝赞' => '祝讚',
@@ -6894,7 +6895,6 @@ $zh2Hant = array(
 '私欲' => '私慾',
 '私斗' => '私鬥',
 '秋游' => '秋遊',
-'秋发' => '秋髮',
 '种丹妮' => '种丹妮',
 '种师中' => '种師中',
 '种师道' => '种師道',
@@ -7035,8 +7035,7 @@ $zh2Hant = array(
 '算历' => '算曆',
 '算历史' => '算歷史',
 '算准' => '算準',
-'算发' => '算髮',
-'管制法' => '管制法',
+'管制' => '管制',
 '管干' => '管幹',
 '箱里' => '箱裡',
 '节欲' => '節慾',
@@ -7069,6 +7068,7 @@ $zh2Hant = array(
 '米沈' => '米瀋',
 '米谷' => '米穀',
 '米团' => '米糰',
+'米余' => '米餘',
 '米面' => '米麵',
 '粉签子' => '粉籤子',
 '粗制' => '粗製',
@@ -7408,6 +7408,7 @@ $zh2Hant = array(
 '艷后' => '艷后',
 '艸木丰丰' => '艸木丰丰',
 '芒果干' => '芒果乾',
+'花不要采' => '花不要採',
 '花卷' => '花捲',
 '花盆里' => '花盆裡',
 '花菴词选' => '花菴詞選',
@@ -7421,7 +7422,7 @@ $zh2Hant = array(
 '苦于' => '苦於',
 '苦里' => '苦裡',
 '苦斗' => '苦鬥',
-'è\8b\8e麻' => '苧麻',
+'è\8b§麻' => '苧麻',
 '茂都淀' => '茂都澱',
 '范文同' => '范文同',
 '范文正公' => '范文正公',
@@ -7477,6 +7478,8 @@ $zh2Hant = array(
 '落发' => '落髮',
 '叶叶琴' => '葉叶琴',
 '叶叶琹' => '葉叶琹',
+'叶阳后' => '葉陽后',
+'葉陽后' => '葉陽后',
 '葡萄干' => '葡萄乾',
 '董氏封发' => '董氏封髮',
 '葫芦里卖甚么药' => '葫蘆裡賣甚麼藥',
@@ -7554,7 +7557,6 @@ $zh2Hant = array(
 '借此' => '藉此',
 '借由' => '藉由',
 '借箸代筹' => '藉箸代籌',
-'借词' => '藉詞',
 '借资' => '藉資',
 '蓝淀' => '藍澱',
 '藏于' => '藏於',
@@ -7675,6 +7677,7 @@ $zh2Hant = array(
 '裁制' => '裁製',
 '里水镇' => '裏水鎮',
 '里海' => '裏海',
+'里白' => '裏白',
 '里运河' => '裏運河',
 '补于' => '補於',
 '补注' => '補註',
@@ -7706,6 +7709,7 @@ $zh2Hant = array(
 '制图' => '製圖',
 '制得' => '製得',
 '制成' => '製成',
+'制毒' => '製毒',
 '制法' => '製法',
 '制浆' => '製漿',
 '制片' => '製片',
@@ -7715,6 +7719,8 @@ $zh2Hant = array(
 '制纸' => '製紙',
 '制药' => '製藥',
 '制衣' => '製衣',
+'制表键' => '製表鍵',
+'制贩' => '製販',
 '制造' => '製造',
 '制革' => '製革',
 '制鞋' => '製鞋',
@@ -7792,7 +7798,6 @@ $zh2Hant = array(
 '见素抱朴' => '見素抱樸',
 '见钟不打' => '見鐘不打',
 '规范' => '規範',
-'視如寇仇' => '視如寇讎',
 '视于' => '視於',
 '观采' => '觀採',
 '角抵' => '角牴',
@@ -7824,7 +7829,6 @@ $zh2Hant = array(
 '托命' => '託命',
 '托咎' => '託咎',
 '托梦' => '託夢',
-'托大' => '託大',
 '托孤' => '託孤',
 '托庇' => '託庇',
 '托故' => '託故',
@@ -7970,7 +7974,6 @@ $zh2Hant = array(
 '护发' => '護髮',
 '变征' => '變徵',
 '变丑' => '變醜',
-'仇正' => '讎正',
 '仇隙' => '讎隙',
 '赞不绝口' => '讚不絕口',
 '赞佩' => '讚佩',
@@ -8004,6 +8007,8 @@ $zh2Hant = array(
 '贵征' => '貴徵',
 '买凶' => '買兇',
 '买断发' => '買斷發',
+'費米面' => '費米面',
+'费米面' => '費米面',
 '贻范' => '貽範',
 '賈后' => '賈后',
 '贾后' => '賈后',
@@ -8027,6 +8032,7 @@ $zh2Hant = array(
 '走回路' => '走回路',
 '起哄' => '起鬨',
 '超级杯' => '超級盃',
+'超赞' => '超讚',
 '赶制' => '趕製',
 '赶面棍' => '趕麵棍',
 '赵威后' => '趙威后',
@@ -8088,7 +8094,7 @@ $zh2Hant = array(
 '农民历' => '農民曆',
 '农民历史' => '農民歷史',
 '迂回' => '迂迴',
-'近日仇' => '近日無讎',
+'近日仇' => '近日無讎',
 '返朴' => '返樸',
 '迥然回异' => '迥然迴異',
 '迫于' => '迫於',
@@ -8196,6 +8202,7 @@ $zh2Hant = array(
 '游必有方' => '遊必有方',
 '游憩' => '遊憩',
 '游戏' => '遊戲',
+'游戏里' => '遊戲裡',
 '游手好闲' => '遊手好閒',
 '游方' => '遊方',
 '游星' => '遊星',
@@ -8231,6 +8238,7 @@ $zh2Hant = array(
 '游魂' => '遊魂',
 '过于' => '過於',
 '过水面' => '過水麵',
+'遏制' => '遏制',
 '道范' => '道範',
 '逊于' => '遜於',
 '递回' => '遞迴',
@@ -8384,6 +8392,7 @@ $zh2Hant = array(
 '金仆姑' => '金僕姑',
 '金城里' => '金城里',
 '金范' => '金範',
+'金圣叹' => '金聖歎',
 '金表情' => '金表情',
 '金表态' => '金表態',
 '金表扬' => '金表揚',
@@ -8664,9 +8673,11 @@ $zh2Hant = array(
 '零只' => '零隻',
 '零余' => '零餘',
 '电子表格' => '電子表格',
+'电子制表' => '電子製表',
 '电子钟' => '電子鐘',
 '电子钟表' => '電子鐘錶',
 '电影后' => '電影後',
+'电影里' => '電影裡',
 '电梯里' => '電梯裡',
 '电波钟' => '電波鐘',
 '电码表' => '電碼表',
@@ -8950,6 +8961,7 @@ $zh2Hant = array(
 '体征' => '體徵',
 '体范' => '體範',
 '体系' => '體系',
+'体里' => '體裡',
 '高几' => '高几',
 '高后' => '高后',
 '高干扰' => '高干擾',
@@ -11012,6 +11024,7 @@ $zh2Hans = array(
 '統' => '统',
 '絲' => '丝',
 '絳' => '绛',
+'絶' => '绝',
 '絹' => '绢',
 '絺' => '𫄨',
 '綀' => '𦈌',
@@ -13550,8 +13563,10 @@ $zh2Hans = array(
 '於菟' => '於菟',
 '於賢德' => '於贤德',
 '於除鞬' => '於除鞬',
+'施讎' => '施雠',
 '旋乾轉坤' => '旋乾转坤',
 '旋乾转坤' => '旋乾转坤',
+'無言不讎' => '无言不雠',
 '曠若發矇' => '旷若发矇',
 '崑崙' => '昆仑',
 '崑劇' => '昆剧',
@@ -13757,6 +13772,7 @@ $zh2Hans = array(
 '讎夷' => '雠夷',
 '讎定' => '雠定',
 '讎校' => '雠校',
+'讎正' => '雠正',
 '讎問' => '雠问',
 '項鍊' => '项链',
 '飛昇' => '飞升',
@@ -13782,15 +13798,25 @@ $zh2Hans = array(
 );
 
 $zh2TW = array(
+'0字节' => '0位元組',
 '0杆' => '0桿',
+'1字节' => '1位元組',
 '1杆' => '1桿',
+'2字节' => '2位元組',
 '2杆' => '2桿',
+'3字节' => '3位元組',
 '3杆' => '3桿',
+'4字节' => '4位元組',
 '4杆' => '4桿',
+'5字节' => '5位元組',
 '5杆' => '5桿',
+'6字节' => '6位元組',
 '6杆' => '6桿',
+'7字节' => '7位元組',
 '7杆' => '7桿',
+'8字节' => '8位元組',
 '8杆' => '8桿',
+'9字节' => '9位元組',
 '9杆' => '9桿',
 '甲型肝炎' => 'A型肝炎',
 '甲肝' => 'A肝',
@@ -13826,6 +13852,7 @@ $zh2TW = array(
 '阿斯旺' => '亞斯文',
 '人工智能' => '人工智慧',
 '人机交互' => '人機互動',
+'行人路' => '人行道',
 '石勒苏益格' => '什勒斯維希',
 '石勒蘇益格' => '什勒斯維希',
 '界面' => '介面',
@@ -13939,6 +13966,7 @@ $zh2TW = array(
 '端口' => '埠',
 '首席执行官' => '執行長',
 '报道' => '報導',
+'塑料袋' => '塑膠袋',
 '塞舌尔' => '塞席爾',
 '塞舌爾' => '塞席爾',
 '萨拉热窝' => '塞拉耶佛',
@@ -14391,6 +14419,8 @@ $zh2TW = array(
 '荧光' => '螢光',
 '荧屏' => '螢屏',
 '屏幕' => '螢幕',
+'行人路权' => '行人路權',
+'行人路權' => '行人路權',
 '流動網絡' => '行動網路',
 '移动网络' => '行動網路',
 '流動電話' => '行動電話',
@@ -14544,6 +14574,16 @@ $zh2TW = array(
 );
 
 $zh2HK = array(
+'0字节' => '0位元組',
+'1字节' => '1位元組',
+'2字节' => '2位元組',
+'3字节' => '3位元組',
+'4字节' => '4位元組',
+'5字节' => '5位元組',
+'6字节' => '6位元組',
+'7字节' => '7位元組',
+'8字节' => '8位元組',
+'9字节' => '9位元組',
 'IP地址' => 'IP位址',
 '·威尔士' => '·威爾士',
 '·威爾士' => '·威爾士',
@@ -14665,8 +14705,6 @@ $zh2HK = array(
 '布雷;' => '佈雷;',
 '布点' => '佈點',
 '布點' => '佈點',
-'字節' => '位元組',
-'字节' => '位元組',
 '低著' => '低着',
 '低著作' => '低著作',
 '低著名' => '低著名',
@@ -15054,7 +15092,6 @@ $zh2HK = array(
 '卡普里亚蒂' => '卡佩雅蒂',
 '喀拉蚩' => '卡拉奇',
 '卡斯楚' => '卡斯特羅',
-'臥' => '卧',
 '印著' => '印着',
 '印著作' => '印著作',
 '印著名' => '印著名',
@@ -15443,9 +15480,9 @@ $zh2HK = array(
 '幹著名' => '幹著名',
 '幹著稱' => '幹著稱',
 '幾內亞比索' => '幾內亞比紹',
-'庫德人' => '库爾德人',
-'庫德族' => '库爾德族',
 '店里' => '店裏',
+'庫德人' => '庫爾德人',
+'庫德族' => '庫爾德族',
 '坎城' => '康城',
 '戛纳' => '康城',
 '庙里' => '廟裏',
@@ -15970,6 +16007,9 @@ $zh2HK = array(
 '村里' => '村裏',
 '杜塞道夫' => '杜塞爾多夫',
 '迪拜' => '杜拜',
+'東協助' => '東協助',
+'東協會' => '東協會',
+'東協議' => '東協議',
 '東南亞國家協會' => '東南亞國家聯盟',
 '亚细安' => '東盟',
 '東協' => '東盟',
@@ -16031,6 +16071,7 @@ $zh2HK = array(
 '机器人' => '機械人',
 '機器人' => '機械人',
 '柜台' => '櫃枱',
+'柜里' => '櫃裏',
 '历史里' => '歷史裏',
 '死里求生' => '死裏求生',
 '死里逃生' => '死裏逃生',
@@ -16721,6 +16762,7 @@ $zh2HK = array(
 '膠著者' => '膠著者',
 '膠著述' => '膠著述',
 '膠著錄' => '膠著錄',
+'塑料袋' => '膠袋',
 '臨著' => '臨着',
 '臨著作' => '臨著作',
 '臨著名' => '臨著名',
@@ -16828,6 +16870,7 @@ $zh2HK = array(
 '蜜里调油' => '蜜裏調油',
 '荧屏' => '螢屏',
 '屏幕' => '螢幕',
+'人行道' => '行人路',
 '行家里手' => '行家裏手',
 '首席执行官' => '行政總裁',
 '行著' => '行着',
@@ -17170,6 +17213,7 @@ $zh2HK = array(
 '遇著者' => '遇著者',
 '遇著述' => '遇著述',
 '遇著錄' => '遇著錄',
+'游戏里' => '遊戲裏',
 '遍布' => '遍佈',
 '遍佈著' => '遍佈着',
 '遍布著' => '遍佈着',
@@ -17359,6 +17403,7 @@ $zh2HK = array(
 '云里雾里' => '雲裏霧裏',
 '莱特湾' => '雷伊泰灣',
 '萊特灣' => '雷伊泰灣',
+'电影里' => '電影裏',
 '晶体管' => '電晶體',
 '晶體管' => '電晶體',
 '电梯里' => '電梯裏',
@@ -17462,6 +17507,7 @@ $zh2HK = array(
 '騙著述' => '騙著述',
 '騙著錄' => '騙著錄',
 '驶著' => '驶着',
+'体里' => '體裏',
 '高畫質' => '高清',
 '高著' => '高着',
 '高著作' => '高著作',
@@ -17585,6 +17631,9 @@ $zh2CN = array(
 '邱吉爾' => '丘吉尔',
 'C型肝炎' => '丙型肝炎',
 'C肝' => '丙肝',
+'東協會' => '东协会',
+'東協助' => '东协助',
+'東協議' => '东协议',
 '東南亞國家協會' => '东南亚国家联盟',
 '亚细安' => '东盟',
 '東協' => '东盟',
@@ -17666,6 +17715,7 @@ $zh2CN = array(
 '亮著者' => '亮著者',
 '亮著述' => '亮著述',
 '人工智慧' => '人工智能',
+'行人路' => '人行道',
 '甚麼' => '什么',
 '甚麽' => '什么',
 '仗著' => '仗着',
@@ -18183,6 +18233,7 @@ $zh2CN = array(
 '吉里巴斯' => '基里巴斯',
 '堂姊' => '堂姐',
 '坎培拉' => '堪培拉',
+'塑膠袋' => '塑料袋',
 '塞爾維亞與蒙特內哥羅' => '塞尔维亚和黑山',
 '塞拉利昂' => '塞拉利昂',
 '塞普勒斯' => '塞浦路斯',
@@ -19631,6 +19682,8 @@ $zh2CN = array(
 '蘸著稱' => '蘸著称',
 '蘸著者' => '蘸著者',
 '蘸著述' => '蘸著述',
+'行人路权' => '行人路权',
+'行人路權' => '行人路权',
 '行著' => '行着',
 '行著書' => '行著书',
 '行著作' => '行著作',
index 43f03c3..6ddc596 100644 (file)
@@ -370,7 +370,7 @@ abstract class Action {
         * Returns the description that goes below the \<h1\> tag
         * @since 1.17
         *
-        * @return string
+        * @return string HTML
         */
        protected function getDescription() {
                return $this->msg( strtolower( $this->getName() ) )->escaped();
index 26f43cb..aa201d7 100644 (file)
@@ -31,7 +31,10 @@ abstract class FormAction extends Action {
         * Get an HTMLForm descriptor array
         * @return array
         */
-       abstract protected function getFormFields();
+       protected function getFormFields() {
+               // Default to an empty form with just a submit button
+               return array();
+       }
 
        /**
         * Add pre- or post-text to the form
@@ -68,13 +71,16 @@ abstract class FormAction extends Action {
                $form = new HTMLForm( $this->fields, $this->getContext(), $this->getName() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
 
+               $title = $this->getTitle();
+               $form->setAction( $title->getLocalURL( array( 'action' => $this->getName() ) ) );
                // Retain query parameters (uselang etc)
-               $form->addHiddenField( 'action', $this->getName() ); // Might not be the same as the query string
                $params = array_diff_key(
                        $this->getRequest()->getQueryValues(),
                        array( 'action' => null, 'title' => null )
                );
-               $form->addHiddenField( 'redirectparams', wfArrayToCgi( $params ) );
+               if ( $params ) {
+                       $form->addHiddenField( 'redirectparams', wfArrayToCgi( $params ) );
+               }
 
                $form->addPreText( $this->preText() );
                $form->addPostText( $this->postText() );
@@ -87,9 +93,10 @@ abstract class FormAction extends Action {
        }
 
        /**
-        * Process the form on POST submission.  If you return false from getFormFields(),
-        * this will obviously never be reached.  If you don't want to do anything with the
-        * form, just return false here
+        * Process the form on POST submission.
+        *
+        * If you don't want to do anything with the form, just return false here.
+        *
         * @param array $data
         * @return bool|array True for success, false for didn't-try, array of errors on failure
         */
index f3670a8..4e74ed3 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Actions
  */
 class InfoAction extends FormlessAction {
-       const CACHE_VERSION = '2013-03-17';
+       const VERSION = 1;
 
        /**
         * Returns the name of the action this object responds to.
@@ -65,15 +65,13 @@ class InfoAction extends FormlessAction {
         * @param int|null $revid Revision id to clear
         */
        public static function invalidateCache( Title $title, $revid = null ) {
-               $cache = ObjectCache::getMainWANInstance();
-
                if ( !$revid ) {
                        $revision = Revision::newFromTitle( $title, 0, Revision::READ_LATEST );
                        $revid = $revision ? $revision->getId() : null;
                }
                if ( $revid !== null ) {
-                       $key = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $revid );
-                       $cache->delete( $key );
+                       $key = self::getCacheKey( $title, $revid );
+                       ObjectCache::getMainWANInstance()->delete( $key );
                }
        }
 
@@ -141,11 +139,6 @@ class InfoAction extends FormlessAction {
                        $content .= $this->msg( 'pageinfo-footer' )->parse();
                }
 
-               // Page credits
-               /*if ( $this->page->exists() ) {
-                       $content .= Html::rawElement( 'div', array( 'id' => 'mw-credits' ), $this->getContributors() );
-               }*/
-
                return $content;
        }
 
@@ -171,10 +164,13 @@ class InfoAction extends FormlessAction {
         * @return string The table with the row added
         */
        protected function addRow( $table, $name, $value, $id ) {
-               return $table . Html::rawElement( 'tr', $id === null ? array() : array( 'id' => 'mw-' . $id ),
-                       Html::rawElement( 'td', array( 'style' => 'vertical-align: top;' ), $name ) .
-                       Html::rawElement( 'td', array(), $value )
-               );
+               return $table .
+                       Html::rawElement(
+                               'tr',
+                               $id === null ? array() : array( 'id' => 'mw-' . $id ),
+                               Html::rawElement( 'td', array( 'style' => 'vertical-align: top;' ), $name ) .
+                                       Html::rawElement( 'td', array(), $value )
+                       );
        }
 
        /**
@@ -205,18 +201,7 @@ class InfoAction extends FormlessAction {
                $id = $title->getArticleID();
                $config = $this->context->getConfig();
 
-               $cache = ObjectCache::getMainWANInstance();
-               $memcKey = wfMemcKey( 'infoaction',
-                       sha1( $title->getPrefixedText() ), $this->page->getLatest() );
-               $pageCounts = $cache->get( $memcKey );
-               $version = isset( $pageCounts['cacheversion'] ) ? $pageCounts['cacheversion'] : false;
-               if ( $pageCounts === false || $version !== self::CACHE_VERSION ) {
-                       // Get page information that would be too "expensive" to retrieve by normal means
-                       $pageCounts = $this->pageCounts( $title );
-                       $pageCounts['cacheversion'] = self::CACHE_VERSION;
-
-                       $cache->set( $memcKey, $pageCounts );
-               }
+               $pageCounts = $this->pageCounts( $this->page );
 
                // Get page properties
                $dbr = wfGetDB( DB_SLAVE );
@@ -318,7 +303,8 @@ class InfoAction extends FormlessAction {
                $policy = $this->page->getRobotPolicy( 'view', $pOutput );
                $pageInfo['header-basic'][] = array(
                        // Messages: pageinfo-robot-index, pageinfo-robot-noindex
-                       $this->msg( 'pageinfo-robot-policy' ), $this->msg( "pageinfo-robot-${policy['index']}" )
+                       $this->msg( 'pageinfo-robot-policy' ),
+                       $this->msg( "pageinfo-robot-${policy['index']}" )
                );
 
                $unwatchedPageThreshold = $config->get( 'UnwatchedPageThreshold' );
@@ -384,7 +370,8 @@ class InfoAction extends FormlessAction {
 
                // Subpages of this page, if subpages are enabled for the current NS
                if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
-                       $prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' );
+                       $prefixIndex = SpecialPage::getTitleFor(
+                               'Prefixindex', $title->getPrefixedText() . '/' );
                        $pageInfo['header-basic'][] = array(
                                Linker::link( $prefixIndex, $this->msg( 'pageinfo-subpages-name' )->escaped() ),
                                $this->msg( 'pageinfo-subpages-value' )
@@ -434,7 +421,8 @@ class InfoAction extends FormlessAction {
                        $sources = $title->getCascadeProtectionSources(); // Array deferencing is in PHP 5.4 :(
 
                        foreach ( $sources[0] as $sourceTitle ) {
-                               $cascadingFrom .= Html::rawElement( 'li', array(), Linker::linkKnown( $sourceTitle ) );
+                               $cascadingFrom .= Html::rawElement(
+                                       'li', array(), Linker::linkKnown( $sourceTitle ) );
                        }
 
                        $cascadingFrom = Html::rawElement( 'ul', array(), $cascadingFrom );
@@ -542,7 +530,9 @@ class InfoAction extends FormlessAction {
                                $this->msg( 'pageinfo-lasttime' ),
                                Linker::linkKnown(
                                        $title,
-                                       htmlspecialchars( $lang->userTimeAndDate( $this->page->getTimestamp(), $user ) ),
+                                       htmlspecialchars(
+                                               $lang->userTimeAndDate( $this->page->getTimestamp(), $user )
+                                       ),
                                        array(),
                                        array( 'oldid' => $this->page->getLatest() )
                                )
@@ -555,19 +545,23 @@ class InfoAction extends FormlessAction {
                );
 
                // Total number of distinct authors
-               $pageInfo['header-edits'][] = array(
-                       $this->msg( 'pageinfo-authors' ), $lang->formatNum( $pageCounts['authors'] )
-               );
+               if ( $pageCounts['authors'] > 0 ) {
+                       $pageInfo['header-edits'][] = array(
+                               $this->msg( 'pageinfo-authors' ), $lang->formatNum( $pageCounts['authors'] )
+                       );
+               }
 
                // Recent number of edits (within past 30 days)
                $pageInfo['header-edits'][] = array(
-                       $this->msg( 'pageinfo-recent-edits', $lang->formatDuration( $config->get( 'RCMaxAge' ) ) ),
+                       $this->msg( 'pageinfo-recent-edits',
+                               $lang->formatDuration( $config->get( 'RCMaxAge' ) ) ),
                        $lang->formatNum( $pageCounts['recent_edits'] )
                );
 
                // Recent number of distinct authors
                $pageInfo['header-edits'][] = array(
-                       $this->msg( 'pageinfo-recent-authors' ), $lang->formatNum( $pageCounts['recent_authors'] )
+                       $this->msg( 'pageinfo-recent-authors' ),
+                       $lang->formatNum( $pageCounts['recent_authors'] )
                );
 
                // Array of MagicWord objects
@@ -672,144 +666,161 @@ class InfoAction extends FormlessAction {
        /**
         * Returns page counts that would be too "expensive" to retrieve by normal means.
         *
-        * @param Title $title Title to get counts for
+        * @param WikiPage|Article|Page $page
         * @return array
         */
-       protected function pageCounts( Title $title ) {
-               $id = $title->getArticleID();
+       protected function pageCounts( Page $page ) {
+               $fname = __METHOD__;
                $config = $this->context->getConfig();
 
-               $dbrWatchlist = wfGetDB( DB_SLAVE, 'watchlist' );
-               $result = array();
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       self::getCacheKey( $page->getTitle(), $page->getLatest() ),
+                       function ( $oldValue, &$ttl, &$setOpts ) use ( $page, $config, $fname ) {
+                               $title = $page->getTitle();
+                               $id = $title->getArticleID();
 
-               // Number of page watchers
-               $watchers = (int)$dbrWatchlist->selectField(
-                       'watchlist',
-                       'COUNT(*)',
-                       array(
-                               'wl_namespace' => $title->getNamespace(),
-                               'wl_title' => $title->getDBkey(),
-                       ),
-                       __METHOD__
-               );
-               $result['watchers'] = $watchers;
-
-               if ( $config->get( 'ShowUpdatedMarker' ) ) {
-                       // Threshold: last visited about 26 weeks before latest edit
-                       $updated = wfTimestamp( TS_UNIX, $this->page->getTimestamp() );
-                       $age = $config->get( 'WatchersMaxAge' );
-                       $threshold = $dbrWatchlist->timestamp( $updated - $age );
-                       // Number of page watchers who also visited a "recent" edit
-                       $visitingWatchers = (int)$dbrWatchlist->selectField(
-                               'watchlist',
-                               'COUNT(*)',
-                               array(
-                                       'wl_namespace' => $title->getNamespace(),
-                                       'wl_title' => $title->getDBkey(),
-                                       'wl_notificationtimestamp >= ' . $dbrWatchlist->addQuotes( $threshold ) .
-                                       ' OR wl_notificationtimestamp IS NULL'
-                               ),
-                               __METHOD__
-                       );
-                       $result['visitingWatchers'] = $visitingWatchers;
-               }
+                               $dbr = wfGetDB( DB_SLAVE );
+                               $dbrWatchlist = wfGetDB( DB_SLAVE, 'watchlist' );
 
-               $dbr = wfGetDB( DB_SLAVE );
-               // Total number of edits
-               $edits = (int)$dbr->selectField(
-                       'revision',
-                       'COUNT(rev_page)',
-                       array( 'rev_page' => $id ),
-                       __METHOD__
-               );
-               $result['edits'] = $edits;
+                               $setOpts += DatabaseBase::getCacheSetOptions( $dbr, $dbrWatchlist );
 
-               // Total number of distinct authors
-               $authors = (int)$dbr->selectField(
-                       'revision',
-                       'COUNT(DISTINCT rev_user_text)',
-                       array( 'rev_page' => $id ),
-                       __METHOD__
-               );
-               $result['authors'] = $authors;
-
-               // "Recent" threshold defined by RCMaxAge setting
-               $threshold = $dbr->timestamp( time() - $config->get( 'RCMaxAge' ) );
-
-               // Recent number of edits
-               $edits = (int)$dbr->selectField(
-                       'revision',
-                       'COUNT(rev_page)',
-                       array(
-                               'rev_page' => $id,
-                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
-                       ),
-                       __METHOD__
-               );
-               $result['recent_edits'] = $edits;
+                               $result = array();
 
-               // Recent number of distinct authors
-               $authors = (int)$dbr->selectField(
-                       'revision',
-                       'COUNT(DISTINCT rev_user_text)',
-                       array(
-                               'rev_page' => $id,
-                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
-                       ),
-                       __METHOD__
-               );
-               $result['recent_authors'] = $authors;
+                               // Number of page watchers
+                               $watchers = (int)$dbrWatchlist->selectField(
+                                       'watchlist',
+                                       'COUNT(*)',
+                                       array(
+                                               'wl_namespace' => $title->getNamespace(),
+                                               'wl_title' => $title->getDBkey(),
+                                       ),
+                                       $fname
+                               );
+                               $result['watchers'] = $watchers;
+
+                               if ( $config->get( 'ShowUpdatedMarker' ) ) {
+                                       // Threshold: last visited about 26 weeks before latest edit
+                                       $updated = wfTimestamp( TS_UNIX, $page->getTimestamp() );
+                                       $age = $config->get( 'WatchersMaxAge' );
+                                       $threshold = $dbrWatchlist->timestamp( $updated - $age );
+                                       // Number of page watchers who also visited a "recent" edit
+                                       $visitingWatchers = (int)$dbrWatchlist->selectField(
+                                               'watchlist',
+                                               'COUNT(*)',
+                                               array(
+                                                       'wl_namespace' => $title->getNamespace(),
+                                                       'wl_title' => $title->getDBkey(),
+                                                       'wl_notificationtimestamp >= ' .
+                                                               $dbrWatchlist->addQuotes( $threshold ) .
+                                                               ' OR wl_notificationtimestamp IS NULL'
+                                               ),
+                                               $fname
+                                       );
+                                       $result['visitingWatchers'] = $visitingWatchers;
+                               }
 
-               // Subpages (if enabled)
-               if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
-                       $conds = array( 'page_namespace' => $title->getNamespace() );
-                       $conds[] = 'page_title ' . $dbr->buildLike( $title->getDBkey() . '/', $dbr->anyString() );
-
-                       // Subpages of this page (redirects)
-                       $conds['page_is_redirect'] = 1;
-                       $result['subpages']['redirects'] = (int)$dbr->selectField(
-                               'page',
-                               'COUNT(page_id)',
-                               $conds,
-                               __METHOD__ );
-
-                       // Subpages of this page (non-redirects)
-                       $conds['page_is_redirect'] = 0;
-                       $result['subpages']['nonredirects'] = (int)$dbr->selectField(
-                               'page',
-                               'COUNT(page_id)',
-                               $conds,
-                               __METHOD__
-                       );
+                               // Total number of edits
+                               $edits = (int)$dbr->selectField(
+                                       'revision',
+                                       'COUNT(*)',
+                                       array( 'rev_page' => $id ),
+                                       $fname
+                               );
+                               $result['edits'] = $edits;
 
-                       // Subpages of this page (total)
-                       $result['subpages']['total'] = $result['subpages']['redirects']
-                               + $result['subpages']['nonredirects'];
-               }
+                               // Total number of distinct authors
+                               if ( $config->get( 'MiserMode' ) ) {
+                                       $result['authors'] = 0;
+                               } else {
+                                       $result['authors'] = (int)$dbr->selectField(
+                                               'revision',
+                                               'COUNT(DISTINCT rev_user_text)',
+                                               array( 'rev_page' => $id ),
+                                               $fname
+                                       );
+                               }
 
-               // Counts for the number of transclusion links (to/from)
-               if ( $config->get( 'MiserMode' ) ) {
-                       $result['transclusion']['to'] = 0;
-               } else {
-                       $result['transclusion']['to'] = (int)$dbr->selectField(
-                               'templatelinks',
-                               'COUNT(tl_from)',
-                               array(
-                                       'tl_namespace' => $title->getNamespace(),
-                                       'tl_title' => $title->getDBkey()
-                               ),
-                               __METHOD__
-                       );
-               }
+                               // "Recent" threshold defined by RCMaxAge setting
+                               $threshold = $dbr->timestamp( time() - $config->get( 'RCMaxAge' ) );
+
+                               // Recent number of edits
+                               $edits = (int)$dbr->selectField(
+                                       'revision',
+                                       'COUNT(rev_page)',
+                                       array(
+                                               'rev_page' => $id,
+                                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
+                                       ),
+                                       $fname
+                               );
+                               $result['recent_edits'] = $edits;
+
+                               // Recent number of distinct authors
+                               $result['recent_authors'] = (int)$dbr->selectField(
+                                       'revision',
+                                       'COUNT(DISTINCT rev_user_text)',
+                                       array(
+                                               'rev_page' => $id,
+                                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
+                                       ),
+                                       $fname
+                               );
 
-               $result['transclusion']['from'] = (int)$dbr->selectField(
-                       'templatelinks',
-                       'COUNT(*)',
-                       array( 'tl_from' => $title->getArticleID() ),
-                       __METHOD__
-               );
+                               // Subpages (if enabled)
+                               if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
+                                       $conds = array( 'page_namespace' => $title->getNamespace() );
+                                       $conds[] = 'page_title ' .
+                                               $dbr->buildLike( $title->getDBkey() . '/', $dbr->anyString() );
+
+                                       // Subpages of this page (redirects)
+                                       $conds['page_is_redirect'] = 1;
+                                       $result['subpages']['redirects'] = (int)$dbr->selectField(
+                                               'page',
+                                               'COUNT(page_id)',
+                                               $conds,
+                                               $fname
+                                       );
+
+                                       // Subpages of this page (non-redirects)
+                                       $conds['page_is_redirect'] = 0;
+                                       $result['subpages']['nonredirects'] = (int)$dbr->selectField(
+                                               'page',
+                                               'COUNT(page_id)',
+                                               $conds,
+                                               $fname
+                                       );
+
+                                       // Subpages of this page (total)
+                                       $result['subpages']['total'] = $result['subpages']['redirects']
+                                               + $result['subpages']['nonredirects'];
+                               }
+
+                               // Counts for the number of transclusion links (to/from)
+                               if ( $config->get( 'MiserMode' ) ) {
+                                       $result['transclusion']['to'] = 0;
+                               } else {
+                                       $result['transclusion']['to'] = (int)$dbr->selectField(
+                                               'templatelinks',
+                                               'COUNT(tl_from)',
+                                               array(
+                                                       'tl_namespace' => $title->getNamespace(),
+                                                       'tl_title' => $title->getDBkey()
+                                               ),
+                                               $fname
+                                       );
+                               }
 
-               return $result;
+                               $result['transclusion']['from'] = (int)$dbr->selectField(
+                                       'templatelinks',
+                                       'COUNT(*)',
+                                       array( 'tl_from' => $title->getArticleID() ),
+                                       $fname
+                               );
+
+                               return $result;
+                       },
+                       86400 * 7
+               );
        }
 
        /**
@@ -854,15 +865,17 @@ class InfoAction extends FormlessAction {
 
                # "ThisSite user(s) A, B and C"
                if ( count( $user_names ) ) {
-                       $user = $this->msg( 'siteusers' )->rawParams( $lang->listToText( $user_names ) )->params(
-                               count( $user_names ) )->escaped();
+                       $user = $this->msg( 'siteusers' )
+                               ->rawParams( $lang->listToText( $user_names ) )
+                               ->params( count( $user_names ) )->escaped();
                } else {
                        $user = false;
                }
 
                if ( count( $anon_ips ) ) {
-                       $anon = $this->msg( 'anonusers' )->rawParams( $lang->listToText( $anon_ips ) )->params(
-                               count( $anon_ips ) )->escaped();
+                       $anon = $this->msg( 'anonusers' )
+                               ->rawParams( $lang->listToText( $anon_ips ) )
+                               ->params( count( $anon_ips ) )->escaped();
                } else {
                        $anon = false;
                }
@@ -892,4 +905,13 @@ class InfoAction extends FormlessAction {
        protected function getDescription() {
                return '';
        }
+
+       /**
+        * @param Title $title
+        * @param int $revId
+        * @return string
+        */
+       protected static function getCacheKey( Title $title, $revId ) {
+               return wfMemcKey( 'infoaction', md5( $title->getPrefixedText() ), $revId, self::VERSION );
+       }
 }
index a7f1ac3..48909cf 100644 (file)
@@ -52,4 +52,3 @@ class ProtectAction extends FormlessAction {
                $this->page->protect();
        }
 }
-
index ed0bff7..7e77846 100644 (file)
@@ -44,14 +44,6 @@ class PurgeAction extends FormAction {
                return '';
        }
 
-       /**
-        * Just get an empty form with a single submit button
-        * @return array
-        */
-       protected function getFormFields() {
-               return array();
-       }
-
        public function onSubmit( $data ) {
                return $this->page->doPurge();
        }
@@ -66,7 +58,14 @@ class PurgeAction extends FormAction {
                // This will throw exceptions if there's a problem
                $this->checkCanExecute( $this->getUser() );
 
-               if ( $this->getUser()->isAllowed( 'purge' ) ) {
+               $user = $this->getUser();
+
+               if ( $user->pingLimiter( 'purge' ) ) {
+                       // TODO: Display actionthrottledtext
+                       return;
+               }
+
+               if ( $user->isAllowed( 'purge' ) ) {
                        $this->redirectParams = wfArrayToCgi( array_diff_key(
                                $this->getRequest()->getQueryValues(),
                                array( 'title' => null, 'action' => null )
index c7f3346..4885a31 100644 (file)
@@ -82,8 +82,11 @@ class RevertAction extends FormAction {
                $lang = $this->getLanguage();
                $userDate = $lang->userDate( $timestamp, $user );
                $userTime = $lang->userTime( $timestamp, $user );
-               $siteDate = $wgContLang->date( $timestamp, false, false );
-               $siteTime = $wgContLang->time( $timestamp, false, false );
+               $siteTs = MWTimestamp::getLocalInstance( $timestamp );
+               $ts = $siteTs->format( 'YmdHis' );
+               $siteDate = $wgContLang->date( $ts, false, false );
+               $siteTime = $wgContLang->time( $ts, false, false );
+               $tzMsg = $siteTs->getTimezoneMessage()->inContentLanguage()->text();
 
                return array(
                        'intro' => array(
@@ -100,8 +103,8 @@ class RevertAction extends FormAction {
                        'comment' => array(
                                'type' => 'text',
                                'label-message' => 'filerevert-comment',
-                               'default' => $this->msg( 'filerevert-defaultcomment', $siteDate, $siteTime
-                                       )->inContentLanguage()->text()
+                               'default' => $this->msg( 'filerevert-defaultcomment', $siteDate, $siteTime,
+                                       $tzMsg )->inContentLanguage()->text()
                        )
                );
        }
index 93669cf..0404856 100644 (file)
@@ -78,13 +78,13 @@ class RollbackAction extends FormlessAction {
                        return;
                }
 
-               #NOTE: Permission errors already handled by Action::checkExecute.
+               # NOTE: Permission errors already handled by Action::checkExecute.
 
                if ( $result == array( array( 'readonlytext' ) ) ) {
                        throw new ReadOnlyError;
                }
 
-               #XXX: Would be nice if ErrorPageError could take multiple errors, and/or a status object.
+               # XXX: Would be nice if ErrorPageError could take multiple errors, and/or a status object.
                #     Right now, we only show the first error
                foreach ( $result as $error ) {
                        throw new ErrorPageError( 'rollbackfailed', $error[0], array_slice( $error, 1 ) );
@@ -109,7 +109,7 @@ class RollbackAction extends FormlessAction {
                $this->getOutput()->returnToMain( false, $this->getTitle() );
 
                if ( !$request->getBool( 'hidediff', false ) &&
-                       !$this->getUser()->getBoolOption( 'norollbackdiff', false )
+                       !$this->getUser()->getBoolOption( 'norollbackdiff' )
                ) {
                        $contentHandler = $current->getContentHandler();
                        $de = $contentHandler->createDifferenceEngine(
index 8b6e329..30b83d7 100644 (file)
@@ -35,16 +35,11 @@ class WatchAction extends FormAction {
                return false;
        }
 
-       protected function getDescription() {
-               return $this->msg( 'addwatch' )->escaped();
-       }
-
        /**
-        * Just get an empty form with a single submit button
-        * @return array
+        * @return string HTML
         */
-       protected function getFormFields() {
-               return array();
+       protected function getDescription() {
+               return $this->msg( 'addwatch' )->escaped();
        }
 
        public function onSubmit( $data ) {
@@ -53,30 +48,6 @@ class WatchAction extends FormAction {
                return true;
        }
 
-       /**
-        * This can be either formed or formless depending on the session token given
-        */
-       public function show() {
-               $this->setHeaders();
-
-               $user = $this->getUser();
-               // This will throw exceptions if there's a problem
-               $this->checkCanExecute( $user );
-
-               // Must have valid token for this action/title
-               $salt = array( $this->getName(), $this->getTitle()->getPrefixedDBkey() );
-
-               if ( $user->matchEditToken( $this->getRequest()->getVal( 'token' ), $salt ) ) {
-                       $this->onSubmit( array() );
-                       $this->onSuccess();
-               } else {
-                       $form = $this->getForm();
-                       if ( $form->show() ) {
-                               $this->onSuccess();
-                       }
-               }
-       }
-
        protected function checkCanExecute( User $user ) {
                // Must be logged in
                if ( $user->isAnon() ) {
@@ -86,6 +57,21 @@ class WatchAction extends FormAction {
                parent::checkCanExecute( $user );
        }
 
+       protected function alterForm( HTMLForm $form ) {
+               $form->setSubmitTextMsg( 'confirm-watch-button' );
+               $form->setTokenSalt( 'watch' );
+       }
+
+       protected function preText() {
+               return $this->msg( 'confirm-watch-top' )->parse();
+       }
+
+       public function onSuccess() {
+               $this->getOutput()->addWikiMsg( 'addedwatchtext', $this->getTitle()->getPrefixedText() );
+       }
+
+       /* Static utility methods */
+
        /**
         * Watch or unwatch a page
         * @since 1.22
@@ -176,11 +162,8 @@ class WatchAction extends FormAction {
                if ( $action != 'unwatch' ) {
                        $action = 'watch';
                }
-               $salt = array( $action, $title->getPrefixedDBkey() );
-
-               // This token stronger salted and not compatible with ApiWatch
-               // It's title/action specific because index.php is GET and API is POST
-               return $user->getEditToken( $salt );
+               // Match ApiWatch and ResourceLoaderUserTokensModule
+               return $user->getEditToken( $action );
        }
 
        /**
@@ -195,16 +178,4 @@ class WatchAction extends FormAction {
        public static function getUnwatchToken( Title $title, User $user, $action = 'unwatch' ) {
                return self::getWatchToken( $title, $user, $action );
        }
-
-       protected function alterForm( HTMLForm $form ) {
-               $form->setSubmitTextMsg( 'confirm-watch-button' );
-       }
-
-       protected function preText() {
-               return $this->msg( 'confirm-watch-top' )->parse();
-       }
-
-       public function onSuccess() {
-               $this->getOutput()->addWikiMsg( 'addedwatchtext', $this->getTitle()->getPrefixedText() );
-       }
 }
index d53797b..1465543 100644 (file)
@@ -206,7 +206,8 @@ abstract class ApiBase extends ContextSource {
                                // Fix up the ugly "even numbered elements are description, odd
                                // numbered elemts are the link" format (see doc for self::getExamples)
                                $tmp = array();
-                               for ( $i = 0; $i < count( $examples ); $i += 2 ) {
+                               $examplesCount = count( $examples );
+                               for ( $i = 0; $i < $examplesCount; $i += 2 ) {
                                        $tmp[$examples[$i + 1]] = $examples[$i];
                                }
                                $examples = $tmp;
@@ -1070,7 +1071,9 @@ abstract class ApiBase extends ContextSource {
         * @param int $botMax Maximum value for sysops/bots
         * @param bool $enforceLimits Whether to enforce (die) if value is outside limits
         */
-       protected function validateLimit( $paramName, &$value, $min, $max, $botMax = null, $enforceLimits = false ) {
+       protected function validateLimit( $paramName, &$value, $min, $max, $botMax = null,
+               $enforceLimits = false
+       ) {
                if ( !is_null( $min ) && $value < $min ) {
                        $msg = $this->encodeParamName( $paramName ) . " may not be less than $min (set to $value)";
                        $this->warnOrDie( $msg, $enforceLimits );
@@ -1355,8 +1358,8 @@ abstract class ApiBase extends ContextSource {
         * @param string $errorCode Brief, arbitrary, stable string to allow easy
         *   automated identification of the error, e.g., 'unknown_action'
         * @param int $httpRespCode HTTP response code
-        * @param array $extradata Data to add to the "<error>" element; array in ApiResult format
-        * @throws UsageException
+        * @param array|null $extradata Data to add to the "<error>" element; array in ApiResult format
+        * @throws UsageException always
         */
        public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
                throw new UsageException(
@@ -1412,10 +1415,9 @@ abstract class ApiBase extends ContextSource {
         *
         * @since 1.22
         * @param Status $status
-        * @throws MWException
+        * @throws UsageException always
         */
        public function dieStatus( $status ) {
-
                list( $code, $msg ) = $this->getErrorFromStatus( $status );
                $this->dieUsage( $msg, $code );
        }
@@ -1929,6 +1931,8 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Helper function for readonly errors
+        *
+        * @throws UsageException always
         */
        public function dieReadOnly() {
                $parsed = $this->parseMsg( array( 'readonlytext' ) );
@@ -1939,6 +1943,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Output the error message related to a certain array
         * @param array|string $error Element of a getUserPermissionsErrors()-style array
+        * @throws UsageException always
         */
        public function dieUsageMsg( $error ) {
                # most of the time we send a 1 element, so we might as well send it as
@@ -1954,6 +1959,7 @@ abstract class ApiBase extends ContextSource {
         * Will only set a warning instead of failing if the global $wgDebugAPI
         * is set to true. Otherwise behaves exactly as dieUsageMsg().
         * @param array|string $error Element of a getUserPermissionsErrors()-style array
+        * @throws UsageException
         * @since 1.21
         */
        public function dieUsageMsgOrDebug( $error ) {
@@ -1972,6 +1978,7 @@ abstract class ApiBase extends ContextSource {
         * Die with the $prefix.'badcontinue' error. This call is common enough to
         * make it into the base method.
         * @param bool $condition Will only die if this value is true
+        * @throws UsageException
         * @since 1.21
         */
        protected function dieContinueUsageIf( $condition ) {
@@ -2013,7 +2020,7 @@ abstract class ApiBase extends ContextSource {
         * Internal code errors should be reported with this method
         * @param string $method Method or function name
         * @param string $message Error message
-        * @throws MWException
+        * @throws MWException always
         */
        protected static function dieDebug( $method, $message ) {
                throw new MWException( "Internal error in $method: $message" );
@@ -2671,14 +2678,14 @@ abstract class ApiBase extends ContextSource {
                                        $desc = implode( $paramPrefix, $desc );
                                }
 
-                               //handle shorthand
+                               // handle shorthand
                                if ( !is_array( $paramSettings ) ) {
                                        $paramSettings = array(
                                                self::PARAM_DFLT => $paramSettings,
                                        );
                                }
 
-                               //handle missing type
+                               // handle missing type
                                if ( !isset( $paramSettings[ApiBase::PARAM_TYPE] ) ) {
                                        $dflt = isset( $paramSettings[ApiBase::PARAM_DFLT] )
                                                ? $paramSettings[ApiBase::PARAM_DFLT]
@@ -2813,7 +2820,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * @deprecated since 1.25, always returns empty string
-        * @param DatabaseBase|bool $db
+        * @param IDatabase|bool $db
         * @return string
         */
        public function getModuleProfileName( $db = false ) {
index 6adfc1a..636baa7 100644 (file)
@@ -162,12 +162,14 @@ class ApiBlock extends ApiBase {
        }
 
        protected function getExamplesMessages() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        'action=block&user=192.0.2.5&expiry=3%20days&reason=First%20strike&token=123ABC'
                                => 'apihelp-block-example-ip-simple',
                        'action=block&user=Vandal&expiry=never&reason=Vandalism&nocreate=&autoblock=&noemail=&token=123ABC'
                                => 'apihelp-block-example-user-complex',
                );
+               // @codingStandardsIgnoreEnd
        }
 
        public function getHelpUrls() {
index 5443fac..00b7de9 100644 (file)
@@ -118,7 +118,9 @@ class ApiCreateAccount extends ApiBase {
                                        'createaccount-title',
                                        'createaccount-text'
                                ) );
-                       } elseif ( $this->getConfig()->get( 'EmailAuthentication' ) && Sanitizer::validateEmail( $user->getEmail() ) ) {
+                       } elseif ( $this->getConfig()->get( 'EmailAuthentication' ) &&
+                               Sanitizer::validateEmail( $user->getEmail() )
+                       ) {
                                // Send out an email authentication message if needed
                                $status->merge( $user->sendConfirmationMail() );
                        }
index edda672..9c3945e 100644 (file)
@@ -56,7 +56,8 @@ class ApiFeedContributions extends ApiBase {
                }
 
                $msg = wfMessage( 'Contributions' )->inContentLanguage()->text();
-               $feedTitle = $config->get( 'Sitename' ) . ' - ' . $msg . ' [' . $config->get( 'LanguageCode' ) . ']';
+               $feedTitle = $config->get( 'Sitename' ) . ' - ' . $msg .
+                       ' [' . $config->get( 'LanguageCode' ) . ']';
                $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL();
 
                $target = $params['user'] == 'newbies'
@@ -163,10 +164,10 @@ class ApiFeedContributions extends ApiBase {
                                // only textual content has a "source view".
                                $html = nl2br( htmlspecialchars( $content->getNativeData() ) );
                        } else {
-                               //XXX: we could get an HTML representation of the content via getParserOutput, but that may
+                               // XXX: we could get an HTML representation of the content via getParserOutput, but that may
                                //     contain JS magic and generally may not be suitable for inclusion in a feed.
                                //     Perhaps Content should have a getDescriptiveHtml method and/or a getSourceText method.
-                               //Compare also FeedUtils::formatDiffRow.
+                               // Compare also FeedUtils::formatDiffRow.
                                $html = '';
                        }
 
index e522d70..3c10518 100644 (file)
@@ -155,7 +155,7 @@ abstract class ApiFormatBase extends ApiBase {
 
                $this->getMain()->getRequest()->response()->header( "Content-Type: $mime; charset=utf-8" );
 
-               //Set X-Frame-Options API results (bug 39180)
+               // Set X-Frame-Options API results (bug 39180)
                $apiFrameOptions = $this->getConfig()->get( 'ApiFrameOptions' );
                if ( $apiFrameOptions ) {
                        $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
index be1b12c..a319be3 100644 (file)
@@ -93,7 +93,8 @@ class ApiFormatJson extends ApiFormatBase {
                                        break;
 
                                default:
-                                       $this->dieUsage( __METHOD__ . ': Unknown value for \'formatversion\'', 'unknownformatversion' );
+                                       $this->dieUsage( __METHOD__ .
+                                               ': Unknown value for \'formatversion\'', 'unknownformatversion' );
                        }
                }
                $data = $this->getResult()->getResultData( null, $transform );
index 6420a5b..df9d581 100644 (file)
@@ -69,7 +69,7 @@ class ApiFormatPhp extends ApiFormatBase {
                ) {
                        $this->dieUsage(
                                'This response cannot be represented using format=php. ' .
-                               'See https://bugzilla.wikimedia.org/show_bug.cgi?id=66776',
+                               'See https://phabricator.wikimedia.org/T68776',
                                'internalerror'
                        );
                }
index f6d124f..abec828 100644 (file)
@@ -703,7 +703,12 @@ class ApiHelp extends ApiBase {
                                                $submodules[] = $manager->getModule( $name );
                                        }
                                }
-                               $help['submodules'] .= self::getHelpInternal( $context, $submodules, $suboptions, $haveModules );
+                               $help['submodules'] .= self::getHelpInternal(
+                                       $context,
+                                       $submodules,
+                                       $suboptions,
+                                       $haveModules
+                               );
                                $numSubmodules = count( $submodules );
                        }
 
index 735cc7f..a6aae4b 100644 (file)
@@ -92,6 +92,30 @@ class ApiImport extends ApiBase {
                $result->addValue( null, $this->getModuleName(), $resultData );
        }
 
+       /**
+        * Returns a list of interwiki prefixes corresponding to each defined import
+        * source.
+        *
+        * @return array
+        * @since 1.26
+        */
+       public function getAllowedImportSources() {
+               $importSources = $this->getConfig()->get( 'ImportSources' );
+               Hooks::run( 'ImportSources', array( &$importSources ) );
+
+               $result = array();
+               foreach ( $importSources as $key => $value ) {
+                       if ( is_int( $key ) ) {
+                               $result[] = $value;
+                       } else {
+                               foreach ( $value as $subproject ) {
+                                       $result[] = "$key:$subproject";
+                               }
+                       }
+               }
+               return $result;
+       }
+
        public function mustBePosted() {
                return true;
        }
@@ -107,7 +131,7 @@ class ApiImport extends ApiBase {
                                ApiBase::PARAM_TYPE => 'upload',
                        ),
                        'interwikisource' => array(
-                               ApiBase::PARAM_TYPE => $this->getConfig()->get( 'ImportSources' ),
+                               ApiBase::PARAM_TYPE => $this->getAllowedImportSources(),
                        ),
                        'interwikipage' => null,
                        'fullhistory' => false,
index d943c86..8e0ba8b 100644 (file)
@@ -618,10 +618,13 @@ class ApiMain extends ApiBase {
 
                        $response->header( "Access-Control-Allow-Origin: $originHeader" );
                        $response->header( 'Access-Control-Allow-Credentials: true' );
-                       $response->header( "Timing-Allow-Origin: $originHeader" ); # http://www.w3.org/TR/resource-timing/#timing-allow-origin
+                       // http://www.w3.org/TR/resource-timing/#timing-allow-origin
+                       $response->header( "Timing-Allow-Origin: $originHeader" );
 
                        if ( !$preflight ) {
-                               $response->header( 'Access-Control-Expose-Headers: MediaWiki-API-Error, Retry-After, X-Database-Lag' );
+                               $response->header(
+                                       'Access-Control-Expose-Headers: MediaWiki-API-Error, Retry-After, X-Database-Lag'
+                               );
                        }
                }
 
@@ -977,7 +980,8 @@ class ApiMain extends ApiBase {
                                )
                        ) {
                                $this->dieUsage(
-                                       "The '{$module->encodeParamName( 'token' )}' parameter was found in the query string, but must be in the POST body",
+                                       "The '{$module->encodeParamName( 'token' )}' parameter was " .
+                                               'found in the query string, but must be in the POST body',
                                        'mustposttoken'
                                );
                        }
@@ -1236,7 +1240,7 @@ class ApiMain extends ApiBase {
                $this->reportUnusedParams();
 
                if ( !$this->mInternalMode ) {
-                       //append Debug information
+                       // append Debug information
                        MWDebug::appendDebugInfoToApiResult( $this->getContext(), $this->getResult() );
 
                        // Print result data
index a0300ab..7c0a430 100644 (file)
@@ -196,7 +196,9 @@ class ApiModuleManager extends ContextSource {
                        $instance = call_user_func( $factory, $this->mParent, $name );
 
                        if ( !$instance instanceof $class ) {
-                               throw new MWException( "The factory function for module $name did not return an instance of $class!" );
+                               throw new MWException(
+                                       "The factory function for module $name did not return an instance of $class!"
+                               );
                        }
                } else {
                        // create instance from class name
@@ -273,7 +275,7 @@ class ApiModuleManager extends ContextSource {
        /**
         * Returns the group name for the given module
         * @param string $moduleName
-        * @return string Group name or null if missing
+        * @return string|null Group name or null if missing
         */
        public function getModuleGroup( $moduleName ) {
                if ( isset( $this->mModules[$moduleName] ) ) {
index aca4378..60fd426 100644 (file)
@@ -85,7 +85,7 @@ class ApiMove extends ApiBase {
                        'reason' => $params['reason']
                );
 
-               //NOTE: we assume that if the old title exists, it's because it was re-created as
+               // NOTE: we assume that if the old title exists, it's because it was re-created as
                // a redirect to the new title. This is not safe, but what we did before was
                // even worse: we just determined whether a redirect should have been created,
                // and reported that it was created if it should have, without any checks.
index a62bcb6..74ce053 100644 (file)
@@ -55,7 +55,7 @@ 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_LATEST ) ) {
+                       if ( !$user->loadFromId( User::READ_EXCLUSIVE ) ) {
                                $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
                        }
                }
index 1415b79..17c148e 100644 (file)
@@ -58,7 +58,8 @@ class ApiPageSet extends ApiBase {
        private $mGoodTitles = array();
        private $mMissingPages = array(); // [ns][dbkey] => fake page_id
        private $mMissingTitles = array();
-       private $mInvalidTitles = array(); // [fake_page_id] => array( 'title' => $title, 'invalidreason' => $reason )
+       /** @var array [fake_page_id] => array( 'title' => $title, 'invalidreason' => $reason ) */
+       private $mInvalidTitles = array();
        private $mMissingPageIDs = array();
        private $mRedirectTitles = array();
        private $mSpecialTitles = array();
@@ -700,7 +701,7 @@ class ApiPageSet extends ApiBase {
         * Note that the query result must include the columns returned by
         * $this->getPageTableFields().
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param ResultWrapper $queryResult Query result object
         */
        public function populateFromQueryResult( $db, $queryResult ) {
index cce8572..fcab9be 100644 (file)
@@ -526,7 +526,7 @@ class ApiParse extends ApiBase {
         * @return Content
         */
        private function getContent( WikiPage $page, $pageId = null ) {
-               $content = $page->getContent( Revision::RAW ); //XXX: really raw?
+               $content = $page->getContent( Revision::RAW ); // XXX: really raw?
 
                if ( $this->section !== false && $content !== null ) {
                        $content = $this->getSectionContent(
index a22be49..34f9b6c 100644 (file)
@@ -47,16 +47,22 @@ class ApiPurge extends ApiBase {
                $pageSet->execute();
 
                $result = $pageSet->getInvalidTitlesAndRevisions();
+               $user = $this->getUser();
 
                foreach ( $pageSet->getGoodTitles() as $title ) {
                        $r = array();
                        ApiQueryBase::addTitleInfo( $r, $title );
                        $page = WikiPage::factory( $title );
-                       $page->doPurge(); // Directly purge and skip the UI part of purge().
-                       $r['purged'] = true;
+                       if ( !$user->pingLimiter( 'purge' ) ) {
+                               $page->doPurge(); // Directly purge and skip the UI part of purge().
+                               $r['purged'] = true;
+                       } else {
+                               $error = $this->parseMsg( array( 'actionthrottledtext' ) );
+                               $this->setWarning( $error['info'] );
+                       }
 
                        if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
-                               if ( !$this->getUser()->pingLimiter( 'linkpurge' ) ) {
+                               if ( !$user->pingLimiter( 'linkpurge' ) ) {
                                        $popts = $page->makeParserOptions( 'canonical' );
 
                                        # Parse content; note that HTML generation is only needed if we want to cache the result.
index 5378e92..3609a11 100644 (file)
@@ -301,17 +301,6 @@ class ApiQuery extends ApiBase {
                } else {
                        $continuationManager->setContinuationIntoResult( $this->getResult() );
                }
-
-               /// @todo: Remove this after a suitable period of time. When REL1_26 is cut, if not before.
-               if ( $this->mParams['continue'] === null && !$this->mParams['rawcontinue'] &&
-                       $this->getResult()->getResultData( 'continue' ) !== null
-               ) {
-                       $this->setWarning(
-                               'Formatting of continuation data has changed. ' .
-                               'To receive raw query-continue data, use the \'rawcontinue\' parameter. ' .
-                               'To silence this warning, pass an empty string for \'continue\' in the initial query.'
-                       );
-               }
        }
 
        /**
@@ -615,10 +604,6 @@ class ApiQuery extends ApiBase {
                return implode( "\n", $moduleDescriptions );
        }
 
-       public function shouldCheckMaxlag() {
-               return true;
-       }
-
        protected function getExamplesMessages() {
                return array(
                        'action=query&prop=revisions&meta=siteinfo&' .
index 172ee99..4f7984e 100644 (file)
@@ -54,7 +54,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                $params = $this->extractRequestParams( false );
 
                $result = $this->getResult();
-               $pageSet = $this->getPageSet();
 
                // This module operates in two modes:
                // 'user': List deleted revs by a certain user
index 381938b..877423e 100644 (file)
@@ -350,7 +350,8 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_DFLT => 'timestamp|url',
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+imageinfo-param-prop',
-                               ApiBase::PARAM_HELP_MSG_PER_VALUE => ApiQueryImageInfo::getPropertyMessages( $this->propertyFilter ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE =>
+                                       ApiQueryImageInfo::getPropertyMessages( $this->propertyFilter ),
                        ),
                        'prefix' => null,
                        'minsize' => array(
index 152711f..d8a71ca 100644 (file)
@@ -116,7 +116,13 @@ class ApiQueryAllMessages extends ApiQueryBase {
                        $lang = $langObj->getCode();
 
                        $customisedMessages = AllMessagesTablePager::getCustomisedStatuses(
-                               array_map( array( $langObj, 'ucfirst' ), $messages_target ), $lang, $lang != $wgContLang->getCode() );
+                               array_map(
+                                       array( $langObj, 'ucfirst' ),
+                                       $messages_target
+                               ),
+                               $lang,
+                               $lang != $wgContLang->getCode()
+                       );
 
                        $customised = $params['customised'] === 'modified';
                }
index e441991..78e3621 100644 (file)
@@ -200,14 +200,14 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                $this->addOption( 'LIMIT', $limit + 1 );
                $res = $this->select( __METHOD__ );
 
-               //Get gender information
+               // Get gender information
                if ( MWNamespace::hasGenderDistinction( $params['namespace'] ) ) {
                        $users = array();
                        foreach ( $res as $row ) {
                                $users[] = $row->page_title;
                        }
                        GenderCache::singleton()->doQuery( $users, __METHOD__ );
-                       $res->rewind(); //reset
+                       $res->rewind(); // reset
                }
 
                $count = 0;
index a50d58b..f1a2271 100644 (file)
@@ -143,8 +143,12 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                }
                $miser_ns = null;
                if ( $params['namespace'] !== null ) {
-                       if ( empty( $settings['from_namespace'] ) && $this->getConfig()->get( 'MiserMode' ) ) {
-                               $miser_ns = $params['namespace'];
+                       if ( empty( $settings['from_namespace'] ) ) {
+                               if ( $this->getConfig()->get( 'MiserMode' ) ) {
+                                       $miser_ns = $params['namespace'];
+                               } else {
+                                       $this->addWhereFld( 'page_namespace', $params['namespace'] );
+                               }
                        } else {
                                $this->addWhereFld( "{$p}_from_namespace", $params['namespace'] );
                                if ( !empty( $settings['from_namespace'] ) && count( $params['namespace'] ) > 1 ) {
index c66e21b..c4592c8 100644 (file)
@@ -421,7 +421,14 @@ abstract class ApiQueryBase extends ApiBase {
                $this->addFields( 'ipb_deleted' );
 
                if ( $showBlockInfo ) {
-                       $this->addFields( array( 'ipb_id', 'ipb_by', 'ipb_by_text', 'ipb_reason', 'ipb_expiry', 'ipb_timestamp' ) );
+                       $this->addFields( array(
+                               'ipb_id',
+                               'ipb_by',
+                               'ipb_by_text',
+                               'ipb_reason',
+                               'ipb_expiry',
+                               'ipb_timestamp'
+                       ) );
                }
 
                // Don't show hidden names
index bf48b19..fa1dfc2 100644 (file)
@@ -46,7 +46,6 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                        );
                }
 
-               $result = $this->getResult();
                $pageSet = $this->getPageSet();
                $pageMap = $pageSet->getGoodAndMissingTitlesByNamespace();
                $pageCount = count( $pageSet->getGoodAndMissingTitles() );
index 3282c71..1038a9f 100644 (file)
@@ -107,7 +107,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                // iterate over $images to handle continue param correct
                foreach ( $images as $image => $pageId ) {
                        if ( !isset( $sha1s[$image] ) ) {
-                               continue; //file does not exist
+                               continue; // file does not exist
                        }
                        $sha1 = $sha1s[$image];
                        $dupFiles = $filesBySha1s[$sha1];
@@ -118,14 +118,14 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                        foreach ( $dupFiles as $dupFile ) {
                                $dupName = $dupFile->getName();
                                if ( $image == $dupName && $dupFile->isLocal() ) {
-                                       continue; //ignore the local file itself
+                                       continue; // ignore the local file itself
                                }
                                if ( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
-                                       continue; //skip to pos after the image from continue param
+                                       continue; // skip to pos after the image from continue param
                                }
                                $skipUntilThisDup = false;
                                if ( ++$count > $params['limit'] ) {
-                                       $fit = false; //break outer loop
+                                       $fit = false; // break outer loop
                                        // We're one over limit which shows that
                                        // there are additional images to be had. Stop here...
                                        $this->setContinueEnumParameter( 'continue', $image . '|' . $dupName );
index ba36c67..736ac45 100644 (file)
@@ -339,7 +339,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                // in the actual normalised version, only if we can actually normalise them,
                // so we use the functions scope to throw away the normalisations.
                if ( !$h->normaliseParams( $image, $finalParams ) ) {
-                       $this->dieUsage( "Could not normalise image parameters for " . $image->getName(), "urlparamnormal" );
+                       $this->dieUsage( 'Could not normalise image parameters for ' .
+                               $image->getName(), 'urlparamnormal' );
                }
        }
 
@@ -480,7 +481,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                }
 
                if ( !$canShowField( File::DELETED_FILE ) ) {
-                       //Early return, tidier than indenting all following things one level
+                       // Early return, tidier than indenting all following things one level
                        return $vals;
                }
 
index 25e534e..899a382 100644 (file)
@@ -75,7 +75,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
                        );
                }
 
-               //FIXME: (follow-up) To allow extensions to add to the language links, we need
+               // FIXME: (follow-up) To allow extensions to add to the language links, we need
                //       to load them all, add the extra links, then apply paging.
                //       Should not be terrible, it's not going to be more than a few hundred links.
 
index d87ad1e..38be99a 100644 (file)
@@ -365,7 +365,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
         */
        private function getAllowedLogActions() {
                $config = $this->getConfig();
-               return array_keys( array_merge( $config->get( 'LogActions' ), $config->get( 'LogActionsHandlers' ) ) );
+               return array_keys( array_merge(
+                       $config->get( 'LogActions' ),
+                       $config->get( 'LogActionsHandlers' )
+               ) );
        }
 
        public function getCacheMode( $params ) {
index 8e7031c..e553d12 100644 (file)
@@ -152,7 +152,8 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                        $end = null;
                }
 
-               list( $left, $continue ) = $this->runQuery( $resultPageSet, $params['limit'], $start, $startId, $end );
+               list( $left, $continue ) =
+                       $this->runQuery( $resultPageSet, $params['limit'], $start, $startId, $end );
                if ( $end === null && $continue === null ) {
                        // Wrap around. We do this even if $left === 0 for continuation
                        // (saving a DB query in this rare case probably isn't worth the
index d57dc3c..f8dbf23 100644 (file)
@@ -307,7 +307,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        $text = null;
 
                        if ( $this->expandTemplates && !$this->parseContent ) {
-                               #XXX: implement template expansion for all content types in ContentHandler?
+                               # XXX: implement template expansion for all content types in ContentHandler?
                                if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
                                        $text = $content->getNativeData();
 
index 251c42b..f916537 100644 (file)
@@ -149,7 +149,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        $vals['ratelimits'] = $this->getRateLimits();
                }
 
-               if ( isset( $this->prop['realname'] ) && !in_array( 'realname', $this->getConfig()->get( 'HiddenPrefs' ) ) ) {
+               if ( isset( $this->prop['realname'] ) &&
+                       !in_array( 'realname', $this->getConfig()->get( 'HiddenPrefs' ) )
+               ) {
                        $vals['realname'] = $user->getRealName();
                }
 
index 398337b..b621cb0 100644 (file)
@@ -45,7 +45,8 @@ class ApiUpload extends ApiBase {
                $this->mParams = $this->extractRequestParams();
                $request = $this->getMain()->getRequest();
                // Check if async mode is actually supported (jobs done in cli mode)
-               $this->mParams['async'] = ( $this->mParams['async'] && $this->getConfig()->get( 'EnableAsyncUploads' ) );
+               $this->mParams['async'] = ( $this->mParams['async'] &&
+                       $this->getConfig()->get( 'EnableAsyncUploads' ) );
                // Add the uploaded file to the params array
                $this->mParams['file'] = $request->getFileName( 'file' );
                $this->mParams['chunk'] = $request->getFileName( 'chunk' );
@@ -605,16 +606,29 @@ class ApiUpload extends ApiBase {
 
                switch ( $exceptionType ) {
                        case 'UploadStashFileNotFoundException':
-                               $this->dieUsage( 'Could not find the file in the stash: ' . $e->getMessage(), 'stashedfilenotfound' );
+                               $this->dieUsage(
+                                       'Could not find the file in the stash: ' . $e->getMessage(),
+                                       'stashedfilenotfound'
+                               );
                                break;
                        case 'UploadStashBadPathException':
-                               $this->dieUsage( 'File key of improper format or otherwise invalid: ' . $e->getMessage(), 'stashpathinvalid' );
+                               $this->dieUsage(
+                                       'File key of improper format or otherwise invalid: ' . $e->getMessage(),
+                                       'stashpathinvalid'
+                               );
                                break;
                        case 'UploadStashFileException':
-                               $this->dieUsage( 'Could not store upload in the stash: ' . $e->getMessage(), 'stashfilestorage' );
+                               $this->dieUsage(
+                                       'Could not store upload in the stash: ' . $e->getMessage(),
+                                       'stashfilestorage'
+                               );
                                break;
                        case 'UploadStashZeroLengthFileException':
-                               $this->dieUsage( 'File is of zero length, and could not be stored in the stash: ' . $e->getMessage(), 'stashzerolength' );
+                               $this->dieUsage(
+                                       'File is of zero length, and could not be stored in the stash: ' .
+                                               $e->getMessage(),
+                                       'stashzerolength'
+                               );
                                break;
                        case 'UploadStashNotLoggedInException':
                                $this->dieUsage( 'Not logged in: ' . $e->getMessage(), 'stashnotloggedin' );
index b544cc8..8a5ee52 100644 (file)
@@ -6,7 +6,8 @@
                        "Juandev",
                        "Aktron",
                        "Cvanca",
-                       "Utar"
+                       "Utar",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].",
        "apihelp-query+allcategories-param-limit": "Kolik má být zobrazeno kategorií.",
        "apihelp-query+alldeletedrevisions-description": "Seznam všech smazaných revizí od konkrétního uživatele nebo v konkrétním jmenném prostoru.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Není možné užít s <var>$3user</var>.",
-       "apihelp-query+alldeletedrevisions-example-user": "Seznam posledních 50 smazaných editací uživatele <kbd>Příklad<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Seznam posledních 50 smazaných editací uživatele <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Seznam prvních 50 smazaných revizí v hlavním jmenném prostoru.",
        "apihelp-query+allfileusages-description": "Zobrazit seznam všech použití souboru, včetně neexistujících.",
        "apihelp-query+allfileusages-example-unique": "Zobrazit seznam unikátních názvů souborů.",
        "apihelp-query+alltransclusions-example-unique": "Seznam unikátně vložených titulů.",
        "apihelp-query+allusers-example-Y": "Zobrazit uživatele počínaje písmenem <kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "Najít všechny stránky, které odkazují na danou stránku.",
-       "apihelp-query+backlinks-example-simple": "Zobrazit odkazy na <kbd>Hlavní stránka</kbd>",
+       "apihelp-query+backlinks-example-simple": "Zobrazit odkazy na <kbd>Main page</kbd>.",
        "apihelp-query+blocks-example-simple": "Vypsat zablokování.",
        "apihelp-query+blocks-example-users": "Seznam bloků uživatelů <kbd>Alice</kbd> a <kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "Zobrazit všechny kategorie, do kterých je stránka zařazena.",
        "apihelp-query+categorymembers-description": "Seznam všech stránek v dané kategorii.",
        "apihelp-query+categorymembers-param-limit": "Maximální počet stránek k zobrazení.",
        "apihelp-query+categorymembers-example-simple": "Zobrazit prvních 10 stránek v <kbd>Category:Physics</kbd>",
-       "apihelp-query+categorymembers-example-generator": "Získat informace o prvních 10 stránkách v <kbd>Category:Physics</kbd>",
+       "apihelp-query+categorymembers-example-generator": "Získat informace o prvních 10 stránkách v <kbd>Category:Physics</kbd>.",
        "apihelp-query+contributors-description": "Zobrazit seznam registrovaných a počet anonymních přispěvatelů stránky.",
        "apihelp-query+contributors-param-limit": "Kolik přispěvatelů má být zobrazeno.",
        "apihelp-query+contributors-example-simple": "Zobrazit přispěvatele stránky <kbd>Main Page</kbd>.",
-       "apihelp-query+deletedrevisions-param-limit": "Maximální počet revizí pro zobrazení v seznamu.",
        "apihelp-query+deletedrevs-param-excludeuser": "Nezahrnovat revize od tohoto uživatele.",
        "apihelp-query+deletedrevs-param-namespace": "Zahrnout pouze stránky z tohoto jmenného prostoru.",
        "apihelp-query+deletedrevs-param-limit": "Maximální počet revizí k zobrazení.",
        "apihelp-query+watchlistraw-description": "Získat všechny stránky, které jsou aktuálním uživatelem sledovány.",
        "apihelp-query+watchlistraw-example-simple": "Seznam sledovaných stránek uživatele.",
        "apihelp-unblock-param-user": "Uživatel, IP adresa nebo záběr IP adres k odblokování. Nelze použít dohromady s <var>$1id</var>.",
-       "apihelp-watch-example-watch": "Sledovat stránku <kbd>Hlavní stránka</kbd>.",
+       "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 vypsat 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-dump-description": "Vypisuje data ve formátu funkce <code>var_dump()</code> z PHP.",
-       "apihelp-dumpfm-description": "Vypisuje data ve formátu funkce <code>var_dump()</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-rawfm-description": "Vypisuje data s ladicími prvky 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-wddx-description": "Vypisuje data ve formátu WDDX.",
-       "apihelp-wddxfm-description": "Vypisuje data ve formátu WDDX (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.",
index 98e1c10..fab4b09 100644 (file)
@@ -27,7 +27,7 @@
        "apihelp-main-param-servedby": "Namen des bearbeitenden Hosts mit zurückgeben.",
        "apihelp-main-param-curtimestamp": "Aktuellen Zeitstempel mit zurückgeben.",
        "apihelp-main-param-origin": "Beim Zugriff auf die API mittels Cross-Domain-AJAX-Anfrage (CORS) ist dieser Parameter auf die veranlassende Domain zu setzen. Er muss in jedem Pre-Flight-Request angegeben werden und deshalb ein Teil der Anfrage-URI sein (nicht des POST-Bodys). Er muss genau einer der Angaben im <code>Origin</code>-Header entsprechen, d.&nbsp;h. er muss auf etwas wie <kbd>https://de.wikipedia.org</kbd> oder <kbd>https://meta.wikimedia.org</kbd> gesetzt werden. Falls dieser Parameter nicht mit dem <code>Origin</code>-Header übereinstimmt, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter dem <code>Origin</code>-Header entspricht und die Domain auf der Whitelist ist, wird ein <code>Access-Control-Allow-Origin</code>-Header gesetzt.",
-       "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. Eine Liste der Codes kann von <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> mit <kbd>siprop=languages</kbd> abgerufen werden. Gib <kbd>user</kbd> zum Verwenden der aktuellen Benutzerspracheinstellung oder <kbd>content</kbd> an, um die Inhaltssprache des Wikis zu verwenden.",
+       "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> mit <kbd>siprop=languages</kbd> gibt eine Liste der Sprachcodes zurück. Gib <kbd>user</kbd> zum Verwenden der aktuellen Benutzerspracheinstellung oder <kbd>content</kbd> an, um die Inhaltssprache des Wikis zu verwenden.",
        "apihelp-block-description": "Einen Benutzer sperren.",
        "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Bereich, der gesperrt werden soll.",
        "apihelp-block-param-expiry": "Sperrdauer. Kann relativ (z.&nbsp;B. <kbd>5 months</kbd> oder <kbd>2 weeks</kbd>) oder absolut (z.&nbsp;B. <kbd>2014-09-18T12:34:56Z</kbd>) sein. Wenn auf <kbd>infinite</kbd>, <kbd>indefinite</kbd> oder <kbd>never</kbd> gesetzt, ist die Sperre unbegrenzt.",
@@ -77,8 +77,8 @@
        "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.",
        "apihelp-delete-param-oldimage": "Name des alten zu löschenden Bildes, wie von [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] angegeben.",
-       "apihelp-delete-example-simple": "<kbd>Hauptseite</kbd> löschen.",
-       "apihelp-delete-example-reason": "<kbd>Hauptseite</kbd> löschen mit der Begründung <kbd>Vorbereitung für Verschiebung</kbd>.",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd> löschen.",
+       "apihelp-delete-example-reason": "<kbd>Main Page</kbd> löschen mit der Begründung <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Dieses Modul wurde deaktiviert.",
        "apihelp-edit-description": "Erstellen und Bearbeiten von Seiten.",
        "apihelp-edit-param-title": "Titel der Seite, die bearbeitet werden soll. Kann nicht zusammen mit <var>$1pageid</var> verwendet werden.",
        "apihelp-emailuser-param-subject": "Betreffzeile.",
        "apihelp-emailuser-param-text": "E-Mail-Inhalt.",
        "apihelp-emailuser-param-ccme": "Eine Kopie dieser E-Mail an mich senden.",
-       "apihelp-emailuser-example-email": "Eine E-Mail an den Benutzer <kbd>WikiSysop</kbd> mit dem Text <kbd>Inhalt</kbd> senden.",
+       "apihelp-emailuser-example-email": "Eine E-Mail an den Benutzer <kbd>WikiSysop</kbd> mit dem Text <kbd>Content</kbd> senden.",
        "apihelp-expandtemplates-description": "Alle Vorlagen im Wikitext expandieren.",
        "apihelp-expandtemplates-param-title": "Titel der Seite.",
        "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
        "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-expandtemplates-example-simple": "Den Wikitext <kbd><nowiki>{{Project:Spielwiese}}</nowiki></kbd> expandieren.",
+       "apihelp-expandtemplates-example-simple": "Den Wikitext <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> expandieren.",
        "apihelp-feedcontributions-description": "Gibt einen Benutzerbeiträge-Feed zurück.",
        "apihelp-feedcontributions-param-feedformat": "Das Format des Feeds.",
        "apihelp-feedcontributions-param-user": "Von welchen Benutzern die Beiträge abgerufen werden sollen.",
        "apihelp-filerevert-param-filename": "Ziel-Datei, ohne das Datei:-Präfix.",
        "apihelp-filerevert-param-comment": "Hochladekommentar.",
        "apihelp-filerevert-param-archivename": "Archivname der Version, auf die die Datei zurückgesetzt werden soll.",
-       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd> auf die Version vom <kbd>2011-03-05T15:27:40Z</kbd> zurücksetzen",
+       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd> auf die Version vom <kbd>2011-03-05T15:27:40Z</kbd> zurücksetzen.",
        "apihelp-help-description": "Hilfe für die angegebenen Module anzeigen.",
        "apihelp-help-param-modules": "Module, zu denen eine Hilfe angezeigt werden soll (Werte der Parameter <var>action</var> und <var>format</var> oder <kbd>main</kbd>). Kann Submodule mit einem <kbd>+</kbd> angeben.",
        "apihelp-help-param-submodules": "Hilfe für Submodule des benannten Moduls einschließen.",
        "apihelp-move-param-unwatch": "Die Seite und die entstandene Weiterleitung von der Beobachtungsliste entfernen.",
        "apihelp-move-param-watchlist": "Die Seite in jedem Fall zur Beobachtungsliste hinzufügen oder davon entfernen, die Voreinstellungen dafür nutzen oder den Beobachtungsstatus nicht ändern.",
        "apihelp-move-param-ignorewarnings": "Alle Warnungen ignorieren.",
-       "apihelp-move-example-move": "<kbd>Schlechter Titel</kbd> nach <kbd>Guter Titel</kbd> verschieben, ohne eine Weiterleitung zu erstellen.",
+       "apihelp-move-example-move": "<kbd>Badtitle</kbd> nach <kbd>Goodtitle</kbd> verschieben, ohne eine Weiterleitung zu erstellen.",
        "apihelp-opensearch-description": "Das Wiki mithilfe des OpenSearch-Protokolls durchsuchen.",
        "apihelp-opensearch-param-search": "Such-Zeichenfolge.",
        "apihelp-opensearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-parse-paramvalue-prop-externallinks": "Gibt die externen Links 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-param-section": "Gibt nur den Inhalt dieses Abschnittes zurück oder erstellt einen neuen Abschnitt, wenn <kbd>new</kbd> angegeben wird.\n\n<kbd>new</kbd> wird nur ausgewertet, wenn auch <var>text</var> angegeben wurde.",
+       "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-parse-param-preview": "Im Vorschaumodus parsen.",
        "apihelp-query+allusers-param-limit": "Wie viele Benutzernamen insgesamt zurückgegeben werden sollen.",
        "apihelp-query+allusers-example-Y": "Benutzer ab <kbd>Y</kbd> auflisten.",
        "apihelp-query+backlinks-description": "Alle Seiten finden, die auf die angegebene Seite verlinken.",
-       "apihelp-query+backlinks-example-simple": "Links auf <kbd>Hauptseite</kbd> anzeigen.",
+       "apihelp-query+backlinks-example-simple": "Links auf <kbd>Main page</kbd> anzeigen.",
        "apihelp-query+blocks-example-simple": "Sperren auflisten",
        "apihelp-query+categorymembers-param-startsortkey": "Stattdessen $1starthexsortkey verwenden.",
        "apihelp-query+categorymembers-param-endsortkey": "Stattdessen $1endhexsortkey verwenden.",
        "apihelp-query+tags-description": "Änderungs-Tags auflisten.",
        "apihelp-query+tags-example-simple": "Verfügbare Tags auflisten",
        "apihelp-query+usercontribs-description": "Alle Bearbeitungen von einem Benutzer abrufen.",
+       "apihelp-query+usercontribs-param-limit": "Die maximale Anzahl der zurückzugebenden Beiträge.",
+       "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-timestamp": "Ergänzt den Zeitstempel der Bearbeitung.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Ergänzt den Kommentar der Bearbeitung.",
+       "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-query+users-description": "Informationen über eine Liste von Benutzern abrufen.",
+       "apihelp-query+users-example-simple": "Gibt Informationen für den Benutzer <kbd>Example</kbd> zurück.",
        "apihelp-rsd-description": "Ein RSD-Schema (Really Simple Discovery) exportieren.",
        "apihelp-rsd-example-simple": "Das RSD-Schema exportieren",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.",
        "apihelp-upload-example-url": "Von einer URL hochladen",
        "apihelp-userrights-param-user": "Benutzername.",
        "apihelp-userrights-param-userid": "Benutzerkennung.",
-       "apihelp-watch-example-watch": "Die Seite <kbd>Hauptseite</kbd> beobachten.",
+       "apihelp-watch-example-watch": "Die Seite <kbd>Main Page</kbd> 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).",
index 281dd29..3610667 100644 (file)
@@ -3,14 +3,16 @@
                "authors": [
                        "Glavkos",
                        "Protnet",
-                       "Stam.nikos"
+                       "Stam.nikos",
+                       "Macofe",
+                       "Geraki"
                ]
        },
        "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 Ανακοινώσεις API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Σφάλματα & αιτήματα]\n</div>\n<strong>Κατάσταση:</strong> Όλα τα χαρακτηριστικά που εμφανίζονται σε αυτή τη σελίδα πρέπει να λειτουργούν, αλλά το API είναι ακόμα σε ενεργό ανάπτυξη, και μπορεί να αλλάξει ανά πάσα στιγμή. Εγγραφείτε στη [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce λίστα αλληλογραφίας] για να ειδοποιείστε για ενημερώσεις.\n\n<strong>Εσφαλμένα αιτήματα:</strong> Όταν στέλνονται εσφαλμένα αιτήματα στο API, επιστρέφεται μία κεφαλίδα HTTP (header) με το κλειδί \"MediaWiki-API-Error\" κι έπειτα η τιμή της κεφαλίδας και ο κωδικός σφάλματος που επιστρέφονται ορίζονται στην ίδια τιμή. Για περισσότερες πληροφορίες, δείτε [[mw:API:Errors_and_warnings|API: Σφάλματα και προειδοποιήσεις]].",
        "apihelp-main-param-action": "Ποια ενέργει να εκτελεστεί.",
        "apihelp-main-param-format": "Η μορφή των δεδομένων εξόδου.",
        "apihelp-main-param-curtimestamp": "Συμπερίληψη της τρέχουσας χρονοσφραγίδας στο αποτέλεσμα.",
-       "apihelp-main-param-uselang": "Γλώσσα για τις μεταφράσεις μηνυμάτων. Μία λίστα κωδικών μπορεί να αντληθεί από το <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> με το <kbd>siprop=languages</kbd>, ή καθορίστε <kbd>user</kbd> για να χρησιμοποιήσετε την προτίμηση γλώσσας του τρέχοντα χρήστη, ή καθορίστε <kbd>content</kbd> για να χρησιμοποιήσετε τη γλώσσα περιεχομένου αυτού του wiki.",
+       "apihelp-main-param-uselang": "Γλώσσα για τις μεταφράσεις μηνυμάτων. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> με <kbd>siprop=languages</kbd> επιστρέφει μια λίστα με κωδικούς γλωσσών, ή καθορίστε <kbd>user</kbd> για να χρησιμοποιήσετε την προτίμηση γλώσσας του τρέχοντα χρήστη, ή καθορίστε <kbd>content</kbd> για να χρησιμοποιήσετε τη γλώσσα περιεχομένου αυτού του wiki.",
        "apihelp-block-description": "Φραγή χρήστη",
        "apihelp-block-param-user": "Όνομα χρήστη, διεύθυνση IP ή εύρος διευθύνσεων IP που θέλετε να επιβάλετε φραγή.",
        "apihelp-block-param-expiry": "Ώρα λήξης. Μπορεί να είναι σχετική (π.χ. <kbd>σε 5 μήνες</kbd> ή <kbd>σε 2 εβδομάδες</kbd>) ή απόλυτη (π.χ. <kbd>2014-09-18T12:34:56Z</kbd>). Αν οριστεί σε <kbd>άπειρη</kbd>, <kbd>απεριόριστη</kbd>, ή <kbd>ποτέ</kbd>, ο αποκλεισμός δεν θα λήξει ποτέ.",
@@ -26,7 +28,7 @@
        "apihelp-createaccount-param-mailpassword": "Εάν οριστεί σε οποιαδήποτε τιμή, ένας τυχαίος κωδικός πρόσβασης θα αποσταλεί μέσω ηλεκτρονικού ταχυδρομείου στο χρήστη.",
        "apihelp-createaccount-param-language": "Κωδικός γλώσσας που να οριστεί ως προεπιλογή για το χρήστη (προαιρετικό, έχει ως προεπιλογή τη γλώσσα περιεχομένου).",
        "apihelp-delete-description": "Διαγραφή σελίδας.",
-       "apihelp-delete-example-simple": "Διαγραφή <kbd>Αρχικής Σελίδας</kbd>.",
+       "apihelp-delete-example-simple": "Διαγραφή <kbd>Main Page</kbd>.",
        "apihelp-edit-description": "Δημιουργία και επεξεργασία σελίδων.",
        "apihelp-edit-param-sectiontitle": "Ο τίτλος νέας ενότητας.",
        "apihelp-edit-param-text": "Περιεχόμενο σελίδας.",
index 374521e..f4373ab 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Reedy",
-                       "Chase me ladies, I'm the Cavalry"
+                       "Chase me ladies, I'm the Cavalry",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
@@ -65,7 +66,7 @@
        "apihelp-query+alltransclusions-example-generator": "Gets pages containing the transclusions.",
        "apihelp-query+backlinks-param-pageid": "Page ID to search. Cannot be used together with <var>$1title</var>.",
        "apihelp-query+backlinks-param-limit": "How many total pages to return. If <var>$1redirect</var> is enabled, limit applies to each level separately (which means up to 2 * <var>$1limit</var> results may be returned).",
-       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page</kbd>.",
        "apihelp-query+blocks-param-ip": "Get all blocks applying to this IP or CIDR range, including range blocks.\nThis cannot be used together with <var>$3users</var>. CIDR ranges broader than IPv4/$1 or IPv6/$2 will not be not accepted.",
        "apihelp-query+blocks-example-simple": "List blocks.",
        "apihelp-query+blocks-example-users": "List blocks of users <kbd>Alice</kbd> and <kbd>Bob</kbd>.",
@@ -77,7 +78,7 @@
        "apihelp-query+deletedrevs-example-mode3-talk": "List the first 50 deleted pages in the {{ns:talk}} namespace (mode 3).",
        "apihelp-query+duplicatefiles-example-simple": "Look for duplicates of [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Look for duplicates of all files.",
-       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page<kbd>.",
+       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-param-protocol": "Protocol of the URL. If empty and <var>$1query</var> set, the protocol is <kbd>http</kbd>. Leave both this and <var>$1query</var> empty to list all external links.",
        "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories.",
        "apihelp-query+imageinfo-param-metadataversion": "Version of metadata to use. If <kbd>latest</kbd> is specified, use latest version. Defaults to <kbd>1</kbd> for backwards compatibility.",
        "apihelp-watch-example-unwatch": "Unwatch the page <kbd>Main Page</kbd>.",
        "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-dump-description": "Output data in PHP's <code>var_dump()</code> format.",
        "apihelp-php-description": "Output data in serialised PHP format.",
        "apihelp-phpfm-description": "Output data in serialised PHP format (pretty-print in HTML).",
        "apihelp-txt-description": "Output data in PHP's <code>print_r()</code> format.",
index 78f0568..30182c1 100644 (file)
@@ -17,7 +17,7 @@
        "apihelp-main-param-servedby": "Include the hostname that served the request in the results.",
        "apihelp-main-param-curtimestamp": "Include the current timestamp in the result.",
        "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body). This must match one of the origins in the <code>Origin</code> header exactly, so it has to be set to something like <kbd>https://en.wikipedia.org</kbd> or <kbd>https://meta.wikimedia.org</kbd>. If this parameter does not match the <code>Origin</code> header, a 403 response will be returned. If this parameter matches the <code>Origin</code> header and the origin is whitelisted, an <code>Access-Control-Allow-Origin</code> header will be set.",
-       "apihelp-main-param-uselang": "Language to use for message translations. A list of codes may be fetched from <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd>, or specify <kbd>user</kbd> to use the current user's language preference, or specify <kbd>content</kbd> to use this wiki's content language.",
+       "apihelp-main-param-uselang": "Language to use for message translations. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd> returns a list of language codes, or specify <kbd>user</kbd> to use the current user's language preference, or specify <kbd>content</kbd> to use this wiki's content language.",
 
        "apihelp-block-description": "Block a user.",
        "apihelp-block-param-user": "Username, IP address, or IP range to block.",
        "apihelp-parse-param-pst": "Do a pre-save transform on the input before parsing it. Only valid when used with text.",
        "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it. Returns the same wikitext, after a PST has been applied. Only valid when used with <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "Only retrieve the content of this section number or when <kbd>new</kbd> generate a new section.\n\n<kbd>new</kbd> section is only honored when specifying <var>text</var>.",
+       "apihelp-parse-param-section": "Only parse the content of this section number.\n\nWhen <kbd>new</kbd>, parse <var>$1text</var> and <var>$1sectiontitle</var> as if adding a new section to the page.\n\n<kbd>new</kbd> is allowed only when specifying <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "New section title when <var>section</var> is <kbd>new</kbd>.\n\nUnlike page editing, this does not fall back to <var>summary</var> when omitted or empty.",
        "apihelp-parse-param-disablelimitreport": "Omit the limit report (\"NewPP limit report\") from the parser output.",
        "apihelp-parse-param-disablepp": "Use <var>$1disablelimitreport</var> instead.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Only list pages in this namespace.",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using <var>$1user</var> and <var>$1namespace</var> together may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "When being used as a generator, generate titles rather than revision IDs.",
-       "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by user <kbd>Example<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by user <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "List the first 50 deleted revisions in the main namespace.",
 
        "apihelp-query+allfileusages-description": "List all file usages, including non-existing.",
        "apihelp-query+backlinks-param-filterredir": "How to filter for redirects. If set to <kbd>nonredirects</kbd> when <var>$1redirect</var> is enabled, this is only applied to the second level.",
        "apihelp-query+backlinks-param-limit": "How many total pages to return. If <var>$1redirect</var> is enabled, the limit applies to each level separately (which means up to 2 * <var>$1limit</var> results may be returned).",
        "apihelp-query+backlinks-param-redirect": "If linking page is a redirect, find all pages that link to that redirect as well. Maximum limit is halved.",
-       "apihelp-query+backlinks-example-simple": "Show links to <kbd>Main page<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Show links to <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page</kbd>.",
 
        "apihelp-query+blocks-description": "List all blocked users and IP addresses.",
        "apihelp-query+blocks-param-start": "The timestamp to start enumerating from.",
        "apihelp-query+extlinks-param-protocol": "Protocol of the URL. If empty and <var>$1query</var> is set, the protocol is <kbd>http</kbd>. Leave both this and <var>$1query</var> empty to list all external links.",
        "apihelp-query+extlinks-param-query": "Search string without protocol. Useful for checking whether a certain page contains a certain external url.",
        "apihelp-query+extlinks-param-expandurl": "Expand protocol-relative URLs with the canonical protocol.",
-       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page<kbd>.",
+       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page</kbd>.",
 
        "apihelp-query+exturlusage-description": "Enumerate pages that contain a given URL.",
        "apihelp-query+exturlusage-param-prop": "Which pieces of information to include:",
        "apihelp-query+pagepropnames-param-limit": "The maximum number of names to return.",
        "apihelp-query+pagepropnames-example-simple": "Get first 10 property names.",
 
-       "apihelp-query+pageprops-description": "Get various properties defined in the page content.",
-       "apihelp-query+pageprops-param-prop": "Only list these props. Useful for checking whether a certain page uses a certain page prop.",
+       "apihelp-query+pageprops-description": "Get various page properties defined in the page content.",
+       "apihelp-query+pageprops-param-prop": "Only list these page properties (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> returns page property names in use). Useful for checking whether pages use a certain page property.",
        "apihelp-query+pageprops-example-simple": "Get properties for the pages <kbd>Main Page</kbd> and <kbd>MediaWiki</kbd>.",
 
        "apihelp-query+pageswithprop-description": "List all pages using a given page property.",
-       "apihelp-query+pageswithprop-param-propname": "Page prop for which to enumerate pages.",
+       "apihelp-query+pageswithprop-param-propname": "Page property for which to enumerate pages (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> returns page property names in use).",
        "apihelp-query+pageswithprop-param-prop": "Which pieces of information to include:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Adds the page ID.",
        "apihelp-query+pageswithprop-paramvalue-prop-title": "Adds the title and namespace ID of the page.",
-       "apihelp-query+pageswithprop-paramvalue-prop-value": "Adds the value of the page prop.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Adds the value of the page property.",
        "apihelp-query+pageswithprop-param-limit": "The maximum number of pages to return.",
        "apihelp-query+pageswithprop-param-dir": "In which direction to sort.",
        "apihelp-query+pageswithprop-example-simple": "List the first 10 pages using <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
index 06478f6..557fe70 100644 (file)
@@ -24,6 +24,7 @@
        "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
        "apihelp-main-param-servedby": "Incluir el nombre del host que ha servido la solicitud en los resultados.",
        "apihelp-main-param-curtimestamp": "Incluir la marca de tiempo actual en el resultado.",
+       "apihelp-main-param-uselang": "El idioma que se usará para las traducciones de mensajes. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devuelve una lista de códigos de idiomas, o especifica <kbd>user</kbd> para usar la preferencia de idioma del usuario actual, o especifica <kbd>content</kbd> para usar el idioma de contenido de este wiki.",
        "apihelp-block-description": "Bloquear a un usuario.",
        "apihelp-block-param-user": "El nombre de usuario, dirección IP o intervalo de IP que quieres bloquear.",
        "apihelp-block-param-expiry": "Fecha de expiración. Puede ser relativa (por ejemplo, <kbd>5 meses</kbd> o <kbd>2 semanas</kbd>) o absoluta (por ejemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Si se establece en <kbd>infinito</kbd>, <kbd>indefinido</kbd>, o <kbd>nunca</kbd>, el bloqueo será permanente.",
@@ -37,7 +38,7 @@
        "apihelp-block-param-reblock": "Si la cuenta ya está bloqueada, sobrescribir el bloqueo existente.",
        "apihelp-block-param-watchuser": "Vigilar las páginas de usuario y de discusión del usuario o de la dirección IP.",
        "apihelp-block-example-ip-simple": "Bloquear la dirección IP <kbd>192.0.2.5</kbd> durante 3 días por el motivo: <kbd>Primer ataque</kbd>.",
-       "apihelp-block-example-user-complex": "Bloquear a usuario <kbd>vándalo</kbd> indefinidamente por el motivo <kbd>Vandalismo</kbd> y evitar que se cree nuevas cuentas o envíe correos.",
+       "apihelp-block-example-user-complex": "Bloquear al usuario <kbd>Vandal</kbd> indefinidamente con el motivo <kbd>Vandalism</kbd> y evitar que se cree nuevas cuentas o envíe correos.",
        "apihelp-checktoken-description": "Comprueba la validez de una ficha desde <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo de ficha a probar.",
        "apihelp-checktoken-param-token": "Ficha a probar.",
        "apihelp-delete-param-reason": "Motivo de la eliminación. Si no se especifica, se generará uno automáticamente.",
        "apihelp-delete-param-watch": "Añadir esta página a la lista de seguimiento del usuario actual.",
        "apihelp-delete-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
-       "apihelp-delete-example-simple": "Borrar la <kbd>Página principal</kbd>",
-       "apihelp-delete-example-reason": "Eliminar <kbd>Página principal</kbd> por el motivo: <kbd>Preparando para moverla</kbd>.",
+       "apihelp-delete-example-simple": "Borrar <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd> con el motivo <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Se desactivó este módulo.",
        "apihelp-edit-description": "Crear y editar páginas.",
        "apihelp-edit-param-title": "Título de la página a editar. No se puede utilizar junto a <var>$1pageid</var>.",
        "apihelp-edit-param-pageid": "ID de la página a editar. No se puede utilizar junto a <var>$1title</var>.",
-       "apihelp-edit-param-section": "Número de la sección. <kbd>0</kbd> para una sección superior, <kbd>nuevo</kbd> para una nueva sección.",
+       "apihelp-edit-param-section": "Número de la sección. <kbd>0</kbd> para una sección superior, <kbd>new</kbd> para una sección nueva.",
        "apihelp-edit-param-sectiontitle": "El título de una sección nueva.",
        "apihelp-edit-param-text": "Contenido de la página.",
        "apihelp-edit-param-summary": "Editar resumen. Además de la sección del título cuando $1section=new y $1sectiontitle no están establecidos.",
        "apihelp-emailuser-param-subject": "Encabezamiento de asunto.",
        "apihelp-emailuser-param-text": "Cuerpo del mensaje.",
        "apihelp-emailuser-param-ccme": "Enviarme una copia de este mensaje.",
-       "apihelp-emailuser-example-email": "Enviar un correo al usuario <kbd>WikiSysop</kbd> con el texto <kbd>Contenido</kbd>.",
+       "apihelp-emailuser-example-email": "Enviar un correo al usuario <kbd>WikiSysop</kbd> con el texto <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Expande todas las plantillas en wikitexto.",
        "apihelp-expandtemplates-param-title": "Título de la página.",
        "apihelp-expandtemplates-param-text": "Sintaxis wiki que se convertirá.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiquetas.",
        "apihelp-feedrecentchanges-param-target": "Mostrar solo los cambios en las páginas enlazadas en esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar los cambios en páginas enlazadas con la página seleccionada.",
-       "apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes",
-       "apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días",
+       "apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes.",
+       "apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días.",
        "apihelp-feedwatchlist-description": "Devuelve el canal de una lista de seguimiento.",
        "apihelp-feedwatchlist-param-feedformat": "El formato del canal.",
        "apihelp-feedwatchlist-param-hours": "Listar las páginas modificadas desde estas horas hasta ahora.",
        "apihelp-filerevert-param-filename": "Nombre de archivo final, sin el prefijo Archivo:",
        "apihelp-filerevert-param-comment": "Comentario de carga.",
        "apihelp-filerevert-param-archivename": "Nombre del archivo de la revisión para deshacerla.",
-       "apihelp-filerevert-example-revert": "Devolver <kbd>Wiki.png</kbd> a la versión del <kbd>5 de marzo de 2011T15:27:40Z</kbd>.",
+       "apihelp-filerevert-example-revert": "Devolver <kbd>Wiki.png</kbd> a la versión del <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Mostrar la ayuda para los módulos especificados.",
-       "apihelp-help-param-modules": "Módulos para mostrar ayuda (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se puede especificar submódulos <kbd>+</kbd>.",
+       "apihelp-help-param-modules": "Módulos para los que mostrar ayuda (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se pueden especificar submódulos con un <kbd>+</kbd>.",
        "apihelp-help-param-submodules": "Incluir ayuda para submódulos del módulo con nombre.",
        "apihelp-help-param-recursivesubmodules": "Incluir ayuda para submódulos recursivamente.",
-       "apihelp-help-param-helpformat": "Formato de la ayuda de salida.",
+       "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-recursive": "Toda la ayuda en una página",
        "apihelp-login-param-domain": "Dominio (opcional).",
        "apihelp-login-param-token": "La clave de inicio de sesión se obtiene en la primera solicitud.",
        "apihelp-login-example-gettoken": "Recuperar clave de inicio de sesión.",
-       "apihelp-login-example-login": "Acceder",
+       "apihelp-login-example-login": "Acceder.",
        "apihelp-logout-description": "Salir y vaciar los datos de la sesión.",
        "apihelp-logout-example-logout": "Cerrar la sesión del usuario actual.",
        "apihelp-managetags-description": "Realizar tareas de administración relacionadas con el cambio de etiquetas.",
        "apihelp-managetags-param-operation": "Qué operación realizar:\n;create: Crear una nueva etiqueta de cambio de uso manual.\n;delete: Eliminar una etiqueta de cambio de la base de datos, eliminando la etiqueta de todas las revisiones, cambios en entradas recientes y registros en los que se ha utilizado.\n;activate: Activar una etiqueta de cambio, permitiendo a los usuarios aplicarla manualmente.\n;deactivate: Desactivar una etiqueta de cambio, evitando que los usuarios la apliquen manualmente.",
        "apihelp-managetags-param-tag": "Etiqueta para crear, eliminar, activar o desactivar. Para crear una etiqueta, esta debe no existir. Para eliminarla, debe existir. Para activarla, debe existir y no estar en uso por ninguna extensión. Para desactivarla, debe estar activada y definida manualmente.",
        "apihelp-managetags-param-reason": "Un motivo opcional para crear, eliminar, activar o desactivar la etiqueta.",
-       "apihelp-managetags-example-create": "Crear una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
+       "apihelp-managetags-example-create": "Crear una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Eliminar la etiqueta <kbd>vandlaismo</kbd> con el motivo <kbd>mal deletreado</kbd>",
-       "apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
-       "apihelp-managetags-example-deactivate": "Desactivar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
+       "apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Desactivar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>No longer required</kbd>",
        "apihelp-move-description": "Trasladar una página.",
        "apihelp-move-param-from": "Título de la página a renombrar. No se puede utilizar con <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la página a renombrar. No se puede utilizar con <var>$1from</var>.",
        "apihelp-move-param-watch": "Añadir la página y su redirección a la lista de seguimiento del usuario actual.",
        "apihelp-move-param-unwatch": "Eliminar la página y la redirección de la lista de seguimiento del usuario.",
        "apihelp-move-param-ignorewarnings": "Ignorar cualquier aviso.",
-       "apihelp-move-example-move": "Mover <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sin dejar una redirección.",
+       "apihelp-move-example-move": "Trasladar <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sin dejar una redirección.",
        "apihelp-opensearch-description": "Buscar en el wiki mediante el protocolo OpenSearch.",
        "apihelp-opensearch-param-search": "Buscar cadena.",
        "apihelp-opensearch-param-limit": "Número máximo de resultados que devolver.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Añade el título del wikitexto analizado.",
        "apihelp-parse-paramvalue-prop-headitems": "Da elementos para colocar en el <code>&lt;encabezado&gt;</code> de la página.",
        "apihelp-parse-paramvalue-prop-headhtml": "Da el <code>&lt;encabezado&gt;</code> analizado de la página.",
-       "apihelp-parse-paramvalue-prop-modules": "Da los módulos ResourceLoader utilizados en la página.",
+       "apihelp-parse-paramvalue-prop-modules": "Da los módulos de ResourceLoader utilizados en la página. <kbd>jsconfigvars</kbd> o bien <kbd>encodedjsconfigvars</kbd> deben solicitarse en conjunto con <kbd>modules</kbd>.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Da la configuración JavaScript de variables específica para la página.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Da la configuración JavaScript de variables específica para la página como cadena JSON.",
        "apihelp-parse-paramvalue-prop-indicators": "Da el HTML de los indicadores de estado utilizados en la página.",
        "apihelp-parse-param-effectivelanglinks": "Incluye enlaces de idiomas proporcionados por las extensiones (para utilizar con <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-disablepp": "Usa <var>$1disablelimitreport</var> en su lugar.",
        "apihelp-parse-param-preview": "Analizar en modo de vista previa.",
-       "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (activa el modo de vista previa).",
+       "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (también activa el modo de vista previa).",
        "apihelp-parse-param-disabletoc": "Omitir la tabla de contenidos en la salida.",
        "apihelp-parse-example-page": "Analizar una página.",
        "apihelp-parse-example-text": "Analizar wikitexto.",
        "apihelp-protect-param-reason": "Motivo de la (des)protección.",
        "apihelp-protect-param-cascade": "Activar la protección en cascada (o sea, proteger plantillas e imágenes transcluidas usadas en esta página). Se ignorará si ninguno de los niveles de protección dados son compatibles con la función de cascada.",
        "apihelp-protect-example-protect": "Proteger una página",
-       "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>todos</kbd>.",
+       "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Desproteger una página anulando las restricciones.",
        "apihelp-purge-param-forcelinkupdate": "Actualizar las tablas de enlaces.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Actualizar la tabla de enlaces y todas las tablas de enlaces de cualquier página que use esta página como una plantilla.",
-       "apihelp-purge-example-simple": "Depurar la <kbd>Página principal</kbd> y la página <kbd>API</kbd>.",
+       "apihelp-purge-example-simple": "Purgar la <kbd>Main Page</kbd> y la página <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purgar las 10 primeras páginas del espacio de nombres principal.",
        "apihelp-query-param-prop": "Qué propiedades obtener para las páginas consultadas.",
        "apihelp-query-param-list": "Qué listas obtener.",
        "apihelp-query+alldeletedrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Listar solo las páginas en este espacio de nombres.",
-       "apihelp-query+alldeletedrevisions-example-user": "Listar las últimas 50 contribuciones borradas del usuario <kbd>Ejemplo<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Listar las últimas 50 contribuciones borradas del usuario <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar las primeras 50 revisiones borradas en el espacio de nombres principal.",
        "apihelp-query+allfileusages-description": "Listar todos los usos del archivo, incluyendo los que no existen.",
        "apihelp-query+allfileusages-param-from": "El título del archivo para comenzar la enumeración.",
        "apihelp-query+allusers-example-Y": "Listar usuarios que empiecen por <kbd>Y</kbd>.",
        "apihelp-query+backlinks-param-pageid": "Identificador de página que buscar. No puede usarse junto con <var>$1title</var>",
        "apihelp-query+backlinks-param-limit": "Cuántas páginas en total se devolverán. Si está activo <var>$1redirect</var>, el límite aplica a cada nivel por separado (lo que significa que se pueden devolver hasta 2 * <var>$1limit</var> resultados).",
-       "apihelp-query+backlinks-example-simple": "Mostrar enlaces a la <kbd>Portada<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Mostrar enlaces a <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Obtener información acerca de las páginas enlazadas a <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Listar todos los usuarios y direcciones IP bloqueadas.",
        "apihelp-query+blocks-param-users": "Lista de usuarios a buscar (opcional).",
        "apihelp-query+blocks-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+categorymembers-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+categorymembers-param-startsortkey": "Utilizar $1starthexsortkey en su lugar.",
        "apihelp-query+categorymembers-param-endsortkey": "Utilizar $1endhexsortkey en su lugar.",
-       "apihelp-query+categorymembers-example-simple": "Obtener las primeras 10 páginas de la <kbd>Categoría:Física</kbd>",
-       "apihelp-query+categorymembers-example-generator": "Obtener información sobre las primeras 10 páginas de la <kbd>Categoría:Física</kbd>",
-       "apihelp-query+contributors-param-limit": "Cuántas contribuyentes se devolverán.",
-       "apihelp-query+contributors-example-simple": "Mostrar los contribuyentes de la <kbd>página principal</kbd>.",
+       "apihelp-query+categorymembers-example-simple": "Obtener las primeras 10 páginas en <kbd>Category:Physics</kbd>.",
+       "apihelp-query+categorymembers-example-generator": "Obtener información sobre las primeras 10 páginas de la <kbd>Category:Physics</kbd>.",
+       "apihelp-query+contributors-param-limit": "Cuántos contribuyentes se devolverán.",
+       "apihelp-query+contributors-example-simple": "Mostrar los contribuyentes de la página <kbd>Main Page</kbd>.",
        "apihelp-query+deletedrevisions-param-tag": "Listar solo las revisiones con esta etiqueta.",
        "apihelp-query+deletedrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+deletedrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
        "apihelp-query+embeddedin-param-filterredir": "Cómo filtrar las redirecciones.",
        "apihelp-query+embeddedin-param-limit": "Cuántas páginas se devolverán.",
        "apihelp-query+extlinks-param-limit": "Cuántos enlaces se devolverán.",
+       "apihelp-query+extlinks-example-simple": "Obtener una lista de los enlaces externos en <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+exturlusage-paramvalue-prop-ids": "Añade el identificado de la página.",
        "apihelp-query+exturlusage-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Proporciona la manera en que se muestra realmente el título de la página",
        "apihelp-query+info-param-token": "Usa [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] en su lugar.",
        "apihelp-query+info-example-simple": "Obtener información acerca de la página <kbd>Main Page</kbd>.",
-       "apihelp-query+info-example-protection": "Obtén información general y protección acerca de la página <kb>Página principal</kbd>.",
+       "apihelp-query+info-example-protection": "Obtén información general y protección acerca de la página <kbd>Main Page</kbd>.",
        "apihelp-query+iwbacklinks-param-limit": "Cuántas páginas se devolverán.",
        "apihelp-query+iwbacklinks-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+iwbacklinks-example-simple": "Obtener las páginas enlazadas a [[wikibooks:Test]]",
        "apihelp-query+logevents-paramvalue-prop-ids": "Agrega el identificador del evento de registro.",
        "apihelp-query+logevents-paramvalue-prop-type": "Añade el tipo del evento de registro.",
        "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Añade el comentario analizado del evento de registro.",
+       "apihelp-query+pageprops-description": "Obtener diferentes propiedades de página definidas en el contenido de la página.",
+       "apihelp-query+pageprops-param-prop": "Sólo listar estas propiedades de página (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devuelve los nombres de las propiedades de página en uso). Útil para comprobar si las páginas usan una determinada propiedad de página.",
+       "apihelp-query+pageswithprop-param-propname": "Propiedad de página para la cual enumerar páginas (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devuelve los nombres de las propiedades de página en uso).",
        "apihelp-query+pageswithprop-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Añade el identificador de página.",
        "apihelp-query+pageswithprop-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Añade el valor de la propiedad de página.",
        "apihelp-query+pageswithprop-param-limit": "El máximo número de páginas que se devolverán.",
        "apihelp-query+pageswithprop-example-simple": "Listar las 10 primeras páginas que utilicen <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+pageswithprop-example-generator": "Obtener información adicional acerca de las 10 primeras páginas que utilicen <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Desaconsejado e ignorado.</span>",
        "apihelp-query+search-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+search-param-interwiki": "Incluir resultados interwiki en la búsqueda, si es posible.",
-       "apihelp-query+search-example-simple": "Buscar <kbd>significado</kbd>.",
+       "apihelp-query+search-example-simple": "Buscar <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Buscar <kbd>meaning</kbd> en los textos.",
        "apihelp-query+search-example-generator": "Obtener información acerca de las páginas devueltas por una búsqueda de <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Devolver información general acerca de la página web.",
        "apihelp-query+users-paramvalue-prop-groups": "Lista todos los grupos a los que pertenece cada usuario.",
        "apihelp-query+users-paramvalue-prop-editcount": "Añade el número de ediciones del usuario.",
        "apihelp-query+users-paramvalue-prop-gender": "Etiqueta el género del usuario. Devuelve \"masculino\", \"femenino\" o \"desconocido\".",
-       "apihelp-query+users-example-simple": "Devolver información del usuario <kbd>Ejemplo</kbd>.",
+       "apihelp-query+users-example-simple": "Devolver información del usuario <kbd>Example</kbd>.",
        "apihelp-query+watchlist-param-start": "El sello de tiempo para comenzar la enumeración",
        "apihelp-query+watchlist-param-end": "El sello de tiempo para finalizar la enumeración.",
        "apihelp-query+watchlist-param-excludeuser": "No listar cambios de este usuario.",
        "apihelp-revisiondelete-param-show": "Qué mostrar en cada revisión.",
        "apihelp-revisiondelete-param-reason": "Motivo de la eliminación o restauración.",
        "apihelp-rollback-param-summary": "Resumen de edición personalizado. Si se deja vacío se utilizará el predeterminado.",
+       "apihelp-stashedit-param-title": "Título de la página que se está editando.",
+       "apihelp-stashedit-param-section": "Número de la sección. <kbd>0</kbd> para una sección superior, <kbd>new</kbd> para una sección nueva.",
+       "apihelp-stashedit-param-sectiontitle": "El título de una sección nueva.",
+       "apihelp-stashedit-param-text": "Contenido de la página.",
+       "apihelp-stashedit-param-contentmodel": "Modelo del contenido nuevo.",
+       "apihelp-stashedit-param-contentformat": "Formato de serialización de contenido utilizado para el texto de entrada.",
+       "apihelp-stashedit-param-baserevid": "Identificador de la revisión de base.",
        "apihelp-tag-param-logid": "Uno o más identificadores de entradas del registro a los que agregar o eliminar la etiqueta.",
        "apihelp-tag-param-reason": "Motivo del cambio.",
        "apihelp-tag-example-rev": "Añadir la etiqueta <kbd>vandalism</kbd> al identificador de revisión 123 sin especificar un motivo",
        "apihelp-unblock-param-reason": "Motivo del desbloqueo.",
        "apihelp-unblock-example-user": "Desbloquear al usuario <kbd>Bob</kbd> con el motivo <kbd>Lo siento, Bob</kbd>",
        "apihelp-undelete-param-reason": "Motivo de la restauración.",
-       "apihelp-undelete-example-revisions": "Restaurar dos revisiones de la página <kbd>Portada</kbd>.",
+       "apihelp-undelete-example-revisions": "Restaurar dos revisiones de la página <kbd>Main Page</kbd>.",
        "apihelp-upload-param-watch": "Vigilar la página.",
        "apihelp-upload-param-ignorewarnings": "Ignorar las advertencias.",
        "apihelp-upload-example-url": "Subir desde una URL.",
        "apihelp-userrights-param-add": "Agregar el usuario a estos grupos.",
        "apihelp-userrights-param-remove": "Eliminar el usuario de estos grupos.",
        "apihelp-userrights-param-reason": "Motivo del cambio.",
-       "apihelp-userrights-example-user": "Agregar al usuario <kbd>FooBot</kbd> al grupo <kbd>bot</kbd> y eliminarlo de los grupos <kbd>sysop</kbd> y <kbd>burócrata</kbd>.",
-       "apihelp-watch-example-watch": "Vigilar la página <kbd>Portada</kbd>.",
+       "apihelp-userrights-example-user": "Agregar al usuario <kbd>FooBot</kbd> al grupo <kbd>bot</kbd> y eliminarlo de los grupos <kbd>sysop</kbd> y <kbd>bureaucrat</kbd>.",
+       "apihelp-watch-example-watch": "Vigilar la página <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Dejar de vigilar la <kbd>Portada</kbd>.",
        "apihelp-format-example-generic": "Devolver el resultado de la consulta en formato $1.",
        "api-help-main-header": "Módulo principal",
index 291ebdb..465f102 100644 (file)
@@ -9,7 +9,8 @@
                        "Sahehco",
                        "Signal89",
                        "Mjbmr",
-                       "Ebraminio"
+                       "Ebraminio",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "کدام عملیات را انجام دهد.",
@@ -53,7 +54,7 @@
        "apihelp-delete-param-reason": "دلیل برای حذف. اگر تنظیم نشود، یک دلیل خودکار ساخته‌شده استفاده می‌شود.",
        "apihelp-delete-param-watch": "افزودن صفحه به فهرست پی‌گیری کاربر فعلی",
        "apihelp-delete-param-unwatch": "صفحه را از پی‌گیری‌تان حذف کنید.",
-       "apihelp-delete-example-simple": "حذف <kbd>صفحهٔ اصلی</kbd>",
+       "apihelp-delete-example-simple": "حذف <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "حذف <kbd>صفحهٔ اصلی</kbd> همراه دلیل  <kbd>آماده‌سازی برای انتقال</kbd>",
        "apihelp-disabled-description": "این پودمان غیرفعال شده است.",
        "apihelp-edit-description": "ایجاد و ویرایش صفحه",
        "apihelp-filerevert-param-filename": "نام پروندهٔ مقصد، بدون پیشوند پرونده:.",
        "apihelp-filerevert-param-comment": "ارسال دیدگاه.",
        "apihelp-filerevert-param-archivename": "نام بایگانی بازبینی برای برگرداندن.",
-       "apihelp-filerevert-example-revert": "برگرداندن <kbd>Wiki.png</kbd> به نسخهٔ <kbd>2011-03-05T15:27:40Z</kbd>",
+       "apihelp-filerevert-example-revert": "برگرداندن <kbd>Wiki.png</kbd> به نسخهٔ <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "راهنما برای پودمان‌های مشخص‌شده را نمایش دهید.",
        "apihelp-help-param-helpformat": "قالب‌بندی خروجی راهنما.",
        "apihelp-help-example-main": "راهنما برای پودمان اصلی",
        "apihelp-opensearch-param-namespace": "فضاهای نامی برای جستجو",
        "apihelp-opensearch-param-suggest": "کاری نکنید اگر <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> false است.",
        "apihelp-opensearch-param-format": "فرمت خروجی.",
-       "apihelp-opensearch-example-te": "یافتن صفحه‌هایی که با <kbd>ته</kbd> آغاز می‌شوند",
+       "apihelp-opensearch-example-te": "یافتن صفحه‌هایی که با <kbd>Te</kbd> آغاز می‌شوند",
        "apihelp-options-example-reset": "بازنشانی همه تنظیمات.",
        "apihelp-paraminfo-param-helpformat": "ساختار راهنمای رشته‌ها",
        "apihelp-parse-example-page": "تجزیه یک صفحه.",
        "apihelp-protect-description": "تغییر سطح محافظت صفحه",
        "apihelp-protect-param-reason": "دلیل برای (عدم) حفاظت.",
        "apihelp-protect-example-protect": "محافظت از صفحه",
-       "apihelp-protect-example-unprotect": "خارج ساختن صفحه از حفاظت با تغییر سطح حفاظتی به <kbd>همگان</kbd>.",
+       "apihelp-protect-example-unprotect": "خارج ساختن صفحه از حفاظت با تغییر سطح حفاظتی به <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "خارج ساختن صفحه از حفاظت با قراردادن هیچ‌گونه محدودیت‌حفاظتی",
        "apihelp-purge-param-forcelinkupdate": "به‌روزرسانی جداول پیوندها.",
        "apihelp-purge-param-forcerecursivelinkupdate": "جدول پیوندها را به‌روز رسانی کنید، و جدول‌های پیوندهای هر صفحه‌ای را که از این صفحه به عنوان الگو استفاده می‌کند به‌روز رسانی کنید.",
        "apihelp-query+allpages-param-minsize": "محدودکردن به صفحه‌هایی که همراه دست کم این تعداد بایت است.",
        "apihelp-query+allpages-param-limit": "میزان کل صفحه‌ها برای بازگرداندن.",
        "apihelp-query+allredirects-param-limit": "تعداد آیتم‌ها برای بازگرداندن.",
-       "apihelp-query+backlinks-example-simple": "نمایش پیوندها به <kbd>صفحهٔ اصلی<kbd>",
+       "apihelp-query+backlinks-example-simple": "نمایش پیوندها به <kbd>Main page</kbd>.",
        "apihelp-query+blocks-example-simple": "فهرست بسته‌شده‌ها",
        "apihelp-query+categories-param-show": "کدام نوع رده‌ها نمایش داده‌شود.",
        "apihelp-query+categories-param-limit": "چه میزان رده بازگردانده شود.",
index 7e3c65c..d850c5f 100644 (file)
@@ -35,7 +35,7 @@
        "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.",
        "apihelp-main-param-curtimestamp": "Inclure l’horodatage actuel dans le résultat.",
        "apihelp-main-param-origin": "En accédant à l’API en utilisant une requête AJAX inter-domaines (CORS), mettre le domaine d’origine dans ce paramètre. Il doit être inclus dans toute requête de pre-flight, et doit donc faire partie de l’URI de la requête (pas du corps du POST). Il doit correspondre exactement à une des origines dans l’entête <code>Origin</code> header, donc il doit être fixé avec quelque chose comme <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Si ce paramètre ne correspond pas à l’entête <code>Origin</code>, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête <code>Origin</code> et que l’origine est en liste blanche, un entête <code>Access-Control-Allow-Origin</code> sera positionné.",
-       "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. Une liste de codes peut être analysée depuis <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd>, ou en spécifiant <kbd>user</kbd> pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant <kbd>content</kbd> pour utiliser le langage du contenu de ce wiki.",
+       "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd> renvoie une liste de codes de langue, ou en spécifiant <kbd>user</kbd> pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant <kbd>content</kbd> pour utiliser le langage du contenu de ce wiki.",
        "apihelp-block-description": "Bloquer un utilisateur.",
        "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer.",
        "apihelp-block-param-expiry": "Durée d’expiration. Peut être relative (par ex. <kbd>5 months</kbd> ou <kbd>2 weeks</kbd>) ou absolue (par ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si elle est mise à <kbd>infinite</kbd>, <kbd>indefinite</kbd> ou <kbd>never</kbd>, le blocage n’expirera jamais.",
@@ -49,7 +49,7 @@
        "apihelp-block-param-reblock": "Si l’utilisateur est déjà bloqué, écraser le blocage existant.",
        "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.",
        "apihelp-block-example-ip-simple": "Bloquer l’adresse IP <kbd>192.0.2.5</kbd> pour trois jours avec le motif <kbd>Premier avertissement</kbd>.",
-       "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur <kbd>Vandale</kbd> avec le motif <kbd>Vandalisme</kbd>, et empêcher la création de nouveau compte et l'envoi de courriel.",
+       "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur <kbd>Vandal</kbd> avec le motif <kbd>Vandalism</kbd>, et empêcher la création de nouveau compte et l'envoi de courriel.",
        "apihelp-checktoken-description": "Vérifier la validité d'un jeton de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Type de jeton testé",
        "apihelp-checktoken-param-token": "Jeton à tester.",
@@ -85,8 +85,8 @@
        "apihelp-delete-param-watchlist": "Ajouter ou supprimer sans distinction la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne rien changer au suivi.",
        "apihelp-delete-param-unwatch": "Supprimer la page de la liste de suivi de l'utilisateur actuel.",
        "apihelp-delete-param-oldimage": "Le nom de l’ancienne image à supprimer tel que fourni par [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Supprimer <kbd>Page principale</kbd>.",
-       "apihelp-delete-example-reason": "Supprimer <kbd>Page principale</kbd> avec le motif <kbd>Préparation au déplacement</kbd>",
+       "apihelp-delete-example-simple": "Supprimer <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Supprimer <kbd>Main Page</kbd> avec le motif <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Ce module a été désactivé.",
        "apihelp-edit-description": "Créer et modifier les pages.",
        "apihelp-edit-param-title": "Titre de la page que vous voulez modifier. Impossible de l’utiliser avec <var>$1pageid</var>.",
        "apihelp-emailuser-param-subject": "Entête du sujet.",
        "apihelp-emailuser-param-text": "Corps du courriel.",
        "apihelp-emailuser-param-ccme": "M’envoyer une copie de ce courriel.",
-       "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur <kbd>WikiSysop</kbd> avec le texte <kbd>Contenu</kbd>.",
+       "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur <kbd>WikiSysop</kbd> avec le texte <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Développe tous les modèles en wikitexte.",
        "apihelp-expandtemplates-param-title": "Titre de la page.",
        "apihelp-expandtemplates-param-text": "Wikitexte à convertir.",
        "apihelp-filerevert-param-filename": "Nom de fichier cible, sans le préfixe File:.",
        "apihelp-filerevert-param-comment": "Télécharger le commentaire.",
        "apihelp-filerevert-param-archivename": "Nom d’archive de la révision à rétablir.",
-       "apihelp-filerevert-example-revert": "Rétablir <kbd>Wiki.png</kbd> dans la version du <kbd>2011-03-05T15:27:40Z</kbd>",
+       "apihelp-filerevert-example-revert": "Rétablir <kbd>Wiki.png</kbd> dans la version du <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Afficher l’aide pour les modules spécifiés.",
        "apihelp-help-param-modules": "Modules pour lesquels afficher l’aide (valeurs des paramètres <var>action</var> et <var>format</var>, ou <kbd>main</kbd>). Les sous-modules peuvent être spécifiés avec un <kbd>+</kbd>.",
        "apihelp-help-param-submodules": "Inclure l’aide pour les sous-modules du module nommé.",
        "apihelp-managetags-param-tag": "Balise à créer, supprimer, activer ou désactiver. Pour la création de balise, elle ne doit pas exister. Pour la suppression de balise, elle doit exister. Pour l’activation de balise, elle doit exister et ne pas être utilisée par une extension. Pour la désactivation de balise, elle doit être actuellement active et définie manuellement.",
        "apihelp-managetags-param-reason": "Un motif facultatif pour créer, supprimer, activer ou désactiver la balise.",
        "apihelp-managetags-param-ignorewarnings": "S’il faut ignorer tout avertissement qui se produirait au cours de l’opération.",
-       "apihelp-managetags-example-create": "Créer une balise nommée <kbd>pourriel</kbd> avec le motif <kbd>À utiliser lors de la revue des modifications</kbd>",
+       "apihelp-managetags-example-create": "Créer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Supprimer la balise <kbd>vandlaism</kbd> avec le motif <kbd>Misspelt</kbd>",
-       "apihelp-managetags-example-activate": "Activer une balise nommée <kbd>pourriel</kbd> avec le motif <kbd>À utiliser dans la revue des modifications</kbd>",
-       "apihelp-managetags-example-deactivate": "Désactiver une balise nommée <kbd>pourriel</kbd> avec le motif <kbd>Plus nécessaire</kbd>",
+       "apihelp-managetags-example-activate": "Activer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Désactiver une balise nommée <kbd>spam</kbd> avec le motif <kbd>No longer required</kbd>",
        "apihelp-move-description": "Déplacer une page.",
        "apihelp-move-param-from": "Titre de la page à renommer. Impossible de l’utiliser avec <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la page à renommer. Impossible à utiliser avec <var>$1from</var>.",
        "apihelp-move-param-unwatch": "Supprimer la page et la redirection de la liste de suivi de l'utilisateur actuel.",
        "apihelp-move-param-watchlist": "Ajouter ou supprimer sans condition la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne pas changer le suivi.",
        "apihelp-move-param-ignorewarnings": "Ignorer tous les avertissements.",
-       "apihelp-move-example-move": "Déplacer <kbd>Mauvais titre</kbd> en <kbd>Bon titre</kbd> sans garder de redirection.",
+       "apihelp-move-example-move": "Déplacer <kbd>Badtitle</kbd> en <kbd>Goodtitle</kbd> sans garder de redirection.",
        "apihelp-opensearch-description": "Rechercher dans le wiki en utilisant le protocole OpenSearch.",
        "apihelp-opensearch-param-search": "Chaîne de recherche.",
        "apihelp-opensearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.",
        "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "Récupérer uniquement le contenu de ce numéro de section ou quand <kbd>nouveau</kbd> génère une nouvelle section.\n\nLa <kbd>nouvelle</kbd> section est mise à l’honneur uniquement quand <var>text</var> est spécifié.",
+       "apihelp-parse-param-section": "Traiter uniquement le contenu de la section ayant ce numéro.\n\nQuand la valeur est <kbd>new</kbd>, traite <var>$1text</var> et <var>$1sectiontitle</var> comme s’ils correspondaient à une nouvelle section de la page.\n\nLa valeur <kbd>new</kbd> n’est autorisée que si <var>text</var> est défini.",
        "apihelp-parse-param-sectiontitle": "Nouveau titre de section quand <var>section</var> vaut <kbd>nouveau</kbd>.\n\nÀ la différence de la modification de page, cela ne revient pas à <var>summary</var> quand il est omis ou vide.",
        "apihelp-parse-param-disablelimitreport": "Omettre le rapport de limite (« rapport de limite du nouveau PP ») de la sortie de l’analyseur.",
        "apihelp-parse-param-disablepp": "Utiliser <var>$1disablelimitreport</var> à la place.",
        "apihelp-purge-description": "Vider le cache des titres fournis.\n\nNécessite une requête POST si l’utilisateur n’est pas connecté.",
        "apihelp-purge-param-forcelinkupdate": "Mettre à jour les tables de liens.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Mettre à jour la table des liens, et mettre à jour les tables de liens pour toute page qui utilise cette page comme modèle",
-       "apihelp-purge-example-simple": "Purger les pages <kbd>Page principale</kbd> et <kbd>API</kbd>.",
+       "apihelp-purge-example-simple": "Purger les pages <kbd>Main Page</kbd> et <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purger les 10 premières pages de l’espace de noms principal",
        "apihelp-query-description": "Extraire des données de et sur MédiaWiki.\n\nToutes les modifications de données devront d’abord utiliser une requête pour obtenir un jeton, afin d’éviter les abus de la part de sites malveillants.",
        "apihelp-query-param-prop": "Quelles propriétés obtenir des pages demandées.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>REMARQUE :</strong> Du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser <var>$1user</var> et <var>$1namespace</var> ensemble peut aboutir à moins de résultats renvoyés que <var>$1limit</var> avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.",
-       "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur <kbd>Exemple</kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal.",
        "apihelp-query+allfileusages-description": "Lister toutes les utilisations de fichier, y compris ceux n’existant pas.",
        "apihelp-query+allfileusages-param-from": "Le titre du fichier depuis lequel commencer l’énumération.",
        "apihelp-query+backlinks-param-filterredir": "Comment filtrer les redirections. Si positionné à <kbd>nonredirects</kbd> quand <var>$1redirect</var> est activé, cela ne s’applique qu’au second niveau.",
        "apihelp-query+backlinks-param-limit": "Combien de pages renvoyer au total. Si $1redirect est activé, la limite s’applique à chaque niveau séparément (ce qui signifie jusqu’à 2 * limite résultats peut être retourné).",
        "apihelp-query+backlinks-param-redirect": "Si le lien vers une page est une redirection, trouver toutes les pages qui ont un lien vers cette redirection aussi. La limite maximale est divisée par deux.",
-       "apihelp-query+backlinks-example-simple": "Afficher les liens vers <kbd>Main page<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers <kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Afficher les liens vers <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Lister tous les utilisateurs et les adresses IP bloqués.",
        "apihelp-query+blocks-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+blocks-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et <var>$1query</var> est positionné, le protocole est <kbd>http</kbd>. Laisser à la fois ceci et <var>$1query</var> vide pour lister tous les liens externes.",
        "apihelp-query+extlinks-param-query": "Rechercher une chaîne sans protocole. Utile pour vérifier si une certaine page contient une certaine URL externe.",
        "apihelp-query+extlinks-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
-       "apihelp-query+extlinks-example-simple": "Obtenir une liste des liens externes de <kbd>Main Page<kbd>.",
+       "apihelp-query+extlinks-example-simple": "Obtenir une liste des liens externes de <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-description": "Énumérer les pages contenant une URL donnée.",
        "apihelp-query+exturlusage-param-prop": "Quelles informations inclure :",
        "apihelp-query+exturlusage-paramvalue-prop-ids": "Ajoute l’ID de la page.",
        "apihelp-query+pagepropnames-description": "Lister les noms de toutes les propriétés de page utilisées sur le wiki.",
        "apihelp-query+pagepropnames-param-limit": "Le nombre maximal de noms à renvoyer.",
        "apihelp-query+pagepropnames-example-simple": "Obtenir les 10 premiers noms de propriété.",
-       "apihelp-query+pageprops-description": "Obtenir diverses propriétés définies dans le contenu de la page.",
-       "apihelp-query+pageprops-param-prop": "Lister uniquement ces propriétés. Utile pour vérifier si une certaine page utilise une certaine propriété de page.",
+       "apihelp-query+pageprops-description": "Obtenir diverses propriétés de page définies dans le contenu de la page.",
+       "apihelp-query+pageprops-param-prop": "Lister uniquement ces propriétés de page (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> renvoie les noms de propriété de page utilisés). Utile pour vérifier si des pages utilisent une certaine propriété de page.",
        "apihelp-query+pageprops-example-simple": "Obtenir les propriétés des pages <kbd>Accueil</kbd> et <kbd>MédiaWiki</kbd>.",
        "apihelp-query+pageswithprop-description": "Lister toutes les pages utilisant une propriété de page donnée.",
-       "apihelp-query+pageswithprop-param-propname": "Propriété de page pour laquelle énumérer les pages.",
+       "apihelp-query+pageswithprop-param-propname": "Propriété de page pour laquelle énumérer les pages (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> renvoie les noms de propriété de page utilisés).",
        "apihelp-query+pageswithprop-param-prop": "Quelles informations inclure :",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Ajoute l’ID de la page.",
        "apihelp-query+pageswithprop-paramvalue-prop-title": "Ajoute le titre et l’ID de l’espace de noms de la page.",
        "apihelp-query+search-param-interwiki": "Inclure les résultats interwiki dans la recherche, s’ils sont disponibles.",
        "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.",
        "apihelp-query+search-param-enablerewrites": "Activer la réécriture interne de la requête. Les serveurs de recherche peuvent changer la requête en une autre dont ils estiment qu'elle donne de meilleurs résultats, par exemple en corrigeant l'orthographe.",
-       "apihelp-query+search-example-simple": "Rechercher  <kbd>signification </kbd>.",
+       "apihelp-query+search-example-simple": "Rechercher <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>signification</kbd>.",
-       "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>signification</kbd>.",
+       "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
        "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :",
        "apihelp-query+siteinfo-paramvalue-prop-general": "Information globale du système.",
        "apihelp-query+users-paramvalue-prop-gender": "Marque le sexe de l’utilisateur. Renvoie « male », « female », ou « unknown ».",
        "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>Exemple</kbd>.",
+       "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages dans la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-param-allrev": "Inclure les multiples révisions de la même page dans l’intervalle de temps fourni.",
        "apihelp-query+watchlist-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-setnotificationtimestamp-example-page": "Réinitialiser l’état de notification pour la <kbd>Page principale<kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour <kbd>Page principale</kbd> afin que toutes les modifications depuis le 1 janvier 2012 soient non vues",
        "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms <kbd>{{ns:user}}</kbd>.",
+       "apihelp-stashedit-description": "Préparer une modification dans le cache partagé.\n\nCeci a pour but d’être utilisé via AJAX depuis le formulaire d’édition pour améliorer la performance de la sauvegarde de la page.",
+       "apihelp-stashedit-param-title": "Titre de la page en cours de modification.",
+       "apihelp-stashedit-param-section": "Numéro de section. <kbd>0</kbd> pour la section du haut, <kbd>new</kbd> pour une nouvelle section.",
+       "apihelp-stashedit-param-sectiontitle": "Le titre pour une nouvelle section.",
+       "apihelp-stashedit-param-text": "Contenu de la page.",
+       "apihelp-stashedit-param-contentmodel": "Modèle de contenu du nouveau contenu.",
+       "apihelp-stashedit-param-contentformat": "Format de sérialisation de contenu utilisé pour le texte saisi.",
+       "apihelp-stashedit-param-baserevid": "ID de révision de la révision de base.",
        "apihelp-tag-description": "Ajouter ou enlever des balises de modification aux révisions ou ou aux entrées de journal individuelles.",
        "apihelp-tag-param-rcid": "Un ou plus IDs de modification récente à partir desquels ajouter ou supprimer la balise.",
        "apihelp-tag-param-revid": "Un ou plus IDs de révision à partir desquels ajouter ou supprimer la balise.",
        "apihelp-userrights-param-add": "Ajouter l’utilisateur à ces groupes.",
        "apihelp-userrights-param-remove": "Supprimer l’utilisateur de ces groupes.",
        "apihelp-userrights-param-reason": "Motif pour la modification.",
-       "apihelp-userrights-example-user": "Ajouter l’utilisateur <kbd>FooBot</kbd> au groupe <kbd>robot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrate</kbd>.",
+       "apihelp-userrights-example-user": "Ajouter l’utilisateur <kbd>FooBot</kbd> au groupe <kbd>bot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Ajouter l’utilisateur d’ID <kbd>123</kbd> au groupe <kbd>robot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrate</kbd>.",
        "apihelp-watch-description": "Ajouter ou supprimer des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-watch-param-title": "La page à (ne plus) suivre. Utiliser plutôt <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Si défini, la page ne sera plus suivie plutôt que suivie.",
-       "apihelp-watch-example-watch": "Suivre la page <kbd>Page principale</kbd>.",
+       "apihelp-watch-example-watch": "Suivre la page <kbd>Main Page</kbd>.",
        "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.",
index 05d5db2..a9a2ea0 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Hangmanwa7id"
+                       "Hangmanwa7id",
+                       "Macofe"
                ]
        },
        "apihelp-block-description": "Bloquer un useur.",
@@ -10,7 +11,7 @@
        "apihelp-createaccount-param-domain": "Domaine pour l’authentification externe (optional).",
        "apihelp-delete-description": "Effacer une page.",
        "apihelp-delete-param-title": "Titre de la page que tu veux effacer. Impossible de l’user avec $1pageid.",
-       "apihelp-delete-example-simple": "Effacer la Page principale",
+       "apihelp-delete-example-simple": "Effacer <kbd>Main Page</kbd>.",
        "apihelp-emailuser-description": "Emailer un useur.",
        "apihelp-expandtemplates-param-title": "Titre de la page.",
        "apihelp-login-param-name": "Nom d’useur.",
index 6b6345d..32e0af5 100644 (file)
@@ -9,7 +9,8 @@
                        "Fisterraeomar",
                        "Toliño",
                        "Umherirrender",
-                       "Amire80"
+                       "Amire80",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:API:Errors_and_warnings|API: Erros e avisos]].",
@@ -37,7 +38,7 @@
        "apihelp-block-param-reblock": "Se o usuario xa está bloqueado, sobreescribir o bloqueo existente.",
        "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou direccións IP e a de conversa deste usuario",
        "apihelp-block-example-ip-simple": "Bloquear dirección IP <kbd>192.0.2.5</kbd> durante tres días coa razón <kbd>Primeiro aviso</kbd>.",
-       "apihelp-block-example-user-complex": "Bloquear indefinidamente ó usuario <kbd>Vándalo</kbd> coa razón <kbd>Vandalismo</kbd>, e impedir a creación de novas contas e envío de correos electrónicos.",
+       "apihelp-block-example-user-complex": "Bloquear indefinidamente ó usuario <kbd>Vandal</kbd> coa razón <kbd>Vandalism</kbd>, e impedir a creación de novas contas e envío de correos electrónicos.",
        "apihelp-checktoken-description": "Verificar a validez dun identificador de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo de identificador a probar.",
        "apihelp-checktoken-param-token": "Símbolo a testar",
        "apihelp-emailuser-param-subject": "Asunto.",
        "apihelp-emailuser-param-text": "Corpo do correo.",
        "apihelp-emailuser-param-ccme": "Enviarme unha copia deste correo.",
-       "apihelp-emailuser-example-email": "Enviar un correo electrónico ó usuario <kbd>Administrador da wiki</kbd> co texto <kbd>Contido</kbd>.",
+       "apihelp-emailuser-example-email": "Enviar un correo electrónico ó usuario <kbd>WikiSysop</kbd> co texto <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Expandir tódolos modelos en wikitexto.",
        "apihelp-expandtemplates-param-title": "Título da páxina.",
        "apihelp-expandtemplates-param-text": "Sintaxis wiki a converter.",
        "apihelp-managetags-param-tag": "Etiqueta para crear, borrar, activar ou desactivar. Para a creación da etiqueta, a etiqueta non pode existir previamente. Para o borrado da etiqueta, a etiqueta debe existir. Para a activación da etiqueta, a etiqueta debe existir e non pode ser usada por unha extensión. Para desactivar unha etiqueta, a etiqueta debe estar activa e definida manualmente.",
        "apihelp-managetags-param-reason": "Un motivo opcional para crear, borrar, activar ou desactivar a etiqueta.",
        "apihelp-managetags-param-ignorewarnings": "Ignorar calquera aviso que apareza durante a operación.",
-       "apihelp-managetags-example-create": "Crear unha etiqueta chamada <kbd>publicidade</kbd> coa razón <kbd>Para usar en vixiancia de edicións</kbd>",
+       "apihelp-managetags-example-create": "Crear unha etiqueta chamada <kbd>spam</kbd> coa razón <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Borrar a etiqueta <kbd>vandalismo</kbd> coa razón <kbd>Erros ortográficos</kbd>",
-       "apihelp-managetags-example-activate": "Activar a etiqueta chamada <kbd>publicidade</kbd> coa razón <kbd>Para usar en vixiancia de edicións</kbd>",
-       "apihelp-managetags-example-deactivate": "Desactivar a etiqueta chamada <kbd>publicidade</kbd> coa razón <kbd>Xa non é necesaria</kbd>",
+       "apihelp-managetags-example-activate": "Activar a etiqueta chamada <kbd>spam</kbd> coa razón <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Desactivar a etiqueta chamada <kbd>spam</kbd> coa razón <kbd>No longer required</kbd>",
        "apihelp-move-description": "Mover unha páxina.",
        "apihelp-move-param-from": "Título da páxina que quere renomear. Non pode usarse xunto con <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "Identificador da páxina que quere renomear. Non pode usarse xunto con <var>$1from</var>.",
        "apihelp-move-param-unwatch": "Eliminar a páxina e a redirección da páxina de vixiancia do usuario actual.",
        "apihelp-move-param-watchlist": "Engadir ou eliminar sen condicións a páxina da lista de vixiancia do usuario actual, use as preferencias ou non cambie a vixiancia.",
        "apihelp-move-param-ignorewarnings": "Ignorar as advertencias.",
-       "apihelp-move-example-move": "Mover <kbd>Títulomalo</kbd> a <kbd>Títulobo</kbd> sen deixar unha redirección.",
+       "apihelp-move-example-move": "Mover <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sen deixar unha redirección.",
        "apihelp-opensearch-description": "Buscar no wiki mediante o protocolo OpenSearch.",
        "apihelp-opensearch-param-search": "Buscar texto.",
        "apihelp-opensearch-param-limit": "Número máximo de resultados a visualizar.",
        "apihelp-purge-description": "Borrar a caché para os títulos indicados.\n\nPrecisa dunha petición POST se o usuario non está conectado.",
        "apihelp-purge-param-forcelinkupdate": "Actualizar as táboas de ligazóns.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Actualizar a táboa de ligazóns, e actualizar as táboas de ligazóns para calquera páxina que use esta páxina como modelo.",
-       "apihelp-purge-example-simple": "Purgar a <kbd>Páxina Principal</kbd> e páxina da <kbd>API</kbd>.",
+       "apihelp-purge-example-simple": "Purgar a <kbd>Main Page</kbd> e páxina da <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purgar as primeiras 10 páxinas no espazo de nomes principal.",
        "apihelp-query-description": "Consultar datos de e sobre MediaWiki.\n\nTodas as modificacións de datos primeiro teñen que facer unha busca para obter un identificador para evitar  abusos de sitios maliciosos.",
        "apihelp-query-param-prop": "Que propiedades obter para as páxinas buscadas.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Só listar páxinas neste espazo de nomes.",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], ó usar á vez <var>$1user</var> e <var>$1namespace</var> pode devolver menos resultados de <var>$1limit</var> antes de continuar, en casos extremos, pode que non devolva resultados.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Usado como xenerador, xenera títulos no canto de IDs de revisión.",
-       "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario <kbd>Exemplo<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as 50 primeiras revisións borradas no espazo de nomes principal.",
        "apihelp-query+allfileusages-description": "Lista todos os usos de ficheiro, incluído os que non existen.",
        "apihelp-query+allfileusages-param-from": "Título do ficheiro no que comezar a enumerar.",
        "apihelp-query+backlinks-param-filterredir": "Como filtrar as redireccións. Se o valor é <kbd>nonredirects</kbd> cando <var>$1redirect</var> está activa, só se aplica ó segundo nivel.",
        "apihelp-query+backlinks-param-limit": "Cantas páxinas devolver. Se <var>$1redirect</var> está activa, aplícase o límite a cada nivel de forma separada (isto significa que poden devolverse ata 2 * <var>$1limit</var> resultados).",
        "apihelp-query+backlinks-param-redirect": "Se a ligazón sobre unha páxina é unha redirección, atopa tamén todas as páxinas que ligan con esa redirección. O límite máximo divídese á metade.",
-       "apihelp-query+backlinks-example-simple": "Mostrar ligazóns á <kbd>Páxina principal<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Obter a información das páxinas que ligan á <kbd>Páxina principal<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Mostrar ligazóns á <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Obter a información das páxinas que ligan á <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Listar todos os usuarios e direccións IP bloqueados.",
        "apihelp-query+blocks-param-start": "Selo de tempo para comezar a enumeración.",
        "apihelp-query+blocks-param-end": "Selo de tempo para rematar a enumeración.",
        "apihelp-query+extlinks-param-protocol": "Protocolo da URL. Se está baleiro e está activo <var>$1query</var>, o protocolo é <kbd>http</kbd>. Deixar esa variable e a <var>$1query</var> baleiras para listar todas as ligazóns externas.",
        "apihelp-query+extlinks-param-query": "Buscar cadea sen protocolo. Útil para verificar se unha páxina determinada contén unha URL externa determinada.",
        "apihelp-query+extlinks-param-expandurl": "Expandir as URLs relativas a un protocolo co protocolo canónico.",
-       "apihelp-query+extlinks-example-simple": "Obter unha de ligazóns externas á <kbd>Páxina Principal<kbd>.",
+       "apihelp-query+extlinks-example-simple": "Obter unha de ligazóns externas á <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-description": "Enumerar páxinas que conteñen unha dirección URL dada.",
        "apihelp-query+exturlusage-param-prop": "Que información incluír:",
        "apihelp-query+exturlusage-paramvalue-prop-ids": "Engade o ID da páxina.",
        "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-example-simple": "Buscar por <kbd>significado</kbd>.",
+       "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>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+siteinfo-description": "Devolver información xeral sobre o sitio.",
        "apihelp-query+siteinfo-param-prop": "Que información obter:",
        "apihelp-query+siteinfo-paramvalue-prop-general": "Información xeral do sistema.",
        "apihelp-query+users-paramvalue-prop-gender": "Marca o xénero do usuario. Devolve \"home\", \"muller\" ou \"descoñecido\".",
        "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>Exemplo</kbd>.",
+       "apihelp-query+users-example-simple": "Mostar información para o usuario <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Ver os cambios recentes das páxinas na lista de vixiancia do usuario actual.",
        "apihelp-query+watchlist-param-allrev": "Incluír múltiples revisións da mesma páxina dentro do intervalo de tempo indicado.",
        "apihelp-query+watchlist-param-start": "Selo de tempo para comezar a enumeración",
        "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-param-text": "Contido da páxina.",
+       "apihelp-stashedit-param-contentmodel": "Modelo de contido para o novo contido.",
+       "apihelp-stashedit-param-contentformat": "Formato de serialización de contido utilizado para o texto de entrada.",
+       "apihelp-stashedit-param-baserevid": "Identificador da revisión da revisión de base.",
        "apihelp-tag-description": "Engadir ou eliminar etiquetas de cambio de revisións individuais ou entradas de rexistro.",
        "apihelp-tag-param-rcid": "Identificadores de un ou máis cambios recentes nos que engadir ou eliminar a etiqueta.",
        "apihelp-tag-param-revid": "Identificadores de unha ou máis revisións nas que engadir ou eliminar a etiqueta.",
        "apihelp-undelete-param-fileids": "IDs das modificacións de ficheiro a restaurar. Se <var>$1timestamps</var> e <var>$1fileids</var> están baleiras, serán restauradas todas.",
        "apihelp-undelete-param-watchlist": "Engadir ou eliminar a páxina da lista de vixiancia do usuario actual sen condicións, use as preferencias ou non cambie a vixiancia.",
        "apihelp-undelete-example-page": "Restaurar a <kbd>Páxina Principal</kbd>.",
-       "apihelp-undelete-example-revisions": "Restaurar dúas revisións de <kbd>[[Main Page]]</kbd>.",
+       "apihelp-undelete-example-revisions": "Restaurar dúas revisións de <kbd>Main Page</kbd>.",
        "apihelp-upload-description": "Subir un ficheiro, ou obter o estado de subas pedentes.\n\nHai varios métodos dispoñibles:\n*Subir o contido do ficheiro directamente, usando o parámetro <var>$1file</var>.\n*Subir o ficheiro por partes, usando os parámetros <var>$1filesize</var>, <var>$1chunk</var>, e <var>$1offset</var>.\n*Mandar ó servidor MediaWiki que colla un ficheiro dunha URL, usando o parámetro <var>$1url</var>.\n*Completar unha suba anterior que fallou a causa dos avisos, usando o parámetro <var>$1filekey</var>. \nTeña en conta que o HTTP POST debe facerse como suba de ficheiro (p.ex. usando <code>multipart/form-data</code>)cando se envie o <var>$1file</var>.",
        "apihelp-upload-param-filename": "Nome de ficheiro obxectivo.",
        "apihelp-upload-param-comment": "Subir comentario. Tamén usado como texto da páxina inicial para ficheiros novos se non se especifica <var>$1text</var>.",
        "apihelp-userrights-param-add": "Engadir o usuario a estes grupos.",
        "apihelp-userrights-param-remove": "Eliminar o usuario destes grupos.",
        "apihelp-userrights-param-reason": "Motivo para o cambio.",
-       "apihelp-userrights-example-user": "Engadir o usuario <kbd>FooBot</kbd> ó grupo <kbd>bot</kbd>, e eliminar dos grupos <kbd>sysop</kbd> e <kbd>burócrata</kbd>.",
+       "apihelp-userrights-example-user": "Engadir o usuario <kbd>FooBot</kbd> ó grupo <kbd>bot</kbd>, e eliminar dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Engadir ó usuario con ID <kbd>123</kbd> ó grupo <kbd>bot</kbd>, e borralo dos grupos <kbd>sysop</kbd> e <kbd>burócrata</kbd>.",
        "apihelp-watch-description": "Engadir ou borrar páxinas da lista de vixiancia do usuario actual.",
        "apihelp-watch-param-title": "Páxina a vixiar/deixar de vixiar. Usar no canto <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Se está definido, a páxina deixará de estar vixiada en vez de vixiada.",
-       "apihelp-watch-example-watch": "Vixiar a páxina <kbd>Páxina Principal</kbd>.",
+       "apihelp-watch-example-watch": "Vixiar a páxina <kbd>Main Page</kbd>.",
        "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.",
index 5cd1d94..be7f45b 100644 (file)
@@ -9,7 +9,8 @@
                        "ערן",
                        "LaG roiL",
                        "Elyashiv",
-                       "Umherirrender"
+                       "Umherirrender",
+                       "Macofe"
                ]
        },
        "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 הודעות על 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: שגיאות ואזהרות]].",
@@ -23,7 +24,7 @@
        "apihelp-main-param-servedby": "לכלול את שם המארח ששירת את הבקשה בתוצאות.",
        "apihelp-main-param-curtimestamp": "הכללת חותם־הזמן הנוכחי בתוצאה.",
        "apihelp-main-param-origin": "בעת גישה ל־API עם בקשת AJAX חוצה מתחמים (CORS), יש להציב כאן את המתחם שהבקשה יוצאת ממנו. זה היה להיות כלול בכל בקשה מקדימה, ולכן הוא חייב להיות חלק מה־URI של הבקשה (לא גוף ה־POST). זה חייב להיות תואם במדויק לאחד המקורות בכותרת <code>Origin</code>, כך שזה צריך להיות מוגדר למשהו כמו <kbd>https://en.wikipedia.org</kbd> או <kbd>https://meta.wikimedia.org</kbd>. אם הפרמטר הזה אינו תואם לכותרת <code>Origin</code>, תוחזר תשובת 403. אם הפרמטר הזה תורם לכותרת <code>Origin</code> והמקור נמצא ברשימה הלבנה, תוגדר כותרת <code>Access-Control-Allow-Origin</code>.",
-       "apihelp-main-param-uselang": "×\91×\90×\99×\96×\95 ×©×¤×\94 ×\9c×\94שת×\9eש ×\9cתר×\92×\95×\9e×\99 ×\94×\95×\93×¢×\95ת. ×\90פשר ×\9cק×\91×\9c ×¨×©×\99×\9eת ×§×\95×\93×\99×\9d ×\9eÖ¾<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> ×¢×\9d <kbd>siprop=languages</kbd> ×\90×\95 ×\9cצ×\99×\99×\9f <kbd>user</kbd> ×\9b×\93×\99 ×\9c×\94שת×\9eש ×\91×\94×¢×\93פת ×\94שפ×\94 ×©×\9c ×\94×\9eשת×\9eש ×\94× ×\95×\9b×\97×\99, ×\90×\95 ×\9c×\94×\92×\93×\99ר ×\90ת <kbd>content</kbd> להשתמש בקוד השפה של הוויקי הזה.",
+       "apihelp-main-param-uselang": "×\91×\90×\99×\96×\95 ×©×¤×\94 ×\9c×\94שת×\9eש ×\9cתר×\92×\95×\9e×\99 ×\94×\95×\93×¢×\95ת. ×\94קר×\99×\90×\94 <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> ×¢×\9d <kbd>siprop=languages</kbd> ×\9e×\97×\96×\99ר×\94 ×¨×©×\99×\9eת ×§×\95×\93×\99×\9d. ×¦×\99×\95×\9f <kbd>user</kbd> ×\9b×\93×\99 ×\9c×\94שת×\9eש ×\91×\94×¢×\93פת ×\94שפ×\94 ×©×\9c ×\94×\9eשת×\9eש ×\94× ×\95×\9b×\97×\99, ×\95צ×\99×\95×\9f <kbd>content</kbd> להשתמש בקוד השפה של הוויקי הזה.",
        "apihelp-block-description": "חסימת משתמש.",
        "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח 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-parse-param-pst": "לעשות התמרה לפני שמירה על הקלט לפני פענוחו. תקין רק בשימוש עם טקסט.",
        "apihelp-parse-param-onlypst": "לעשות התמרה לפני שמירה (pre-save transform‏, PST) על הקלט, אבל לא לפענח אותו. מחזיר את אותו קוד הוויקי אחרי החלת PST. תקף רק בשימוש עם <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "כולל קישור שפה שמספקות הרחבות (לשימוש עם <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "×\9c×\90×\97×\96ר ×\90ת ×\94ת×\95×\9b×\9f ×©×\9c ×\94פסק×\94 ×¢×\9d ×\94×\9eספר ×\94×\96×\94, ×\90×\95, ×\90×\9d ×\96×\94 <kbd>new</kbd>, ×\9c×\99צ×\95ר ×¤×¡×§×\94 ×\97×\93ש×\94.\n\n<kbd>new</kbd> ×\99×\9b×\95×\91×\93 ×¨×§ ×\91עת ×¦×\99×\95×\9f <var>text</var>.",
+       "apihelp-parse-param-section": "×\9cפענ×\97 ×¨×§ ×\90ת ×\94ת×\95×\9b×\9f ×©×\9c ×\94פסק×\94 ×©×\96×\94 ×\9eספר×\94.\n\n×\9bשצ×\95×\99×\9f <kbd>new</kbd>, ×\9cפענ×\97 ×\90ת <var>$1text</var> ×\95×\90ת <var>$1sectiontitle</var> ×\9b×\90×\99×\9c×\95 × ×\95ספת ×¤×¡×§×\94 ×\97×\93ש×\94 ×\9c×\93×£.\n\n×\9e×\95תר ×\9c×\94שת×\9eש ×\91Ö¾<kbd>new</kbd> ×¨×§ ×\91עת ×©×\99×\9e×\95ש ×\91Ö¾<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+alldeletedrevisions-param-namespace": "לרשום רק דפים במרחב השם הזה.",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>לתשומת לבך:</strong> בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־<var>$1user</var> וב־<var>$1namespace</var> ביחד עלול להניב החזרה של פחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "בעת שימוש בתור מחולל, לחולל כותרת במקום מזהי גרסה.",
-       "apihelp-query+alldeletedrevisions-example-user": "לרשום את 50 התרומות המחוקות האחרונות של משתמש <kbd>Example<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "לרשום את 50 התרומות המחוקות האחרונות של משתמש <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "רשימת 50 הגרסאות המחוקות הראשונות במרחב הראשי.",
        "apihelp-query+allfileusages-description": "לרשום את כל שימושי הקובץ, כולל בלתי־קיימים.",
        "apihelp-query+allfileusages-param-from": "מאיזה שם קובץ להתחיל למנות.",
        "apihelp-query+allimages-param-limit": "כמה תמונות להחזיר בסך הכול.",
        "apihelp-query+allimages-example-B": "הצגת רשימה של קבצים שמתחילים באות <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "הצגת רשימת קבצים שהועלו לאחרונה, דומה ל־[[Special:NewFiles]].",
-       "apihelp-query+allimages-example-mimetypes": "להציג רשימה של קבצות שסוג ה־MIME שלהם הוא <kbd>image/png</kbd> או <kbd>image/png</kbd>.",
+       "apihelp-query+allimages-example-mimetypes": "להציג רשימה של קבצות שסוג ה־MIME שלהם הוא <kbd>image/png</kbd> או <kbd>image/gif</kbd>.",
        "apihelp-query+allimages-example-generator": "הצגת מידע על 4 קבצים המתחילים באות <kbd>T</kbd>.",
        "apihelp-query+alllinks-description": "למנות את כל הקישורים שמצביעים למרחב שם נתון.",
        "apihelp-query+alllinks-param-from": "מאיזה שם קישור להתחיל למנות.",
        "apihelp-query+backlinks-param-limit": "כמה דפים להחזיר בסך הכול. אם <var>$1redirect</var> מופעל, ההגבלה חלה על כל רמה בנפרד (כלומר יכולות להיות מוחזרות עד <span dir=\"ltr\">2 * <var>$1limit</var></span> תוצאות).",
        "apihelp-query+backlinks-param-redirect": "אם הדף המקשר הוא הפניה, למצוא גם את כל הדפים שמקשרים לאותה ההפניה. ההגבלה המרבית מוקטנת בחצי.",
        "apihelp-query+backlinks-example-simple": "הצגת קישורים ל־<kbd>Main Page</kbd>.",
-       "apihelp-query+backlinks-example-generator": "קבל מידע על דפים שמקשרים ל־<kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-generator": "קבל מידע על דפים שמקשרים ל־<kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "לרשום את כל המשתמשים וכתובות ה־IP שנחסמו.",
        "apihelp-query+blocks-param-start": "מאיזה חותם‏־זמן להתחיל למנות.",
        "apihelp-query+blocks-param-end": "באיזה חותם זמן להפסיק למנות.",
        "apihelp-query+categorymembers-param-endsortkeyprefix": "תחילית מפתח מיון שהרשימה תסתיים <strong>לפניה</strong> (לא <strong>בה</strong>, אם הערך הזה מוגדר, הוא לא ייכלל!). יכול לשמש רק עם $1sort=sortkey. דורס את $1endhexsortkey.",
        "apihelp-query+categorymembers-param-startsortkey": "כדאי להשתמש ב־$1starthexsortkey במקום.",
        "apihelp-query+categorymembers-param-endsortkey": "כדאי להשתמש ב־$1endhexsortkey במקום.",
-       "apihelp-query+categorymembers-example-simple": "קבלת עשרת העמודים הראשונים שתחת <kbd>קטגוריה:פיזיקה</kbd>.",
+       "apihelp-query+categorymembers-example-simple": "קבלת עשרת העמודים הראשונים שתחת <kbd>Category:Physics</kbd>.",
        "apihelp-query+categorymembers-example-generator": "קבל מידע על הדף עבור 10 הדפים הראשונים ב־<kbd>Category:Physics</kbd>.",
        "apihelp-query+contributors-description": "קבלת רשימה של תורמים שנכנסו לחשבון ומניין של תורמים אלמוניים לדף.",
        "apihelp-query+contributors-param-group": "לכלול רק משתמשים בקבוצות הנתונות. לא כולל קבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.",
        "apihelp-query+contributors-param-rights": "לכלול רק משתמשים עם ההרשאות הנתונות. לא כולל הרשאות שניתנו בקבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.",
        "apihelp-query+contributors-param-excluderights": "לא לכלול משתמשים עם ההרשאות הנתונות. לא כולל הרשאות שניתנו בקבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.",
        "apihelp-query+contributors-param-limit": "כמה תורמים להחזיר.",
-       "apihelp-query+contributors-example-simple": "הצגת תורמים לדף <kbd>עמוד ראשי</kbd>.",
+       "apihelp-query+contributors-example-simple": "הצגת תורמים לדף <kbd>Main Page</kbd>.",
        "apihelp-query+deletedrevisions-description": "קבלת מידע על גרסה מחוקה.\n\nיכול לשמש במספר דרכים:\n# קבלת גרסאות מחוקות עבור ערכת דפים, על־ידי הגדרת שמות או מזהי דף. ממוין לפי שם וחותם־זמן.\n# קבלת מידע על ערכת גרסאות מחוקות באמצעות הגדרת המזהים שלהם עם revid־ים. ממוין לפי מזהה גרסה.",
        "apihelp-query+deletedrevisions-param-start": "מאיזה חותם־זמן להתחיל למנות. לא תקף בעיבוד רשימת מזהי גרסה.",
        "apihelp-query+deletedrevisions-param-end": "באיזה חותם־זמן להפסיק למנות. לא תקף בעת עיבוד רשימת מזהי גרסה.",
        "apihelp-query+extlinks-param-protocol": "הפרוטוקול של ה־URL. אם זה ריק, ו־<var>$1query</var> מוגדר, הפרוטוקול הוא <kbd>http</kbd>. יש להשאיר את זה ואת <var>$1query</var> ריק כדי לרשום את כל הקישורים החיצוניים.",
        "apihelp-query+extlinks-param-query": "מחרוזת חיפוש ללא פרוטוקול. שימושי לבדיקה האם דף מסוים מכיל url חיצוני מסוים.",
        "apihelp-query+extlinks-param-expandurl": "הרחבת URL־ים בעלי פרוטוקול יחסי בפרוטוקול קנוני.",
-       "apihelp-query+extlinks-example-simple": "קבלת רשימת קישורים חיצוניים ב־<kbd>Main Page<kbd>.",
+       "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": "הוספת מזהה הדף.",
        "apihelp-query+pagepropnames-description": "רשימת כל שמות המאפיינים שמשמשים בוויקי.",
        "apihelp-query+pagepropnames-param-limit": "המספר המרבי של השמות להחזיר.",
        "apihelp-query+pagepropnames-example-simple": "לתת את 10 שמות המאפיינים הראשונים.",
-       "apihelp-query+pageprops-description": "קבלת מאפיינים שונים בתוכן הדף.",
-       "apihelp-query+pageprops-param-prop": "לרשום רק את המאפיינים האלה. שימושי לבדיקה האם דף מסוים משתמש במאפיין דף מסוים.",
+       "apihelp-query+pageprops-description": "קבלת מאפייני דף שונים שמוגדרים בתוכן הדף.",
+       "apihelp-query+pageprops-param-prop": "לרשום רק את המאפיינים האלה (שימוש ב־<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> מחזיר רשימת שמות מאפייני דף בשימוש). זה שימושי לבדיקה האם דפים משתמשים במאפיין דף מסוים.",
        "apihelp-query+pageprops-example-simple": "קבלת מאפיינים עבור הדפים <kbd>Main Page</kbd> ו־<kbd>MediaWiki</kbd>.",
        "apihelp-query+pageswithprop-description": "לרשום את כל הדפים שמשתמשים במאפיין דף נתון.",
-       "apihelp-query+pageswithprop-param-propname": "מאפיין דף שעבורו למנות דפים.",
+       "apihelp-query+pageswithprop-param-propname": "מאפיין דף שעבורו למנות דפים (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> מחזיר רשימת שמות מאפייני דף בשימוש).",
        "apihelp-query+pageswithprop-param-prop": "אילו חלקי מידע לכלול:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "הוספת מזהה הדף.",
        "apihelp-query+pageswithprop-paramvalue-prop-title": "הוספת השם ומזהה מרחב השם של הדף.",
        "apihelp-setnotificationtimestamp-example-page": "אתחול מצב ההודעה עבור <kbd>Main Page</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "הגדרת חותם־הזמן להודעה ל־<kbd>Main page</kbd> כך שכל העריכות מאז 1 בינואר 2012 מוגדרות בתור כאלה שלא נצפו.",
        "apihelp-setnotificationtimestamp-example-allpages": "אתחול מצב ההודעה עבור דפים במרחב השם <kbd>{{ns:user}}</kbd>.",
+       "apihelp-stashedit-description": "הכנת עריכה במטמון משותף.\n\nזה מיועד לשימוש דרך AJAX מתוך ערך כדי לשפר את הביצועים של שמירת הדף.",
+       "apihelp-stashedit-param-title": "כותרת הדף הנערך.",
+       "apihelp-stashedit-param-section": "מספר הפסקה. <kbd>0</kbd> עבור הפסקה הראשונה, <kbd>new</kbd> עבור פסקה חדשה.",
+       "apihelp-stashedit-param-sectiontitle": "כותרת הפסקה החדשה.",
+       "apihelp-stashedit-param-text": "תוכן הדף.",
+       "apihelp-stashedit-param-contentmodel": "מודל התוכן של התוכן החדש.",
+       "apihelp-stashedit-param-contentformat": "תסדיר הסדרת תוכן עבור טקסט הקלט.",
+       "apihelp-stashedit-param-baserevid": "מזהה גסה של גרסת הבסיס.",
        "apihelp-tag-description": "הוספת או הסרה של תגים מגרסאות בודדות או עיולי יומן בודדים.",
        "apihelp-tag-param-rcid": "מזהה שינוי אחרון אחד או יותר שתג יתווסף אליו או יוסר ממנו.",
        "apihelp-tag-param-revid": "מזהה גרסה אחד או יותר שתג יתווסף אליה או יוסר ממנה.",
index 7e6ecc4..8b93819 100644 (file)
@@ -4,7 +4,8 @@
                        "Csega",
                        "Dorgan",
                        "Tacsipacsi",
-                       "ViDam"
+                       "ViDam",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Milyen műveletet hajtson végre.",
@@ -19,7 +20,7 @@
        "apihelp-block-param-nocreate": "Új regisztráció megakadályozása",
        "apihelp-createaccount-param-name": "Felhasználónév.",
        "apihelp-delete-description": "Lap törlése.",
-       "apihelp-delete-example-simple": "<kbd>Kezdőlap</kbd> törlése.",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd> törlése.",
        "apihelp-edit-example-edit": "Lap szerkesztése",
        "apihelp-expandtemplates-param-title": "Lap címe.",
        "apihelp-userrights-param-userid": "Felhasználói azonosító."
index 5201072..7a7675d 100644 (file)
@@ -6,10 +6,10 @@
        },
        "apihelp-main-param-action": "Qual action exequer.",
        "apihelp-main-param-format": "Le formato del resultato.",
-       "apihelp-main-param-maxlag": "Le latentia maximal pote esser usate quando MediaWiki es installate in un cluster de base de datos replicate. Pro evitar actiones que causa additional latentia de replication de sito, iste parametro pote facer le cliente attender usque le latentia de replication es minus que le valor specificate. In caso de latentia excessive, le codice de error \"maxlag\" es retornate con un message como \"Attende $host: $lag secundas de latentia\".<br />Vide https://www.mediawiki.org/wiki/Manual:Maxlag_parameter pro plus information.",
-       "apihelp-main-param-smaxage": "Fixar le capite <code>s-maxage</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
-       "apihelp-main-param-maxage": "Fixar le capite <code>max-age</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
-       "apihelp-main-param-assert": "Verificar si le usator ha aperite session si mittite a \"user\", o si ha le derecto de usator robot si \"bot\".",
+       "apihelp-main-param-maxlag": "Le latentia maximal pote esser usate quando MediaWiki es installate in un cluster de base de datos replicate. Pro evitar actiones que causa additional latentia de replication de sito, iste parametro pote facer le cliente attender usque le latentia de replication es minus que le valor specificate. In caso de latentia excessive, le codice de error <samp>maxlag</samp> es retornate con un message como <samp>Attende $host: $lag secundas de latentia</samp>.<br />Vide [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] pro plus information.",
+       "apihelp-main-param-smaxage": "Fixar le capite de controlo de cache HTTP <code>s-maxage</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
+       "apihelp-main-param-maxage": "Fixar le capite de controlo de cache HTTP <code>max-age</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
+       "apihelp-main-param-assert": "Verificar si le usator ha aperite session si mittite a <kbd>user</kbd>, o si ha le derecto de usator robot si <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Omne valor fornite hic essera includite in le responsa. Pote esser usate pro distinguer requestas.",
        "apihelp-main-param-servedby": "Includer in le resultato le nomine del host que ha servite le requesta.",
        "apihelp-main-param-curtimestamp": "Includer le data e hora actual in le resultato.",
index 5c4c55e..e16bf09 100644 (file)
@@ -7,7 +7,9 @@
                        "Gianfranco",
                        "Alexmar983",
                        "Ricordisamoa",
-                       "Valepert"
+                       "Valepert",
+                       "Sannita",
+                       "Macofe"
                ]
        },
        "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)]].",
@@ -25,7 +27,7 @@
        "apihelp-block-param-reblock": "Se l'utente è già bloccato, sovrascrivere il blocco esistente.",
        "apihelp-block-param-watchuser": "Segui la pagina utente e le pagine di discussione utente dell'utente o dell'indirizzo IP.",
        "apihelp-block-example-ip-simple": "Blocca l'indirizzo IP <kbd>192.0.2.5</kbd> per tre giorni con motivazione <kbd>Primo avvertimento</kbd>.",
-       "apihelp-block-example-user-complex": "Blocca l'utente <kbd>Vandalo</kbd> a tempo indeterminato con motivazione <kbd>Vandalismo</kbd>, e impediscigli la creazione di nuovi account e l'invio di e-mail.",
+       "apihelp-block-example-user-complex": "Blocca l'utente <kbd>Vandal</kbd> a tempo indeterminato con motivazione <kbd>Vandalism</kbd>, e impediscigli la creazione di nuovi account e l'invio di e-mail.",
        "apihelp-checktoken-description": "Verifica la validità di un token da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo di token in corso di test.",
        "apihelp-checktoken-param-token": "Token da testare.",
@@ -58,8 +60,8 @@
        "apihelp-delete-param-reason": "Motivo della cancellazione. Se non indicato, verrà usata una motivazione generata automaticamente.",
        "apihelp-delete-param-watch": "Aggiungi la pagina agli Osservati Speciali dell'utente corrente.",
        "apihelp-delete-param-unwatch": "Rimuovi la pagina dagli Osservati Speciali dell'utente corrente.",
-       "apihelp-delete-example-simple": "Cancella la <kbd>Pagina Principale</kbd>.",
-       "apihelp-delete-example-reason": "Cancella la <kbd>Pagina Principale</kbd> con motivazione <kbd>Preparazione allo spostamento</kbd>.",
+       "apihelp-delete-example-simple": "Cancella <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Cancella la <kbd>Main Page</kbd> con motivazione <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Questo modulo è stato disabilitato.",
        "apihelp-edit-description": "Crea e modifica pagine.",
        "apihelp-edit-param-title": "Titolo della pagina da modificare. Non può essere usato insieme con <var>$1pageid</var>.",
        "apihelp-edit-param-unwatch": "Rimuovi la pagina dagli Osservati Speciali dell'utente corrente.",
        "apihelp-edit-example-edit": "Modifica una pagina.",
        "apihelp-emailuser-description": "Manda un'e-mail ad un utente.",
+       "apihelp-emailuser-param-target": "Utente a cui inviare l'e-mail.",
+       "apihelp-emailuser-param-subject": "Oggetto dell'e-mail.",
+       "apihelp-emailuser-param-text": "Testo dell'e-mail.",
        "apihelp-emailuser-param-ccme": "Mandami una copia di questa mail.",
+       "apihelp-emailuser-example-email": "Manda una e-mail all'utente <kbd>WikiSysop</kbd> con il testo <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Espandi tutti i template nel wikitesto.",
        "apihelp-expandtemplates-param-title": "Titolo della pagina.",
        "apihelp-expandtemplates-param-text": "Wikitesto da convertire.",
        "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-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-login-param-name": "Nome utente.",
        "apihelp-login-param-password": "Password.",
        "apihelp-move-description": "Sposta una pagina.",
        "api-help-parameters": "{{PLURAL:$1|Parametro|Parametri}}:",
        "api-help-param-deprecated": "Deprecato.",
        "api-help-param-required": "Questo parametro è obbligatorio.",
+       "api-help-param-list": "{{PLURAL:$1|1=Uno dei seguenti valori|2=Valori (separati da <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-multi-max": "Il numero massimo di valori è {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} per i bot).",
        "api-help-param-default": "Predefinito: $1",
        "api-help-param-default-empty": "Predefinito: <span class=\"apihelp-empty\">(vuoto)</span>",
index bb403c6..ee74804 100644 (file)
@@ -7,7 +7,8 @@
                        "Whym",
                        "Mfuji",
                        "Otokoume",
-                       "Sujiniku"
+                       "Sujiniku",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "実行する操作です。",
@@ -54,7 +55,7 @@
        "apihelp-createaccount-param-mailpassword": "設定されると (その値を問わず)、ランダムなパスワードがその利用者に電子メールで送られます。",
        "apihelp-createaccount-param-reason": "ログに記録されるアカウント作成の理由 (任意)。",
        "apihelp-createaccount-example-pass": "利用者 <kbd>testuser</kbd> をパスワード <kbd>test123</kbd> として作成する。",
-       "apihelp-createaccount-example-mail": "利用者 <kbd>testuser</kbd>を作成し、ランダムに生成されたパスワードをメールで送る",
+       "apihelp-createaccount-example-mail": "利用者 <kbd>testmailuser</kbd>を作成し、ランダムに生成されたパスワードをメールで送る",
        "apihelp-delete-description": "ページを削除します。",
        "apihelp-delete-param-title": "削除するページ名です。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-delete-param-pageid": "削除するページIDです。<var>$1title</var> とは同時に使用できません。",
        "apihelp-query+allcategories-param-from": "列挙を開始するカテゴリ。",
        "apihelp-query+allcategories-param-to": "列挙を終了するカテゴリ。",
        "apihelp-query+allcategories-param-prefix": "この値で始まるタイトルのカテゴリを検索します。",
+       "apihelp-query+allcategories-param-dir": "並べ替えの方向。",
        "apihelp-query+allcategories-param-limit": "返すカテゴリの数。",
+       "apihelp-query+allcategories-param-prop": "取得するプロパティ:",
        "apihelp-query+allcategories-example-generator": "<kbd>List</kbd> で始まるカテゴリページに関する情報を取得する。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var> と同時に使用できません。",
        "apihelp-query+alldeletedrevisions-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+allfileusages-param-from": "列挙を開始するファイルのタイトル。",
        "apihelp-query+allfileusages-param-to": "列挙を終了するファイルのタイトル。",
        "apihelp-query+allfileusages-param-prefix": "この値で始まるすべてのファイルのタイトルを検索する。",
+       "apihelp-query+allimages-param-sort": "並べ替えに使用するプロパティ。",
        "apihelp-query+allimages-param-from": "列挙の始点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-to": "列挙の終点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-start": "列挙の始点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
        "apihelp-query+alllinks-param-to": "列挙を終了するリンクのページ名。",
        "apihelp-query+alllinks-param-prefix": "この値で始まるすべてのリンクされたページを検索する。",
        "apihelp-query+alllinks-example-B": "<kbd>B</kbd> で始まるリンクされたページ (存在しないページも含む)を、リンク元のページIDとともに表示する。",
+       "apihelp-query+allmessages-param-prop": "取得するプロパティ:",
        "apihelp-query+allmessages-param-args": "メッセージ中に展開される引数。",
        "apihelp-query+allmessages-param-filter": "この文字列を含んだ名前のメッセージのみを返す。",
        "apihelp-query+allmessages-param-customised": "変更された状態のメッセージのみを返す。",
        "apihelp-query+allpages-param-to": "列挙を終了するページ名。",
        "apihelp-query+allpages-param-prefix": "この値で始まるすべてのページ名を検索します。",
        "apihelp-query+allpages-param-prtype": "保護されているページに絞り込む。",
+       "apihelp-query+allpages-param-prlevel": "保護レベルで絞り込む ($1type= パラメーターと同時に使用しなければなりません)。",
        "apihelp-query+allpages-param-limit": "返すページの総数。",
        "apihelp-query+allpages-example-B": "<kbd>B</kbd> で始まるページの一覧を表示する。",
        "apihelp-query+allpages-example-generator": "<kbd>T</kbd> で始まる4つのページに関する情報を表示する。",
        "apihelp-query+allredirects-param-from": "列挙を開始するリダイレクトのページ名。",
        "apihelp-query+allredirects-param-to": "列挙を終了するリダイレクトのページ名。",
        "apihelp-query+alltransclusions-param-prefix": "この値で始まるすべてのトランスクルードされているページを検索する。",
+       "apihelp-query+alltransclusions-example-generator": "参照読み込みを含んでいるページを取得する。",
        "apihelp-query+allusers-description": "すべての登録利用者を一覧表示します。",
        "apihelp-query+allusers-param-from": "列挙を開始する利用者名。",
        "apihelp-query+allusers-param-to": "列挙を終了する利用者名。",
        "apihelp-query+allusers-param-prefix": "この値で始まるすべての利用者を検索する。",
+       "apihelp-query+allusers-param-dir": "並べ替えの方向。",
        "apihelp-query+allusers-param-group": "このグループに所属する利用者のみを結果に含める。",
        "apihelp-query+allusers-param-excludegroup": "このグループに所属する利用者を結果から除外する。",
        "apihelp-query+allusers-param-limit": "返す利用者名の総数。",
        "apihelp-query+backlinks-description": "与えられたページにリンクしているすべてのページを検索します。",
        "apihelp-query+backlinks-param-title": "検索するページ名。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-query+backlinks-param-pageid": "検索するページID。<var>$1title</var>とは同時に使用できません。",
-       "apihelp-query+backlinks-example-simple": "<kbd>Main page<kbd> へのリンクを表示する。",
-       "apihelp-query+backlinks-example-generator": "<kbd>Main page<kbd> にリンクしているページの情報を取得する。",
+       "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-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+blocks-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+blocks-param-ids": "一覧表示するブロックIDのリスト (任意)。",
        "apihelp-query+blocks-param-users": "検索対象の利用者のリスト (任意)。",
        "apihelp-query+blocks-param-limit": "一覧表示するブロックの最大数。",
+       "apihelp-query+blocks-param-prop": "取得するプロパティ:",
        "apihelp-query+blocks-example-simple": "ブロックを一覧表示する。",
        "apihelp-query+blocks-example-users": "利用者<kbd>Alice</kbd> および <kbd>Bob</kbd> のブロックを一覧表示する。",
        "apihelp-query+categories-param-limit": "返すカテゴリの数。",
        "apihelp-query+categorymembers-param-title": "一覧表示するカテゴリ (必須)。<kbd>{{ns:category}}:</kbd> 接頭辞を含まなければなりません。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-query+categorymembers-param-pageid": "一覧表示するカテゴリのページID. <var>$1title</var> とは同時に使用できません。",
        "apihelp-query+categorymembers-param-limit": "返すページの最大数。",
+       "apihelp-query+categorymembers-param-sort": "並べ替えに使用するプロパティ。",
        "apihelp-query+categorymembers-param-start": "列挙の始点となるタイムスタンプ。<kbd>$1sort=timestamp</kbd>を指定した場合のみ使用できます。",
        "apihelp-query+categorymembers-param-end": "列挙の終点となるタイムスタンプ。<kbd>$1sort=timestamp</kbd>を指定した場合のみ使用できます。",
        "apihelp-query+categorymembers-param-startsortkeyprefix": "列挙の始点となるソートキーの接頭辞。<kbd>$1sort=sortkey</kbd>を指定した場合のみ使用できます。<var>$1starthexsortkey</var>をオーバーライドします。",
        "apihelp-query+disabled-description": "このクエリ モジュールは無効化されています。",
        "apihelp-query+embeddedin-param-title": "検索するページ名。$1pageid とは同時に使用できません。",
        "apihelp-query+embeddedin-param-pageid": "検索するページID. $1titleとは同時に使用できません。",
+       "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-limit": "返すリンクの数。",
        "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+extlinks-example-simple": "<kbd>Main Page</kbd> の外部リンクの一覧を取得する。",
        "apihelp-query+exturlusage-description": "与えられたURLを含むページを一覧表示します。",
        "apihelp-query+exturlusage-example-simple": "<kbd>http://www.mediawiki.org</kbd> にリンクしているページを一覧表示する。",
        "apihelp-query+filearchive-example-simple": "削除されたファイルの一覧を表示する。",
+       "apihelp-query+fileusage-param-prop": "取得するプロパティ:",
        "apihelp-query+fileusage-example-simple": "[[:File:Example.jpg]] を使用しているページの一覧を取得する。",
        "apihelp-query+fileusage-example-generator": "[[:File:Example.jpg]] を使用しているページの情報を取得する。",
+       "apihelp-query+imageinfo-param-prop": "取得するファイル情報:",
        "apihelp-query+imageinfo-param-start": "一覧表示の始点となるタイムスタンプ。",
        "apihelp-query+imageinfo-param-end": "一覧表示の終点となるタイムスタンプ。",
        "apihelp-query+images-description": "与えられたページに含まれるすべてのファイルを返します。",
        "apihelp-query+imageusage-example-simple": "[[:File:Albert Einstein Head.jpg]] を使用しているページを表示する。",
        "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]] を使用しているページに関する情報を取得する。",
        "apihelp-query+info-description": "ページの基本的な情報を取得します。",
+       "apihelp-query+info-param-prop": "追加で取得するプロパティ:",
        "apihelp-query+info-paramvalue-prop-protection": "それぞれのページの保護レベルを一覧表示する。",
        "apihelp-query+info-example-simple": "<kbd>Main Page</kbd> に関する情報を取得する。",
+       "apihelp-query+iwbacklinks-param-prop": "取得するプロパティ:",
        "apihelp-query+iwbacklinks-example-simple": "[[wikibooks:Test]] へリンクしているページを取得する。",
        "apihelp-query+iwbacklinks-example-generator": "[[wikibooks:Test]] へリンクしているページの情報を取得する。",
        "apihelp-query+iwlinks-param-limit": "返すウィキ間リンクの数。",
        "apihelp-query+langbacklinks-param-lang": "言語間リンクの言語。",
        "apihelp-query+langbacklinks-param-title": "検索する言語間リンク。$1lang と同時に使用しなければなりません。",
        "apihelp-query+langbacklinks-param-limit": "返すページの総数。",
+       "apihelp-query+langbacklinks-param-prop": "取得するプロパティ:",
        "apihelp-query+langbacklinks-example-simple": "[[:fr:Test]] へリンクしているページを取得する。",
        "apihelp-query+langbacklinks-example-generator": "[[:fr:Test]] へリンクしているページの情報を取得する。",
        "apihelp-query+langlinks-param-limit": "返す言語間リンクの数。",
        "apihelp-query+links-example-simple": "<kbd>Main Page</kbd> からのリンクを取得する。",
        "apihelp-query+links-example-generator": "<kbd>Main Page</kbd> からリンクされているページに関する情報を取得する。",
        "apihelp-query+links-example-namespaces": "<kbd>Main Page</kbd> からの {{ns:user}} および {{ns:template}} 名前空間へのリンクを取得する。",
+       "apihelp-query+linkshere-param-prop": "取得するプロパティ:",
        "apihelp-query+linkshere-example-simple": "[[Main Page]] にリンクしているページの一覧を取得する。",
        "apihelp-query+linkshere-example-generator": "<kbd>[[Main Page]]<kbd> にリンクしているページの情報を取得する。",
+       "apihelp-query+logevents-param-prop": "取得するプロパティ:",
        "apihelp-query+logevents-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+logevents-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+logevents-param-user": "与えられた利用者による記録項目に絞り込む。",
        "apihelp-query+pagepropnames-description": "Wiki内で使用されているすべてのページプロパティ名を一覧表示します。",
        "apihelp-query+pagepropnames-param-limit": "返す名前の最大数。",
        "apihelp-query+pagepropnames-example-simple": "最初の10個のプロパティ名を取得する。",
+       "apihelp-query+pageprops-description": "ページコンテンツで定義されている様々なページのプロパティを取得。",
        "apihelp-query+pageprops-example-simple": "ページ <kbd>Main Page</kbd> および <kbd>MeiaWiki</kbd> のプロパティを取得する。",
        "apihelp-query+pageswithprop-description": "与えられたページプロパティが使用されているすべてのページを一覧表示します。",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "ページプロパティの値を追加。",
        "apihelp-query+pageswithprop-param-limit": "返すページの最大数。",
        "apihelp-query+pageswithprop-example-simple": "<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code> を使用している最初の10ページを一覧表示する。",
        "apihelp-query+pageswithprop-example-generator": "<code>_&#95;NOTOC_&#95;</code> を使用している最初の10ページについての追加情報を取得する。",
        "apihelp-query+protectedtitles-param-limit": "返すページの総数。",
        "apihelp-query+protectedtitles-param-start": "一覧表示の始点となる保護タイムスタンプ。",
        "apihelp-query+protectedtitles-param-end": "一覧表示の終点となる保護タイムスタンプ。",
+       "apihelp-query+protectedtitles-param-prop": "取得するプロパティ:",
        "apihelp-query+protectedtitles-example-simple": "保護されているページを一覧表示する。",
        "apihelp-query+protectedtitles-example-generator": "標準名前空間にある保護されたページへのリンクを検索する。",
        "apihelp-query+querypage-param-page": "特別ページの名前です。これは大文字小文字を区別することに注意。",
        "apihelp-query+querypage-param-limit": "返す結果の数。",
        "apihelp-query+querypage-example-ancientpages": "[[Special:Ancientpages]] の結果を返す。",
        "apihelp-query+random-param-namespace": "この名前空間にあるページのみを返します。",
+       "apihelp-query+random-param-redirect": "代わりに <kbd>$1filterredir=redirects</kbd> を使用してください。",
+       "apihelp-query+random-param-filterredir": "転送ページを絞り込む方法。",
        "apihelp-query+random-example-simple": "標準名前空間から2つのページを無作為に返す。",
        "apihelp-query+random-example-generator": "標準名前空間から無作為に選ばれた2つのページのページ情報を返す。",
        "apihelp-query+recentchanges-description": "最近の更新を一覧表示します。",
        "apihelp-query+recentchanges-param-toponly": "最新の版である変更のみを一覧表示する。",
        "apihelp-query+recentchanges-example-simple": "最近の更新を一覧表示する。",
        "apihelp-query+redirects-description": "ページへのすべての転送を返します。",
+       "apihelp-query+redirects-param-prop": "取得するプロパティ:",
        "apihelp-query+redirects-param-limit": "返す転送の数。",
        "apihelp-query+redirects-example-simple": "[[Main Page]] への転送の一覧を取得する。",
        "apihelp-query+redirects-example-generator": "[[Main Page]] へのすべての転送ページに関する情報を取得する。",
        "apihelp-query+search-param-search": "この値を含むページ名または本文を検索します。Wikiの検索バックエンド実装に応じて、あなたは特別な検索機能を呼び出すための文字列を検索することができます。",
        "apihelp-query+search-param-namespace": "この名前空間内のみを検索します。",
        "apihelp-query+search-param-what": "実行する検索の種類です。",
+       "apihelp-query+search-param-prop": "返すプロパティ:",
        "apihelp-query+search-param-limit": "返すページの総数です。",
        "apihelp-query+search-example-simple": "<kbd>meaning</kbd> を検索する。",
        "apihelp-query+search-example-generator": "<kbd>meaning</kbd> の検索で返されたページのページ情報を取得する。",
        "apihelp-query+tags-description": "変更タグを一覧表示します。",
        "apihelp-query+tags-param-limit": "一覧表示するタグの最大数。",
+       "apihelp-query+tags-param-prop": "取得するプロパティ:",
        "apihelp-query+tags-example-simple": "利用可能なタグを一覧表示する。",
        "apihelp-query+templates-description": "与えられたページでトランスクルードされているすべてのページを返します。",
        "apihelp-query+templates-param-namespace": "この名前空間のテンプレートのみ表示する。",
        "apihelp-query+tokens-example-simple": "csrfトークンを取得する (既定)。",
        "apihelp-query+tokens-example-types": "ウォッチトークンおよび巡回トークンを取得する。",
        "apihelp-query+transcludedin-description": "与えられたページをトランスクルードしているすべてのページを検索します。",
+       "apihelp-query+transcludedin-param-prop": "取得するプロパティ:",
        "apihelp-query+transcludedin-example-simple": "<kbd>Main Page</kbd> をトランスクルードしているページの一覧を取得する。",
        "apihelp-query+transcludedin-example-generator": "<kbd>Main Page</kbd> をトランスクルードしているページに関する情報を取得する。",
        "apihelp-query+usercontribs-description": "利用者によるすべての編集を取得します。",
        "apihelp-query+watchlist-param-namespace": "この名前空間の変更のみに絞り込む。",
        "apihelp-query+watchlist-param-user": "この利用者による変更のみを一覧表示する。",
        "apihelp-query+watchlist-param-excludeuser": "この利用者による変更を一覧表示しない。",
+       "apihelp-query+watchlist-param-prop": "追加で取得するプロパティ:",
        "apihelp-query+watchlistraw-description": "現在の利用者のウォッチリストにあるすべてのページを取得します。",
        "apihelp-query+watchlistraw-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-query+watchlistraw-param-prop": "追加で取得するプロパティ:",
        "apihelp-revisiondelete-description": "版の削除および復元を行います。",
        "apihelp-revisiondelete-param-reason": "削除または復元の理由。",
        "apihelp-revisiondelete-example-revision": "<kbd>Main Page</kbd> の版 <kbd>12345</kbd> の本文を隠す。",
        "api-help-parameters": "{{PLURAL:$1|パラメーター}}:",
        "api-help-param-deprecated": "廃止予定です。",
        "api-help-param-required": "このパラメーターは必須です。",
+       "api-help-datatypes-header": "データ型",
        "api-help-param-list": "{{PLURAL:$1|1=値 (次の値のいずれか1つ)|2=値 (<kbd>{{!}}</kbd>で区切る)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=空欄にしてください|空欄にするか、または $2}}",
        "api-help-param-integer-min": "{{PLURAL:$1|値}}は $2 以上にしてください。",
index ab018c9..de64544 100644 (file)
@@ -8,7 +8,8 @@
                        "Ysjbserver",
                        "Alex00728",
                        "Hwangjy9",
-                       "Kurousagi"
+                       "Kurousagi",
+                       "Revi"
                ]
        },
        "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:오류 및 경고]]를 참조하십시오.",
@@ -16,7 +17,7 @@
        "apihelp-main-param-format": "출력값의 형식.",
        "apihelp-block-description": "사용자를 차단합니다.",
        "apihelp-block-param-user": "차단하고자 하는 계정 이름, IP 주소 또는 대역",
-       "apihelp-block-param-expiry": "기한. 상대값(예시: \"5 months\" 또는 \"2 weeks\") 또는 절대값(예시: \"2014-09-18T12:34:56Z\")이 될 수 있습니다. \"infinite\", \"indefinite\" 또는 \"never\"로 설정하면 무기한으로 설정됩니다.",
+       "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-reason": "차단 이유.",
        "apihelp-block-param-anononly": "익명 사용자만 차단합니다. (즉, 이 IP의 익명 편집을 막음)",
        "apihelp-block-param-nocreate": "계정 생성을 막습니다.",
@@ -28,6 +29,7 @@
        "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-token": "테스트할 토큰",
        "apihelp-createaccount-description": "새 사용자 계정을 만듭니다.",
        "apihelp-createaccount-param-name": "사용자 이름",
        "apihelp-createaccount-param-email": "사용자 이메일 주소 (선택).",
@@ -49,6 +51,8 @@
        "apihelp-emailuser-param-target": "이메일을 받을 사용자.",
        "apihelp-expandtemplates-param-title": "문서 제목",
        "apihelp-expandtemplates-param-text": "변환할 위키텍스트.",
+       "apihelp-feedcontributions-param-deletedonly": "삭제된 기여만 봅니다.",
+       "apihelp-feedcontributions-param-toponly": "최신 판인 편집만 봅니다.",
        "apihelp-feedrecentchanges-param-hideminor": "사소한 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hidebots": "봇의 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hideanons": "익명 사용자의 편집을 숨깁니다.",
@@ -75,6 +79,7 @@
        "apihelp-options-param-reset": "사이트 기본으로 설정 초기화",
        "apihelp-options-example-reset": "모든 설정 초기화",
        "apihelp-protect-example-protect": "문서 보호",
+       "apihelp-query+allmessages-example-ipb": "<kbd>ipb-</kbd>로 시작하는 메시지를 보입니다.",
        "apihelp-query+pageswithprop-param-limit": "나타낼 문서의 최대 수입니다.",
        "apihelp-query+pageswithprop-param-dir": "정렬 순서",
        "apihelp-query+prefixsearch-param-search": "문자열 검색",
index 46ef968..d5b33ca 100644 (file)
        "apihelp-emailuser-param-subject": "Koppeih mem Beträff.",
        "apihelp-emailuser-param-text": "Dä Täx en dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">e-mail</i>.",
        "apihelp-emailuser-param-ccme": "scheck mer en Koppih vun heh dä <i lang=\"en\" xml:lang=\"en\">e-mail</i>.",
-       "apihelp-emailuser-example-email": "Donn en <i lang=\"en\" xml:lang=\"en\">e-mail</i> aan dä Metmaacher <kbd lang=\"en\" xml:lang=\"en\">WikiSysop</kbd> schecke mem Täx <kbd>Dä Enhalld</kbd> dren.",
+       "apihelp-emailuser-example-email": "Donn en <i lang=\"en\" xml:lang=\"en\">e-mail</i> aan dä Metmaacher „<kbd lang=\"en\" xml:lang=\"en\">WikiSysop</kbd>“ schecke mem Täx „<kbd lang=\"en\" xml:lang=\"en\">Content</kbd>“ dren.",
        "apihelp-expandtemplates-description": "Deiht alle Schablohne en Wikkitäx ömsäze.",
        "apihelp-expandtemplates-param-title": "De Övverschreff vun dä Sigg.",
        "apihelp-expandtemplates-param-text": "Dä Wikkitäx zom ömwandelle.",
        "apihelp-move-param-unwatch": "Donn de Sigg un de Ömleijdong uß dem aktoälle Metmaacher sing Oppaßleß eruß nämme.",
        "apihelp-move-param-watchlist": "Donn di Sigg en dem aktoälle Metmaacher sing Oppaßleß udder nemm se eruß, donn de Enschtällonge nämme udder donn de Oppaßleß nid ändere.",
        "apihelp-move-param-ignorewarnings": "Donn alle Warnonge övverjonn",
-       "apihelp-move-example-move": "Donn <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Schlääschte Övverschreff</kbd> nach <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Johde Övverschreff</kbd> önmännde, der ohne en Ömleijdong aanzelähje.",
+       "apihelp-move-example-move": "Donn di Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Badtitle</kbd>“ noh „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Goodtitle</kbd>“ önnänne, der ohne en Ömleijdong aanzelähje.",
        "apihelp-opensearch-description": "Em Wikki söhke mem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Offe Söhke“\">OpenSearch</i>",
        "apihelp-opensearch-param-search": "Noh wat söhke?",
        "apihelp-opensearch-param-limit": "De hühßte Aanzahl vun Äjeebnesse för zeröck ze jävve",
        "apihelp-parse-paramvalue-prop-iwlinks": "Jitt de Engewikkilengks em jepahßde Wikkitäx uß.",
        "apihelp-parse-paramvalue-prop-wikitext": "Jitt de der ojinahl Wikkitäx us, dä jepahß woode es.",
        "apihelp-parse-paramvalue-prop-properties": "Jitt devärse Eijeschafte uß, di em jepahßde Wikkitäx faßjelaat woode sen.",
-       "apihelp-parse-param-section": "Holl blohß dann der Ennhalld vun däm Affschnett met dä Nommer, udder wann „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ enjejovve es, maach ene neu Affschnett derbei.",
+       "apihelp-parse-param-section": "Donn blohß der Ennhalld vun däm Affschnett met dä Nommer paase.\n\nWann „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ enjejovve es, donn dä Täx <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1text</var> un de Övverschreff <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sectiontitle</var> paase, wi wänn_enne neuje Affschnett en dä Sigg derbei köhm.\n\nDä Parramehter „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ es blohß zohjelohße, wann och <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">text</var> aanjejovve es.",
        "apihelp-parse-param-sectiontitle": "De Övverschreff för dä neuje Afschnet, wann <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">section</var> = <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd> es.\n\nAnders wi beim Beärbeide vun dä Sigg weed dä Parramehter nit dorsch de <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">summary</var> ußjetuusch, wann hä fottjelohße udder läddesch es.",
        "apihelp-parse-param-disablelimitreport": "Jiff keine Bereesch vum Vüürbereijde zom Paase (der „<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">NewPP limit report</i>“) mem Paaser singe Dahte zosamme uß.",
        "apihelp-parse-param-disableeditsection": "Donn de Lenks för Affschnedde ze änndere en de Ußjahbe vum Paaser eruß lohße.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Donn kein Väsjohne vun heh däm Metmaacher opleßte.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Wann als ene  Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.",
-       "apihelp-query+alldeletedrevisions-example-user": "Donn de läzde fuffzisch fottjeschmeße Beijdrähsch vim Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example<kbd>“ opleste.",
+       "apihelp-query+alldeletedrevisions-example-user": "Donn de läzde fuffzisch fottjeschmeße Beijdrähsch vum Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ opleste.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Donn de läzde fuffzisch fottjeschmeße Väsjohne em Houp-Appachemang opleste.",
        "apihelp-query+allfileusages-description": "Donn alle Dattei_Oprohfe opleste, och vun Datteije, di (noch) nit doh sin.",
        "apihelp-query+allfileusages-param-from": "De Övverschreff vun dä Dattei, woh de Leß medd aanfange sull.",
        "apihelp-query+backlinks-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+backlinks-param-limit": "Wi vill Sigge ensjesamp ußjävve. Wann „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1redirect</var>“ ennjeschalld es, weed di Beschrängkong op jehden Nivoh äxtra aanjwandt, wat bedügg, dat bes op 2 * „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> ußjejovve wähde künne.",
        "apihelp-query+backlinks-param-redirect": "Wann de Sigg met dämm Lengk dren en Ömleijdong änthält, fengk derzoh och alle Sigge, di doh drop lengke. De Bovverjränz för de Aanzahl Sigge för opzeleßte weed hallbehrt.",
-       "apihelp-query+backlinks-example-simple": "Zeijsch Lengks op de Sigg <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main page<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op de Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</code>“ lengke donn.",
+       "apihelp-query+backlinks-example-simple": "Zeijsch Lengks op de Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main page</kbd>“.",
+       "apihelp-query+backlinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op de Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ lengke donn.",
        "apihelp-query+blocks-description": "Donn alle jeschpächte Metmaacher un <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße opleßte.",
        "apihelp-query+blocks-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
        "apihelp-query+blocks-param-end": "Et Dattom un de Zigg bes woh hen opjezallt wähde sull.",
        "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-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-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.",
index b625565..3cab41c 100644 (file)
@@ -1,14 +1,16 @@
 {
        "@metadata": {
                "authors": [
-                       "George Animal"
+                       "George Animal",
+                       "Macofe",
+                       "Ghybu"
                ]
        },
        "apihelp-block-description": "Bikarhênerekî asteng bike.",
        "apihelp-block-param-reason": "Sedemê bo astengkirinê.",
        "apihelp-createaccount-param-name": "Navê bikarhêner.",
        "apihelp-delete-description": "Rûpelekê jê bibe.",
-       "apihelp-delete-example-simple": "<kbd>Destpêk</kbd>ê Jê bibe.",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd>ê jê bibe.",
        "apihelp-edit-param-sectiontitle": "Sernavê bo beşeke nû.",
        "apihelp-edit-param-text": "Naveroka rûpelê.",
        "apihelp-edit-param-minor": "Guhertina biçûk.",
index 3761975..34b8461 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Janatkg"
+                       "Janatkg",
+                       "Macofe"
                ]
        },
        "apihelp-block-description": "Колдонуучуну бөгөттөө",
@@ -12,7 +13,7 @@
        "apihelp-createaccount-param-email": "Колдонуучунун email дареги (милдеттүү эмес)",
        "apihelp-createaccount-param-realname": "Колдонуучунун чыныгы аты (милдеттүү эмес)",
        "apihelp-delete-description": "Баракты өчүрүү",
-       "apihelp-delete-example-simple": "<kbd>Башбарагын</kbd> өчүрүү.",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd> өчүрүү.",
        "apihelp-edit-description": "Барактарды түзүү жана оңдоо.",
        "apihelp-edit-param-text": "Барактын мазмуну.",
        "apihelp-edit-param-minor": "Майда оңдоо."
index c0fe740..170fe53 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Robby"
+                       "Robby",
+                       "Macofe"
                ]
        },
        "apihelp-block-description": "E Benotzer spären.",
@@ -19,7 +20,7 @@
        "apihelp-createaccount-param-realname": "Richtegen Numm vum Benotzer (fakultativ).",
        "apihelp-delete-description": "Eng Säit läschen.",
        "apihelp-delete-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.",
-       "apihelp-delete-example-simple": "D'<kbd>Haaptsäit</kbd> läschen.",
+       "apihelp-delete-example-simple": "D'<kbd>Main Page</kbd> läschen.",
        "apihelp-disabled-description": "Dëse Modul gouf ausgeschalt.",
        "apihelp-edit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
        "apihelp-edit-param-text": "Säiteninhalt.",
@@ -27,7 +28,7 @@
        "apihelp-edit-param-bot": "Dës Ännerung als Bot-Ännerung markéieren.",
        "apihelp-edit-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.",
        "apihelp-edit-example-edit": "Eng Säit änneren",
-       "apihelp-emailuser-example-email": "Dem Benotzer <kbd>WikiSysop</kbd> eng E-Mail mam Text <kbd>Inhalt</kbd> schécken.",
+       "apihelp-emailuser-example-email": "Dem Benotzer <kbd>WikiSysop</kbd> eng E-Mail mam Text <kbd>Content</kbd> schécken.",
        "apihelp-expandtemplates-param-title": "Titel vun der Säit.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "D'Maximalzäit no där den Tëschespäicher vum Resultat net méi valabel si soll.",
        "apihelp-feedcontributions-param-year": "Vum Joer (a virdrun).",
@@ -67,6 +68,7 @@
        "apihelp-query+allusers-description": "All registréiert Benotzer opzielen.",
        "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Lëscht vun alle Gruppen an deenen de Benotzer automatesch dran ass.",
        "apihelp-query+allusers-param-activeusers": "Nëmme Benotzer opzielen déi an de leschten $1 {{PLURAL:$1|Dag|Deeg}} aktiv waren.",
+       "apihelp-query+backlinks-example-simple": "Linken op d'<kbd>Main page</kbd> weisen.",
        "apihelp-query+blocks-description": "Lëscht vun de gespaarte Benotzer an IP-Adressen.",
        "apihelp-query+blocks-paramvalue-prop-range": "Setzt de Beräich vun den IP-Adressen derbäi déi vun der Spär betraff sinn.",
        "apihelp-query+blocks-example-simple": "Lëscht vun de Spären",
        "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.",
        "apihelp-revisiondelete-param-reason": "Grond fir ze Läschen oder ze Restauréieren.",
        "apihelp-rsd-example-simple": "Den RSD-Schema exportéieren",
+       "apihelp-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.",
+       "apihelp-stashedit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
+       "apihelp-stashedit-param-text": "Inhalt vun der Säit",
        "apihelp-tag-param-reason": "Grond fir d'Ännerung.",
        "apihelp-unblock-description": "D'Spär vun engem Benotzer ophiewen.",
        "apihelp-unblock-param-reason": "Grond fir d'Spär opzehiewen",
        "apihelp-userrights-param-user": "Benotzernumm.",
        "apihelp-userrights-param-userid": "Benotzer Id.",
        "apihelp-userrights-param-reason": "Grond fir d'Ännerung.",
-       "apihelp-watch-example-watch": "D'Säit <kbd>Haaptsäit</kbd> iwwerwaachen.",
+       "apihelp-watch-example-watch": "D'Säit <kbd>Main Page</kbd> iwwerwaachen.",
        "api-help-source": "Quell: $1",
        "api-help-source-unknown": "Quell: <span class=\"apihelp-unknown\">onbekannt</span>",
        "api-help-license": "Lizenz: [[$1|$2]]",
diff --git a/includes/api/i18n/lt.json b/includes/api/i18n/lt.json
new file mode 100644 (file)
index 0000000..101d918
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Zygimantus"
+               ]
+       },
+       "apihelp-query+alldeletedrevisions-example-user": "Sąrašas paskutinių 50 ištrintų indėlių pagal vartotoją\n<kbd>Pavyzdys</kbd>.",
+       "apihelp-query+backlinks-example-simple": "Rodyti nuorodas <kbd>Pagrindinis puslapis</kbd>.",
+       "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.",
+       "apihelp-stashedit-param-sectiontitle": "Naujo skyriaus pavadinimas.",
+       "apihelp-stashedit-param-text": "Puslapio turinys."
+}
index 80b41ed..97de05f 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Bjankuloski06"
+                       "Bjankuloski06",
+                       "Macofe"
                ]
        },
        "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<strong>Статус:</strong> Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\n<strong>Погрешни барања:</strong> Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на  [[mw:API:Errors_and_warnings|Извршник: Грешки и предупредувања]].",
@@ -65,8 +66,8 @@
        "apihelp-delete-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните на тековниот корисник, користете ги нагодувањата или не ги менувајте набљудуваните.",
        "apihelp-delete-param-unwatch": "Отстрани ја страницата од набљудуваните на тековниот корисник.",
        "apihelp-delete-param-oldimage": "Името на страта слика за бришење според добиеното од [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Избриши ја <kbd>Главна страница</kbd>.",
-       "apihelp-delete-example-reason": "Избриши ја <kbd>Главна страница</kbd> со причината <kbd>Подготовка за преместување</kbd>.",
+       "apihelp-delete-example-simple": "Избриши ја <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Избриши ја <kbd>Main Page</kbd> со причината <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Модулот е деактивиран.",
        "apihelp-edit-description": "Создај или уреди страници.",
        "apihelp-edit-param-title": "Наслов на страницата што сакате да ја уредите. Не може да се користи заедно со <var>$1pageid</var>.",
        "apihelp-emailuser-param-subject": "Наслов.",
        "apihelp-emailuser-param-text": "Содржина.",
        "apihelp-emailuser-param-ccme": "Прати ми примерок и мене.",
-       "apihelp-emailuser-example-email": "Испрати е-пошта на корисникот <kbd>WikiSysop</kbd> со текстот <kbd>Содржина</kbd>.",
+       "apihelp-emailuser-example-email": "Испрати е-пошта на корисникот <kbd>WikiSysop</kbd> со текстот <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Ги проширува сите шаблони во викитекст.",
        "apihelp-expandtemplates-param-title": "Наслов на страница.",
        "apihelp-expandtemplates-param-text": "Викитекст за претворање.",
        "apihelp-filerevert-param-filename": "Име на целната податотека, без претставката „Податотека:“.",
        "apihelp-filerevert-param-comment": "Коментар за подигањето.",
        "apihelp-filerevert-param-archivename": "Архивски назив на преработката што ја повраќате.",
-       "apihelp-filerevert-example-revert": "Врати ја <kbd>Wiki.png</kbd> на верзијата од <kbd>2011-03-05T15:27:40Z</kbd>",
+       "apihelp-filerevert-example-revert": "Врати ја <kbd>Wiki.png</kbd> на верзијата од <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Прикажувај помош за укажаните модули.",
        "apihelp-help-param-modules": "Модули за приказ на помош за (вредности на параметрите <var>action</var> и <var>format</var>, или пак <kbd>main</kbd>). Може да се укажат подмодули со <kbd>+</kbd>.",
        "apihelp-help-param-submodules": "Прикажувај и помош за подмодули на именуваниот модул.",
        "apihelp-move-param-unwatch": "Отстрани ги страницата и пренасочувањето од набљудуваните на тековниот корисник.",
        "apihelp-move-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните на тековниот корисник, користете ги нагодувањата или не ги менувајте набљудуваните.",
        "apihelp-move-param-ignorewarnings": "Занемари предупредувања.",
-       "apihelp-move-example-move": "Премести го <kbd>Лош наслов</kbd> на <kbd>Добар наслов</kbd>, неоставајќи пренасочување",
+       "apihelp-move-example-move": "Премести го <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd>, неоставајќи пренасочување",
        "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
        "apihelp-opensearch-param-search": "Низа за пребарување.",
        "apihelp-opensearch-param-limit": "Максималниот број на резултати за прикажување.",
        "apihelp-protect-param-reason": "Причиина за (од)заштитување",
        "apihelp-protect-example-protect": "Заштити страница",
        "apihelp-purge-param-forcelinkupdate": "Поднови ги табелите со врски.",
-       "apihelp-purge-example-simple": "Превчитај ги <kbd>Главна страница</kbd> и <kbd>Извршник</kbd>.",
+       "apihelp-purge-example-simple": "Превчитај ги <kbd>Main Page</kbd> и <kbd>API</kbd>.",
        "apihelp-query-param-list": "Кои списоци да се набават.",
        "apihelp-query-param-meta": "Кои метаподатоци да се набават.",
        "apihelp-query+allcategories-description": "Наброј ги сите категории.",
        "apihelp-query+allcategories-param-dir": "Насока на подредувањето.",
        "apihelp-query+alldeletedrevisions-param-from": "Почни го исписот од овој наслов.",
        "apihelp-query+alldeletedrevisions-param-to": "Запри го исписот на овој наслов.",
-       "apihelp-query+alldeletedrevisions-example-user": "Список на последните 50 избришани придонеси на корисникот <kbd>Пример<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Список на последните 50 избришани придонеси на корисникот <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Список на последните 50 избришани преработки во главниот именски простор.",
-       "apihelp-query+allimages-example-B": "Прикажи список на податотеки што почнуваат со буквата <kbd>Б</kbd>.",
+       "apihelp-query+allimages-example-B": "Прикажи список на податотеки што почнуваат со буквата <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Прикажи список на неодамна подигнати податотеки сличен на [[Special:NewFiles]]",
-       "apihelp-query+allimages-example-generator": "Прикажи информации за околу 4 податотеки што почнуваат со буквата <kbd>Т</kbd>.",
+       "apihelp-query+allimages-example-generator": "Прикажи информации за околу 4 податотеки што почнуваат со буквата <kbd>T</kbd>.",
        "apihelp-query+alllinks-description": "Наброј ги сите врски што водат кон даден именски простор.",
        "apihelp-query+alllinks-param-from": "Наслов на врската од која ќе почне набројувањето.",
        "apihelp-query+alllinks-param-to": "Наслов на врската на која ќе запре набројувањето.",
        "apihelp-query+allpages-param-minsize": "Ограничи на страници со барем олку бајти.",
        "apihelp-query+allpages-param-maxsize": "Ограничи на страници со највеќе олку бајти.",
        "apihelp-query+allpages-param-prtype": "Ограничи на само заштитени страници.",
-       "apihelp-query+backlinks-example-simple": "Прикажи врски до <kbd>Главна страница<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Дава информации за страниците што водат до <kbd>Главна страница<kbd>.",
+       "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-start": "Од кој датум и време да почне набројувањето.",
        "apihelp-query+blocks-param-end": "На кој датум и време да запре набројувањето.",
        "apihelp-upload-param-async": "Направи ги работите со потенцијално големи податотеки неусогласени, кога е можно.",
        "apihelp-upload-param-asyncdownload": "Направи го добивањето на URL-адреса неусогласено.",
        "apihelp-upload-param-leavemessage": "Ако се користи неусогласено преземање, остави порака на страницата за разговор на корисникот ако е готово.",
-       "apihelp-upload-param-statuskey": "Дај ја состојбата на подигнатост за овој податотечен клуч (подигање по URL-адреса).",
+       "apihelp-upload-param-statuskey": "Дај ја состојбата на подигнатост за овој податотечен клуч (подигање по URL).",
        "apihelp-upload-param-checkstatus": "Дај ја состојбата на подигнатост само за дадениот податотечен клуч.",
-       "apihelp-upload-example-url": "Подигни од URL-адреса",
+       "apihelp-upload-example-url": "Подигни од URL",
        "apihelp-userrights-param-user": "Корисничко име.",
        "apihelp-userrights-param-userid": "Корисничка назнака.",
        "apihelp-userrights-param-add": "Стави го корисникот во следниве групи.",
index 041cf2c..fba1168 100644 (file)
@@ -1,13 +1,14 @@
 {
        "@metadata": {
                "authors": [
-                       "Anakmalaysia"
+                       "Anakmalaysia",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Tindakan mana untuk dilakukan.",
        "apihelp-main-param-format": "Format output.",
        "apihelp-main-param-uselang": "Bahasa yang hendak digunakan untuk penterjemahan mesej. Senarai kod boleh diperoleh dari [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo&siprop=languages]], ataupun menyatakan \"user\" untuk menggunakan bahasa kegemaran pengguna semasa.",
-       "apihelp-expandtemplates-example-simple": "Perluaskan \"<nowiki>{{Project:Sandbox}}</nowiki>\" wikiteks",
+       "apihelp-expandtemplates-example-simple": "Perluaskan <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> wikiteks.",
        "apihelp-help-param-helpformat": "Format output bantuan.",
        "apihelp-help-example-main": "Bantuan untuk modul utama",
        "apihelp-help-example-recursive": "Segala bantuan dalam satu halaman",
        "apihelp-query+usercontribs-param-show": "Hanya paparkan item-item yang mematuhi kriteria ini, cth. suntingan selain yang kecil sahaja: $2show=!minor.\n\nJika ditetapkannya $2show=patrolled atau $2show=!patrolled, maka semakan-semakan yang lebih lama daripada [https://www.mediawiki.org/wiki/Manual:$wgRCMaxAge $wgRCMaxAge] ($1 saat) tidak akan dipaparkan.",
        "apihelp-userrights-param-userid": "ID pengguna.",
        "apihelp-dbgfm-description": "Data output dalam format var_export() PHP (''pretty-print'' dalam HTML).",
-       "apihelp-dump-description": "Output data dalam format var_dump() PHP.",
-       "apihelp-dumpfm-description": "Data output dalam format var_dump() PHP (''pretty-print'' dalam HTML).",
        "apihelp-json-description": "Data output dalam format JSON.",
        "apihelp-json-param-utf8": "Jika dinyatakan, mengekodkan kenanyakan (tetapi bukan semua) aksara bukan ASCII sebagai UTF-8 daripada menggantikannya dengan jujukan lepasan perenambelasan.",
        "apihelp-jsonfm-description": "Output data dalam format JSON (''pretty-print'' dalam HTML).",
        "apihelp-php-description": "Data output dalam format PHP bersiri.",
        "apihelp-txt-description": "Data output dalam format print_r() PHP.",
        "apihelp-txtfm-description": "Data output dalam format print_r() PHP (''pretty-print'' dalam HTML).",
-       "apihelp-wddx-description": "Data output dalam format WDDX.",
-       "apihelp-wddxfm-description": "Output data dalam format WDDX (''pretty-print'' dalam HTML).",
        "apihelp-xml-description": "Data output dalam format XML.",
        "apihelp-xmlfm-description": "Data output dalam format XML (''pretty-print'' dalam HTML).",
        "apihelp-yaml-description": "Data output dalam format YAML.",
index ed665f2..47488c0 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Jeblad",
-                       "Chameleon222"
+                       "Chameleon222",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Hvilken handling skal utføres",
@@ -44,8 +45,8 @@
        "apihelp-delete-param-reason": "Årsak for slettingen. Dersom ikke satt vil en automatisk generert årsak bli brukt.",
        "apihelp-delete-param-watch": "Legg til siden til aktuell brukers overvåkningsliste.",
        "apihelp-delete-param-unwatch": "Fjern siden fra aktuell brukers overvåkningsliste.",
-       "apihelp-delete-example-simple": "Slett <kbd>Hovedside</kbd>.",
-       "apihelp-delete-example-reason": "Slett <kbd>Hovedside</kbd> med grunnen <kbd>Forbereder flytting</kbd>.",
+       "apihelp-delete-example-simple": "Slett <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Slett <kbd>Main Page</kbd> med grunnen <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Denne modulen har blitt deaktivert",
        "apihelp-edit-description": "Opprett og rediger sider.",
        "apihelp-edit-param-title": "Tittelen til siden som skal redigeres. Kan ikke brukes sammen med <var>$1pageid</var>.",
        "apihelp-move-description": "Flytt en side.",
        "apihelp-dbg-description": "Resultatdata i PHP's var_export() format.",
        "apihelp-dbgfm-description": "Resultatdata i PHP's var_export() format (pen utskrift i HTML).",
-       "apihelp-dump-description": "Resultatdata i PHP's var_export() format.",
-       "apihelp-dumpfm-description": "Resultatdata i PHP's var_export() format (pen utskrift i HTML).",
        "apihelp-json-description": "Resultatdata i JSON-format.",
        "apihelp-none-description": "Ingen resultat.",
        "api-help-flag-readrights": "Denne modulen krever lesetilgang.",
index c961872..8e9120b 100644 (file)
@@ -29,8 +29,8 @@
        "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
        "apihelp-createaccount-param-name": "Gebruikersnaam.",
        "apihelp-delete-description": "Verwijder een pagina.",
-       "apihelp-delete-example-simple": "Verwijder <kbd>Hoofdpagina</kbd>.",
-       "apihelp-delete-example-reason": "Verwijder <kbd>Hoofdpagina</kbd> met als reden <kbd>Voorbereiding voor verplaatsing</kbd>.",
+       "apihelp-delete-example-simple": "Verwijder <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Verwijder <kbd>Main Page</kbd> met als reden <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Deze module is uitgeschakeld.",
        "apihelp-edit-param-text": "Pagina-inhoud.",
        "apihelp-edit-param-minor": "Kleine bewerking.",
index 11c0a32..14b0c06 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Cedric31"
+                       "Cedric31",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Quina accion cal efectuar.",
@@ -21,7 +22,7 @@
        "apihelp-createaccount-param-password": "Senhal (ignorat se <var>$1mailpassword</var> es definit).",
        "apihelp-createaccount-param-realname": "Nom vertadièr de l’utilizaire (facultatiu).",
        "apihelp-delete-description": "Suprimir una pagina.",
-       "apihelp-delete-example-simple": "Suprimir la <kbd>Pagina principala</kbd>.",
+       "apihelp-delete-example-simple": "Suprimir la <kbd>Main Page</kbd>.",
        "apihelp-disabled-description": "Aqueste modul es estat desactivat.",
        "apihelp-edit-description": "Crear e modificar las paginas.",
        "apihelp-edit-param-text": "Contengut de la pagina.",
index c82d88f..c02fe05 100644 (file)
@@ -1,10 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "Leeheonjin"
+                       "Leeheonjin",
+                       "Macofe"
                ]
        },
-       "apihelp-delete-example-simple": "Buran ya ing <kbd>Pun Bulung</kbd>.",
+       "apihelp-delete-example-simple": "Buran ya ing <kbd>Main Page</kbd>.",
        "apihelp-edit-example-edit": "Alilan ya ing bulung.",
        "apihelp-feedrecentchanges-example-simple": "Pakit deng bayung mengayalili.",
        "apihelp-help-example-main": "Saup para king pun modyul.",
@@ -18,7 +19,7 @@
        "apihelp-query+deletedrevs-example-mode2": "Ilista la reng 50 binurang kontribusyun nang <kbd>Bob</kbd> (mode 2).",
        "apihelp-query+deletedrevs-example-mode3-talk": "Ilista mu la reng minunang 50 meburang bulung king {{ns:talk}} lagyu-espasyu (mode 3)",
        "apihelp-query+duplicatefiles-example-generated": "Mayintun para kareng duplika da reng egana-ganang simpan (file).",
-       "apihelp-query+extlinks-example-simple": "Kumuwa ning lista da reng suglung paluwal king <kbd>Pun Bulung</kbd>.",
+       "apihelp-query+extlinks-example-simple": "Kumuwa ning lista da reng suglung paluwal king <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-example-simple": "Pakit la reng bulung a makasuglung king <kbd>http://www.mediawiki.org</kbd>.",
        "apihelp-query+imageusage-example-simple": "Ipakit la reng bulung a gagamit ning [[:Simpan:Albert Einstein Head.jpg]].",
        "apihelp-query+langbacklinks-example-simple": "Kunan deng bulung a maka-suglung king [[:fr:Test]].",
index 791074e..07875f4 100644 (file)
@@ -52,8 +52,8 @@
        "apihelp-delete-param-reason": "Powód usuwania. Jeśli pozostaiwsz to pole puste, zostanie on wygenerowany automatycznie.",
        "apihelp-delete-param-watch": "Dodaj stronę do obecnej listy obserwowanych.",
        "apihelp-delete-param-unwatch": "Usuń stronę z obecnej listy obserwowanych.",
-       "apihelp-delete-example-simple": "Usuń <kbd>Stronę Główną</kbd>.",
-       "apihelp-delete-example-reason": "Usuń <kbd>Stronę Główną</kbd> z powodem <kbd>Przygotowania do przenoszenia</kbd>.",
+       "apihelp-delete-example-simple": "Usuń <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Usuń <kbd>Main Page</kbd> z powodem <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Ten moduł został wyłączony.",
        "apihelp-edit-description": "Utwórz i edytuj strony.;",
        "apihelp-edit-param-section": "Numer sekcji. <kbd>0</kbd> dla górnej sekcji, <kbd>new</kbd> dla nowej sekcji.",
@@ -74,7 +74,7 @@
        "apihelp-emailuser-param-subject": "Nagłówek tematu.",
        "apihelp-emailuser-param-text": "Treść emaila.",
        "apihelp-emailuser-param-ccme": "Wyślij kopię wiadomości do mnie.",
-       "apihelp-emailuser-example-email": "Wyślij e-mail do użytkownika <kbd>WikiSysop</kbd> z tekstem <kbd>treścią</kbd>.",
+       "apihelp-emailuser-example-email": "Wyślij e-mail do użytkownika <kbd>WikiSysop</kbd> z tekstem <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Rozwiń wszystkie szablony w wikitexcie.",
        "apihelp-expandtemplates-param-title": "Tytuł strony.",
        "apihelp-expandtemplates-param-text": "Wikitext do przekonwertowania.",
        "apihelp-protect-param-reason": "Powód zabezpieczania/odbezpieczania.",
        "apihelp-protect-param-cascade": "Włącz ochronę kaskadową (chronione są wszystkie osadzone szablony i obrazki na tej stronie). Ignorowane, jeśli żaden z danych poziomów ochrony nie wspiera kaskadowania.",
        "apihelp-protect-example-protect": "Zabezpiecz stronę",
-       "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>wszystkie</kbd>.",
+       "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Odbezpiecz stronę ustawiając brak ograniczeń.",
        "apihelp-purge-param-forcelinkupdate": "Uaktualnij tabele linków.",
        "apihelp-purge-example-generator": "Przeczyść pierwsze 10 stron w przestrzeni głównej.",
        "apihelp-query+alldeletedrevisions-param-user": "Pokazuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Nie pokazuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Listuj tylko strony z tej przestrzeni nazw.",
-       "apihelp-query+allfileusages-param-limit": "Łączna ilość obiektów do zwrócenia.",
+       "apihelp-query+allfileusages-param-limit": "Łączna liczba obiektów do zwrócenia.",
        "apihelp-query+allfileusages-example-unique": "Lista unikatowych tytułów plików.",
        "apihelp-query+allimages-param-sort": "Sortowanie według właściwości.",
        "apihelp-query+allimages-example-recent": "Pokaż listę ostatnio przesłanych plików, podobnie do [[Special:NewFiles]].",
        "apihelp-query+allimages-example-mimetypes": "Pokaż listę plików z typem MIME <kbd>image/png</kbd> lub <kbd>image/gif</kbd>",
        "apihelp-query+alllinks-param-namespace": "Przestrzeń nazw do emulacji.",
-       "apihelp-query+alllinks-param-limit": "Łączna ilość obiektów do zwrócenia.",
+       "apihelp-query+alllinks-param-limit": "Łączna liczba obiektów do zwrócenia.",
        "apihelp-query+alllinks-example-unique": "Lista unikatowych tytułów plików.",
        "apihelp-query+allmessages-param-prop": "Właściwości do odczytu.",
        "apihelp-query+allmessages-param-prefix": "Zwróć wiadomości z tym prefixem.",
        "apihelp-query+allpages-param-prtype": "Ogranicz tylko do zabezpieczonych stron.",
-       "apihelp-query+allpages-param-limit": "Ilość stron do zwrócenia.",
+       "apihelp-query+allpages-param-limit": "Liczba stron do zwrócenia.",
        "apihelp-query+allpages-example-B": "Pokaż listę stron rozpoczynających się na literę <kbd>B</kbd>.",
        "apihelp-query+allredirects-description": "Lista wszystkich przekierowań do przestrzeni nazw.",
        "apihelp-query+allredirects-param-namespace": "Przestrzeń nazw do emulacji.",
-       "apihelp-query+allredirects-param-limit": "Łączna ilość obiektów do zwrócenia.",
+       "apihelp-query+allredirects-param-limit": "Łączna liczba obiektów do zwrócenia.",
        "apihelp-query+alltransclusions-param-namespace": "Przestrzeń nazw do emulacji.",
        "apihelp-query+allusers-param-witheditsonly": "Tylko użytkownicy, którzy edytowali.",
        "apihelp-query+backlinks-param-namespace": "Przestrzeń nazw do emulacji.",
+       "apihelp-query+backlinks-example-simple": "Pokazuj linki do <kbd>Main page</kbd>.",
        "apihelp-query+blocks-param-ids": "Lista zablokowanych ID do wylistowania (opcjonalne).",
        "apihelp-query+blocks-param-users": "Lista użytkowników do wyszukania (opcjonalne).",
        "apihelp-query+blocks-param-limit": "Maksymalna liczba blokad do wylistowania.",
        "apihelp-query+blocks-example-simple": "Listuj blokady.",
-       "apihelp-query+categories-param-limit": "Ilość kategorii do zwrócenia.",
+       "apihelp-query+categories-param-limit": "Liczba kategorii do zwrócenia.",
        "apihelp-query+categorymembers-description": "Wszystkie strony w danej kategorii.",
        "apihelp-query+categorymembers-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-query+categorymembers-param-sort": "Sortowanie według właściwości.",
        "apihelp-query+deletedrevs-param-user": "Listuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+deletedrevs-param-excludeuser": "Nie listuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+deletedrevs-param-namespace": "Listuj tylko strony z tej przestrzeni nazw.",
-       "apihelp-query+deletedrevs-param-limit": "Maksymalna ilość zmian do wylistowania.",
+       "apihelp-query+deletedrevs-param-limit": "Maksymalna liczba zmian do wylistowania.",
        "apihelp-query+duplicatefiles-example-generated": "Szukaj duplikatów wszystkich plików.",
        "apihelp-query+embeddedin-param-filterredir": "Jaki filtrować przekierowania.",
-       "apihelp-query+extlinks-param-limit": "Ilość linków do zwrócenia.",
-       "apihelp-query+exturlusage-param-limit": "Ilość stron do zwrócenia.",
+       "apihelp-query+extlinks-param-limit": "Liczba linków do zwrócenia.",
+       "apihelp-query+exturlusage-param-limit": "Liczba stron do zwrócenia.",
        "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias rozmiaru.",
        "apihelp-query+filearchive-example-simple": "Pokaż listę wszystkich usuniętych plików.",
        "apihelp-query+filerepoinfo-example-simple": "Uzyskaj informacje na temat repozytoriów plików.",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "Dodaj sumę kontrolną SHA-1 dla tego pliku.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "Dodaje typ MIME pliku.",
        "apihelp-query+imageinfo-param-urlheight": "Podobne do $1urlwidth.",
-       "apihelp-query+images-param-limit": "Ilość plików do zwrócenia.",
+       "apihelp-query+images-param-limit": "Liczba plików do zwrócenia.",
        "apihelp-query+info-description": "Pokaż podstawowe informacje o stronie.",
        "apihelp-query+info-paramvalue-prop-watchers": "Liczba obserwujących, jeśli jest to dozwolone.",
        "apihelp-query+info-paramvalue-prop-readable": "Czy użytkownik może przeczytać tę stronę.",
        "apihelp-query+iwbacklinks-param-prefix": "Prefix interwiki.",
-       "apihelp-query+iwbacklinks-param-limit": "Łączna ilość stron do zwrócenia.",
+       "apihelp-query+iwbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
-       "apihelp-query+links-param-limit": "Ilość linków do zwrócenia.",
+       "apihelp-query+links-param-limit": "Liczba linków do zwrócenia.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Nazwa każdej strony.",
-       "apihelp-query+linkshere-param-limit": "Ilość do zwrócenia.",
+       "apihelp-query+linkshere-param-limit": "Liczba do zwrócenia.",
        "apihelp-query+logevents-description": "Pobierz eventy z logu.",
        "apihelp-query+logevents-example-simple": "Lista ostatnich zarejestrowanych zdarzeń.",
        "apihelp-query+pageswithprop-example-generator": "Pobierz dodatkowe informacje o pierwszych 10 stronach wykorzystując <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Dodaje komentarz do edycji.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Dodaje znacznik czasu edycji.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Dodaje starą i nową długość strony.",
+       "apihelp-stashedit-param-title": "Tytuł edytowanej strony.",
+       "apihelp-stashedit-param-sectiontitle": "Tytuł nowej sekcji.",
+       "apihelp-stashedit-param-text": "Zawartość strony.",
        "apihelp-tag-param-reason": "Powód zmiany.",
        "apihelp-unblock-param-reason": "Powód odblokowania.",
        "apihelp-undelete-param-reason": "Powód przywracania.",
index 9d24281..dd7a21c 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Ahmed-Najib-Biabani-Ibrahimkhel"
+                       "Ahmed-Najib-Biabani-Ibrahimkhel",
+                       "Macofe"
                ]
        },
        "apihelp-block-description": "په يو کارن بنديز لگول.",
index 9c1c623..96741ca 100644 (file)
@@ -3,7 +3,9 @@
                "authors": [
                        "Fasouzafreitas",
                        "Dianakc",
-                       "Cainamarques"
+                       "Cainamarques",
+                       "Rhcastilhos",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
@@ -21,7 +23,7 @@
        "apihelp-block-param-hidename": "Oculta o nome do usuário do ''log'' de bloqueio. (Requer o direito <code>hideuser</code>).",
        "apihelp-block-param-reblock": "Se o usuário já estiver bloqueado, sobrescrever o bloqueio existente.",
        "apihelp-block-example-ip-simple": "Bloquear endereço IP <kbd>192.0.2.5</kbd> por três dias com razão <kbd>Primeira medida</kbd>.",
-       "apihelp-block-example-user-complex": "Bloquear usuário <kbd>Vândalo</kbd> indefinidamente com razão <kbd>Vandalismo</kbd> e o impede de criar nova conta e envio de emails.",
+       "apihelp-block-example-user-complex": "Bloquear usuário <kbd>Vandal</kbd> indefinidamente com razão <kbd>Vandalism</kbd> e o impede de criar nova conta e envio de emails.",
        "apihelp-compare-param-fromtitle": "Primeiro título para comparar.",
        "apihelp-compare-param-fromid": "Primeiro ID de página para comparar.",
        "apihelp-compare-param-fromrev": "Primeira revisão para comparar.",
@@ -40,7 +42,7 @@
        "apihelp-delete-param-pageid": "ID da página para excluir. Não pode ser usada juntamente com <var>$1title</var>.",
        "apihelp-delete-param-watch": "Adiciona a página para a lista de vigiados do usuário atual.",
        "apihelp-delete-param-unwatch": "Remove a página para a lista de vigiados do usuário atual.",
-       "apihelp-delete-example-simple": "Excluir <kbd>Página principal</kbd>.",
+       "apihelp-delete-example-simple": "Excluir <kbd>Main Page</kbd>.",
        "apihelp-disabled-description": "Este módulo foi desativado.",
        "apihelp-edit-description": "Criar e editar páginas.",
        "apihelp-edit-param-title": "Título da página para editar. Não pode ser usado em conjunto com <var>$1pageid</var>.",
@@ -48,6 +50,7 @@
        "apihelp-edit-param-sectiontitle": "O título para uma nova seção.",
        "apihelp-edit-param-text": "Conteúdo da página",
        "apihelp-edit-param-minor": "Edição menor.",
+       "apihelp-edit-param-notminor": "Edição não-menor.",
        "apihelp-edit-param-bot": "Marcar esta edição como feita por bot.",
        "apihelp-edit-param-createonly": "Não editar a página se já existir.",
        "apihelp-edit-param-nocreate": "Mostra um erro se a página não existir.",
        "apihelp-emailuser-param-subject": "Cabeçalho do assunto.",
        "apihelp-emailuser-param-text": "Corpo do email.",
        "apihelp-emailuser-param-ccme": "Envie uma cópia deste email para mim.",
+       "apihelp-emailuser-example-email": "Enviar um e-mail ao usuário <kbd>WikiSysop</kbd> com o texto <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Expande todas a predefinições em wikitexto.",
        "apihelp-expandtemplates-param-title": "Título da página.",
        "apihelp-expandtemplates-param-text": "Wikitexto para converter.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "O wikitexto expandido.",
        "apihelp-feedcontributions-description": "Retorna o feed de contribuições de um usuário.",
        "apihelp-feedcontributions-param-feedformat": "O formato do feed.",
        "apihelp-feedcontributions-param-namespace": "A partir de qual espaço nominal filtrar contribuições.",
        "apihelp-move-param-noredirect": "Não cria um redirecionamento.",
        "apihelp-move-param-watch": "Adiciona a página e o redirecionamento para a lista de vigiados do usuário atual.",
        "apihelp-move-param-unwatch": "Remove a página e o redirecionamento para a lista de vigiados do usuário atual.",
+       "apihelp-move-param-ignorewarnings": "Ignorar quaisquer avisos.",
+       "apihelp-opensearch-param-search": "Pesquisar string.",
        "apihelp-opensearch-param-limit": "O número máximo a se retornar.",
        "apihelp-opensearch-param-namespace": "Espaço nominal para pesquisar.",
+       "apihelp-opensearch-param-format": "O formato da saída.",
        "apihelp-opensearch-example-te": "Encontra páginas começando com <kbd>Te</kbd>.",
        "apihelp-options-param-reset": "Redefinir preferências para os padrões do site.",
        "apihelp-options-example-reset": "Resetar todas as preferências",
        "apihelp-protect-param-pageid": "ID da página a se (des)proteger. Não pode ser usado em conjunto com $1title.",
        "apihelp-protect-param-reason": "Motivo para (des)proteger.",
        "apihelp-protect-example-protect": "Protege uma página.",
-       "apihelp-protect-example-unprotect": "Desprotege uma página definindo restrições para <kbd>tudo</kbd>.",
+       "apihelp-protect-example-unprotect": "Desprotege uma página definindo restrições para <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Desprotege uma página ao não definir restrições.",
        "apihelp-purge-param-forcelinkupdate": "Atualiza as tabelas de links.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Atualiza a tabela de links, e atualiza as tabelas de links para qualquer página que usa essa página como um modelo.",
+       "apihelp-query-param-prop": "Quais propriedades obter para as páginas consultadas.",
        "apihelp-query-param-list": "Quais listas obter.",
        "apihelp-query-param-meta": "Quais metadados obter.",
        "apihelp-query+allcategories-description": "Enumera todas as categorias.",
        "apihelp-query+allcategories-param-min": "Retorna apenas as categorias com pelo menos esta quantidade de membros.",
        "apihelp-query+allcategories-param-max": "Retorna apenas as categorias com no máximo esta quantidade de membros.",
        "apihelp-query+allcategories-param-limit": "Quantas categorias retornar.",
+       "apihelp-query+allcategories-param-prop": "Que propriedades obter:",
        "apihelp-query+allcategories-example-size": "Lista categorias com a informação sobre o número de páginas em cada uma.",
        "apihelp-query+alldeletedrevisions-description": "Lista todas as revisões excluídas por um usuário ou em um espaço nominal.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Só pode ser usada com <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-param-user": "Lista apenas revisões desse usuário.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Não lista as revisões deste usuário.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Lista páginas apenas neste espaço nominal.",
-       "apihelp-query+alldeletedrevisions-example-user": "Lista as últimas 50 contribuições excluídas pelo usuário <kbd>Exemplo<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Lista as últimas 50 contribuições excluídas pelo usuário <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lista as primeiras 50 edições excluídas no espaço nominal principal.",
        "apihelp-query+allfileusages-description": "Lista todas as utilizações de arquivo, incluindo os não-existentes.",
        "apihelp-query+allfileusages-param-from": "O título do arquivo a partir do qual começar a enumerar.",
        "apihelp-query+allfileusages-param-to": "O título do arquivo onde parar de enumerar.",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Adiciona o título do arquivo.",
        "apihelp-query+allfileusages-param-limit": "Quantos itens retornar.",
        "apihelp-query+allimages-param-user": "Retorna apenas os arquivos enviados por este usuário. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1filterbots.",
        "apihelp-query+allimages-param-filterbots": "Como filtrar arquivos enviados por bots. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1user.",
index b919c44..92e096d 100644 (file)
@@ -21,7 +21,7 @@
        "apihelp-delete-description": "Eliminar uma página.",
        "apihelp-delete-param-watch": "Adicionar a página à lista de vigiadas do utilizador atual.",
        "apihelp-delete-param-unwatch": "Remover a página da lista de vigiadas do utilizador atual.",
-       "apihelp-delete-example-simple": "Eliminar <kbd>Página Principal</kbd>.",
+       "apihelp-delete-example-simple": "Eliminar <kbd>Main Page</kbd>.",
        "apihelp-disabled-description": "O módulo foi desativado.",
        "apihelp-edit-description": "Criar e editar páginas.",
        "apihelp-edit-param-sectiontitle": "Título para uma nova seção.",
        "apihelp-opensearch-param-limit": "Número máximo de resultados a apresentar.",
        "apihelp-options-param-reset": "Reiniciar preferências para os padrões do sítio.",
        "apihelp-options-example-reset": "Reiniciar todas as preferências",
+       "apihelp-parse-param-section": "Apenas analisar o conteúdo desta secção.\n\nQuando <kbd>nova</kbd>, analise <var>$1text</var> e <var>$1sectiontitle</var> como se fosse adicionar uma nova secção da página.\n\n<kbd>novo</kbd> só é permitido quando especifica <var>text</var>.",
        "apihelp-patrol-description": "Patrulhar uma página ou edição.",
        "apihelp-patrol-example-rcid": "Patrulhar uma mudança recente",
        "apihelp-patrol-example-revid": "Patrulhar uma edição",
        "apihelp-protect-example-protect": "Proteger uma página",
        "apihelp-query+allcategories-description": "Enumerar todas as categorias.",
+       "apihelp-query+alldeletedrevisions-example-user": "Lista das últimas 50 contribuições eliminadas pelo usuário <kbd>Example</kbd>.",
        "apihelp-query+allpages-param-prefix": "Pesquisa para todos os títulos de páginas que comecem com este valor.",
        "apihelp-query+allpages-example-generator": "Mostrar informação sobre 4 páginas que comecem com a letra <kbd>T</kbd>.",
        "apihelp-query+allusers-example-Y": "Lista de utilizadores que comecem com <kbd>Y</kbd>.",
+       "apihelp-query+backlinks-example-simple": "Mostrar ligações para <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Obtenha informações sobre as páginas de ligação para <kbd>Main page</kbd>.",
        "apihelp-query+blocks-param-limit": "O número máximo de bloqueios a listar.",
        "apihelp-query+categorymembers-description": "Lista de todas as páginas numa categoria fornecida.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
        "apihelp-query+deletedrevs-param-excludeuser": "Não listar edições deste utilizador.",
        "apihelp-query+deletedrevs-param-namespace": "Listar apenas as páginas neste domínio.",
+       "apihelp-query+extlinks-example-simple": "Obtenha uma lista de links externos na <kbd>Main Page</kbd>.",
        "apihelp-query+filearchive-example-simple": "Mostrar lista de todos os ficheiros eliminados",
        "apihelp-query+info-description": "Obter informação básica da página.",
        "apihelp-query+recentchanges-example-simple": "Lista de mudanças recentes",
index da0319f..b55faf4 100644 (file)
        "apihelp-setnotificationtimestamp-example-page": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-allpages": "{{doc-apihelp-example|setnotificationtimestamp}}",
-       "apihelp-stashedit-description": "{{apihelp-description|stashedit}}",
-       "apihelp-stashedit-param-title": "{{apihelp-param|stashedit|title}}",
-       "apihelp-stashedit-param-section": "{{apihelp-param|stashedit|section}}",
-       "apihelp-stashedit-param-sectiontitle": "{{apihelp-param|stashedit|sectiontitle}}",
-       "apihelp-stashedit-param-text": "{{apihelp-param|stashedit|text}}",
-       "apihelp-stashedit-param-contentmodel": "{{apihelp-param|stashedit|contentmodel}}",
-       "apihelp-stashedit-param-contentformat": "{{apihelp-param|stashedit|contentformat}}",
-       "apihelp-stashedit-param-baserevid": "{{apihelp-param|stashedit|baserevid}}",
+       "apihelp-stashedit-description": "{{doc-apihelp-description|stashedit}}",
+       "apihelp-stashedit-param-title": "{{doc-apihelp-param|stashedit|title}}",
+       "apihelp-stashedit-param-section": "{{doc-apihelp-param|stashedit|section}}",
+       "apihelp-stashedit-param-sectiontitle": "{{doc-apihelp-param|stashedit|sectiontitle}}",
+       "apihelp-stashedit-param-text": "{{doc-apihelp-param|stashedit|text}}",
+       "apihelp-stashedit-param-contentmodel": "{{doc-apihelp-param|stashedit|contentmodel}}",
+       "apihelp-stashedit-param-contentformat": "{{doc-apihelp-param|stashedit|contentformat}}",
+       "apihelp-stashedit-param-baserevid": "{{doc-apihelp-param|stashedit|baserevid}}",
        "apihelp-tag-description": "{{doc-apihelp-description|tag}}",
        "apihelp-tag-param-rcid": "{{doc-apihelp-param|tag|rcid}}",
        "apihelp-tag-param-revid": "{{doc-apihelp-param|tag|revid}}",
index 56b3f5b..dfc30a8 100644 (file)
@@ -9,7 +9,9 @@
                        "Дмитрий",
                        "WindEwriX",
                        "Ochilov",
-                       "Nzeemin"
+                       "Nzeemin",
+                       "INS Pirat",
+                       "Macofe"
                ]
        },
        "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 Новости 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: Ошибки и предупреждения]].",
@@ -27,6 +29,9 @@
        "apihelp-block-param-reason": "Причина блокировки.",
        "apihelp-block-param-anononly": "Блокировать только анонимных пользователей (т. е. запретить анонимные правки для этого IP-адреса).",
        "apihelp-block-param-nocreate": "Запретить создание учётных записей.",
+       "apihelp-block-param-autoblock": "Автоматически блокировать последний использованный IP-адрес и все последующие, с которых будут совершаться попытки авторизации.",
+       "apihelp-block-param-hidename": "Скрыть имя участника из журнала блокировок. (Требуется право <code>hideuser</code>).",
+       "apihelp-block-param-reblock": "Если участник уже заблокирован, перезаписать существующую блокировку.",
        "apihelp-block-param-watchuser": "Следить за страницей пользователя или IP-участника и страницей обсуждения.",
        "apihelp-checktoken-param-type": "Тип маркера проходит тестирование.",
        "apihelp-checktoken-param-token": "токен для проверки",
@@ -78,7 +83,7 @@
        "apihelp-emailuser-param-subject": "Заголовок темы.",
        "apihelp-emailuser-param-text": "Содержание письма",
        "apihelp-emailuser-param-ccme": "Отправить копию этого сообщения мне.",
-       "apihelp-emailuser-example-email": "Отправить письмо пользователю <kbd>WikiSysop</kbd> с текстом <kbd>контентом</kbd>.",
+       "apihelp-emailuser-example-email": "Отправить письмо пользователю <kbd>WikiSysop</kbd> с текстом <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Разворачивает все шаблоны в wikitext.",
        "apihelp-expandtemplates-param-title": "Заголовок страницы.",
        "apihelp-expandtemplates-param-text": "Викитекст для конвертирования",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево разбора XML входных данных.",
        "apihelp-feedcontributions-param-year": "От года (и ранее).",
        "apihelp-feedcontributions-param-month": "От месяца (и ранее).",
+       "apihelp-feedcontributions-param-deletedonly": "Показать только удалённые правки.",
+       "apihelp-feedcontributions-param-toponly": "Показать только правки, являющиеся последними версиями.",
        "apihelp-feedcontributions-param-newonly": "Показывать только правки, являющиеся созданием страниц.",
        "apihelp-feedcontributions-param-showsizediff": "Показать размер различия между версиями.",
+       "apihelp-feedcontributions-example-simple": "Показать вклад участника <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-param-invert": "Все пространства имён, кроме выбранного.",
        "apihelp-feedrecentchanges-param-limit": "Максимальное число возвращаемых результатов.",
        "apihelp-feedrecentchanges-param-from": "Показать изменения с тех пор.",
        "apihelp-feedrecentchanges-param-hideminor": "Скрыть малые правки.",
        "apihelp-feedrecentchanges-param-hidebots": "Скрыть правки ботов.",
        "apihelp-feedrecentchanges-param-hideanons": "Скрыть изменения, внесённые анонимными участниками.",
+       "apihelp-feedrecentchanges-param-hideliu": "Скрыть правки зарегистрированных участников.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Скрыть отпатруллированные правки.",
        "apihelp-feedrecentchanges-param-hidemyself": "Скрыть изменения, сделанные текущим участником.",
        "apihelp-feedrecentchanges-param-tagfilter": "Фильтр по тегам.",
+       "apihelp-feedrecentchanges-param-target": "Показать только правки на страницах, на которые ссылается данная.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Показать правки на страницах, ссылающихся на данную.",
        "apihelp-feedrecentchanges-example-simple": "Список последних изменений.",
        "apihelp-feedrecentchanges-example-30days": "Показать последние изменения в течение 30 дней.",
+       "apihelp-feedwatchlist-param-linktosections": "Ссылаться прямо на разделы с изменениями, если возможно.",
+       "apihelp-filerevert-param-filename": "Целевое имя файла без префикса File:.",
        "apihelp-filerevert-param-comment": "Загрузить комментарий.",
        "apihelp-help-example-main": "Помощь по главному модулю.",
        "apihelp-help-example-recursive": "Вся справка в одном разделе.",
        "apihelp-imagerotate-example-generator": "Повернуть все изображения в <kbd>Category:Flip</kbd> на <kbd>180</kbd> градусов.",
        "apihelp-import-param-summary": "Импорт итога",
        "apihelp-import-param-xml": "Загруженный XML-файл.",
+       "apihelp-import-example-import": "Импортировать [[meta:Help:ParserFunctions]] с полной историей в пространство имён 100.",
        "apihelp-login-param-name": "Имя участника.",
        "apihelp-login-param-password": "Пароль.",
        "apihelp-login-param-domain": "Домен (необязательно).",
        "apihelp-opensearch-param-search": "Строка поиска.",
        "apihelp-opensearch-param-limit": "Максимальное число возвращаемых результатов.",
        "apihelp-opensearch-param-namespace": "Пространства имён для поиска.",
+       "apihelp-opensearch-param-format": "Формат вывода.",
        "apihelp-options-example-reset": "Сбросить все настройки.",
+       "apihelp-paraminfo-description": "Получить информацию о модулях API.",
        "apihelp-paraminfo-param-helpformat": "Формат строк справки.",
+       "apihelp-parse-param-disabletoc": "Не включать в вывод таблицу содержания.",
        "apihelp-parse-example-page": "анализ страницы",
        "apihelp-parse-example-text": "Анализ wikitext.",
+       "apihelp-protect-description": "Изменить уровень защиты страницы.",
        "apihelp-protect-example-protect": "Защитить страницу.",
        "apihelp-purge-param-forcelinkupdate": "Обновление связей таблиц.",
        "apihelp-query-param-list": "Какие списки использовать",
        "apihelp-query+transcludedin-param-limit": "Сколько возвращать",
        "apihelp-query+usercontribs-description": "Получить все правки пользователя",
        "apihelp-revisiondelete-description": "удалить и восстановить редакции",
+       "apihelp-stashedit-param-sectiontitle": "Заголовок нового раздела.",
        "apihelp-unblock-description": "Разблокировать пользователя.",
        "apihelp-unblock-param-reason": "Причина разблокировки",
        "apihelp-unblock-example-id": "Разблокировать блок с идентификатором #<kbd>105</kbd>.",
        "api-help-license-unknown": "Лицензия: <span class=\"apihelp-unknown\">unknown</span>",
        "api-help-parameters": "Параметр{{PLURAL:$1||ы}}:",
        "api-help-param-deprecated": "Устаревший.",
-       "api-help-param-required": "Этот параметр является обязательным.",
+       "api-help-param-required": "Это обязательный параметр.",
        "api-help-datatypes-header": "Типы данных",
        "api-help-param-type-limit": "Тип: целое число или <kbd>max</kbd>",
        "api-help-param-type-integer": "Тип: {{PLURAL:$1|1=integer|2=list of integers}}",
index 34d55af..a02fd8a 100644 (file)
@@ -1,12 +1,15 @@
 {
        "@metadata": {
                "authors": [
-                       "Ammartivari"
+                       "Ammartivari",
+                       "Kosovastar"
                ]
        },
        "apihelp-block-param-reason": "Arsyeja për bllokim.",
        "apihelp-move-param-reason": "Arsyeja për riemërtim.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Kthehet në faqen e statistikave.",
        "apihelp-tag-param-reason": "Arsyeja për ndërrimin.",
        "apihelp-unblock-description": "Zhblloko një përdorues.",
-       "apihelp-userrights-description": "Ndërro anëtarësinë e grupit e një përdoruesit."
+       "apihelp-upload-param-file": "Përmbajtja e skedave.",
+       "apihelp-userrights-description": "Ndërro anëtarësinë e grupit të një përdoruesit."
 }
index 83f4d80..1366f5e 100644 (file)
@@ -13,7 +13,8 @@
                        "Marfuas",
                        "VickyC",
                        "Josve05a",
-                       "Rockyfelle"
+                       "Rockyfelle",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-postlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aviseringar]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R|Buggar & förslag]\n</div>\n<strong>Status:</strong> Alla funktioner som visas på denna sida borde fungera. API:et är dock fortfarande under aktiv utveckling och kan ändras när som helst. Prenumerera på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/mediawiki-api-announce e-postlistan] för att få aviseringar om uppdateringar.\n\n<strong>Felaktiga förfrågningar:</strong> När felaktiga förfrågningar skickas till API:et skickas en HTTP-header med nyckeln \"MediaWiki-API-Error\" och sedan sätts både värdet på headern och den felkoden som returneras till samma värde. För mer information läs [[mw:API:Errors_and_warnings|API: Fel och varningar]].",
@@ -75,8 +76,8 @@
        "apihelp-delete-param-watchlist": "Lägg till eller ta bort sidan ovillkorligen från den aktuella användarens bevakningslista, använd inställningar eller ändra inte bevakning.",
        "apihelp-delete-param-unwatch": "Ta bort sidan från aktuell användares bevakningslista.",
        "apihelp-delete-param-oldimage": "Namnet på den gamla bilden att radera som tillhandahålls av [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Radera <kbd>huvudsidan</kbd>.",
-       "apihelp-delete-example-reason": "Raderar <kbd>huvudsidan</kbd> med orsaken <kbd>Förbereder flyttning</kbd>.",
+       "apihelp-delete-example-simple": "Radera <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Raderar <kbd>Main Page</kbd> med orsaken <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Denna modul har inaktiverats.",
        "apihelp-edit-description": "Skapa och redigera sidor.",
        "apihelp-edit-param-title": "Titel på sidan du vill redigera. Kan inte användas tillsammans med <var>$1pageid</var>.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Den expanderade wikitexten.",
        "apihelp-expandtemplates-param-includecomments": "Om HTML-kommentarer skall inkluderas i utdata.",
        "apihelp-expandtemplates-param-generatexml": "Generera ett XML tolknings träd (ersatt av $1prop=parsetree).",
-       "apihelp-expandtemplates-example-simple": "Expandera wikitexten <kbd><nowiki>{{Projekt:Sandbox}}</nowiki></kbd>.",
+       "apihelp-expandtemplates-example-simple": "Expandera wikitexten <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
        "apihelp-feedcontributions-description": "Returnerar en användares bidragsflöde.",
        "apihelp-feedcontributions-param-feedformat": "Flödets format.",
        "apihelp-feedcontributions-param-user": "De användare vars bidrag ska hämtas.",
        "apihelp-filerevert-param-filename": "Målfilens namn, utan prefixet Fil:.",
        "apihelp-filerevert-param-comment": "Ladda upp kommentar.",
        "apihelp-filerevert-param-archivename": "Arkiv-namn för revisionen att gå tillbaka till.",
-       "apihelp-filerevert-example-revert": "Återställ <kbd>Wiki.png</kbd> till versionen från <kbd>2011-03-05T15:27:40Z</kbd>",
+       "apihelp-filerevert-example-revert": "Återställ <kbd>Wiki.png</kbd> till versionen från <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Visa hjälp för de angivna modulerna.",
        "apihelp-help-param-modules": "Vilka moduler som hjälpen ska visas för (värdena på parametrarna <var>action</var> och <var>format</var>, eller <kbd>main</kbd>). Undermoduler kan anges med ett plustecken (<kbd>+</kbd>).",
        "apihelp-help-param-submodules": "Inkludera hjälp för undermoduler av den namngivna modulen.",
        "apihelp-managetags-param-tag": "Tagg för att skapa, radera, aktivera eller inaktivera. Vid skapande av tagg kan taggen inte existera. Vid raderande av tagg måste taggen existera. För aktiverande av tagg måste taggen existera och inte användas i ett tillägg. För inaktivering av tagg måste taggen användas just nu och vara manuellt definierad.",
        "apihelp-managetags-param-reason": "En icke-obligatorisk orsak för att skapa, radera, aktivera, eller inaktivera taggen.",
        "apihelp-managetags-param-ignorewarnings": "Om du vill ignorera varningar som utfärdas under operationen.",
-       "apihelp-managetags-example-create": "Skapa en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>För användning i redigerings patrullering</kbd>",
+       "apihelp-managetags-example-create": "Skapa en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Radera <kbd>vandalims</kbd> taggen med andledningen: <kbd>Felstavat</kbd>",
-       "apihelp-managetags-example-activate": "Aktivera en tagg med namn <kbd>spam</kbd> med anledningen: <kbd>För användning i redigerings patrullering</kbd>",
-       "apihelp-managetags-example-deactivate": "Inaktivera en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>Inte längre behövd</kbd>",
+       "apihelp-managetags-example-activate": "Aktivera en tagg med namn <kbd>spam</kbd> med anledningen: <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Inaktivera en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>No longer required</kbd>",
        "apihelp-move-description": "Flytta en sida.",
        "apihelp-move-param-from": "Titeln på sidan du vill flytta. Kan inte användas tillsammans med <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "Sid-ID för sidan att byta namn. Kan inte användas tillsammans med <var>$1from</var>.",
        "apihelp-move-param-unwatch": "Ta bort sidan och omdirigeringen från den aktuella användarens bevakningslista.",
        "apihelp-move-param-watchlist": "Lägg till eller ta bort sidan ovillkorligen från den aktuella användarens bevakningslista, använd inställningar eller ändra inte bevakning.",
        "apihelp-move-param-ignorewarnings": "Ignorera alla varningar.",
-       "apihelp-move-example-move": "Flytta <kbd>Felaktig titel</kbd> till <kbd>Korrekt titel</kbd> utan att lämna en omdirigering.",
+       "apihelp-move-example-move": "Flytta <kbd>Badtitle</kbd> till <kbd>Goodtitle</kbd> utan att lämna en omdirigering.",
        "apihelp-opensearch-description": "Sök wikin med protokollet OpenSearch.",
        "apihelp-opensearch-param-search": "Söksträng.",
        "apihelp-opensearch-param-limit": "Maximalt antal resultat att returnera.",
        "apihelp-query+alldeletedrevisions-param-user": "Lista bara revideringar av denna användaren.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Lista inte revideringar av denna användaren.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Lista bara sidor i denna namnrymd.",
-       "apihelp-query+alldeletedrevisions-example-user": "List de senaste 50 raderade bidragen av användaren  <kbd>Example<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "List de senaste 50 raderade bidragen av användaren <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lista dem första 50 revideringarna i huvud-namnrymden",
        "apihelp-query+allfileusages-description": "Lista all fil användningsområden, inklusive icke-existerande.",
        "apihelp-query+allfileusages-param-prefix": "Sök för all fil-titlar som börjar med detta värde.",
        "apihelp-query+allusers-example-Y": "Lista användare som börjar på <kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "Hitta alla sidor som länkar till den givna sidan.",
        "apihelp-query+backlinks-param-dir": "Riktningen att lista mot.",
-       "apihelp-query+backlinks-example-simple": "Visa länkar till <kbd>huvudsidan<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Visa länkar till <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Lista alla blockerade användare och IP-adresser.",
        "apihelp-query+blocks-param-prop": "Vilka egenskaper att hämta.",
        "apihelp-query+blocks-paramvalue-prop-id": "Lägger till ID på blocket.",
        "apihelp-query+duplicatefiles-example-generated": "Leta efter kopior av alla filer.",
        "apihelp-query+embeddedin-param-dir": "Riktningen att lista mot.",
        "apihelp-query+embeddedin-param-limit": "Hur många sidor att returnera totalt.",
+       "apihelp-query+extlinks-example-simple": "Hämta en lista över externa länkar på <kbd>Main Page</kbd>.",
        "apihelp-query+filearchive-param-dir": "Riktningen att lista mot.",
        "apihelp-query+filearchive-paramvalue-prop-timestamp": "Lägger till tidsstämpel för den uppladdade versionen.",
        "apihelp-query+filearchive-paramvalue-prop-user": "Lägger till användaren som laddade upp bildversionen.",
index ddf52d4..4f88d77 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Leeheonjin"
+                       "Leeheonjin",
+                       "Macofe"
                ]
        },
        "apihelp-feedrecentchanges-example-simple": "Ipakit ang mga kamakailangang pagbabago.",
@@ -16,7 +17,7 @@
        "apihelp-query+alllinks-example-generator": "Kinukuha ang mga pahinang naglalaman ng mga kawing.",
        "apihelp-query+allpages-example-B": "Ipakita ang talaan ng mga pahinang nagsisimula sa titik <kbd>B</kbd>.",
        "apihelp-query+alltransclusions-example-generator": "Kinukuha ang mga pahinang naglalaman ng mga transklusyon.",
-       "apihelp-query+backlinks-example-simple": "Ipakita ang mga kawing sa <kbd>Unang pahina<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Ipakita ang mga kawing sa <kbd>Main page</kbd>.",
        "apihelp-query+categoryinfo-example-simple": "Kumuha ng impormasyon tungkol sa <kbd>Kategorya:Foo</kbd> at <kbd>Kategorya:Bar</kbd>.",
        "apihelp-query+duplicatefiles-example-simple": "Maghanap para sa mga duplika ng [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Hanapin ang mga duplika ng lahat ng talakasan.",
@@ -31,5 +32,5 @@
        "apihelp-query+watchlist-example-simple": "Itala ang mga punong pagbabago ng mga kasalukuyang binagong pahina sa kasalukuyang listahan ng binabantayan ng tagagamit.",
        "apihelp-revisiondelete-example-revision": "Itago ang nilalaman para sa pagbabago ng <kbd>12345</kbd> sa pahinang <kbd>Unang Pahina</kbd>.",
        "apihelp-upload-example-url": "Mag-karga mula sa URL.",
-       "apihelp-watch-example-watch": "Bantayan ang pahinang <kbd>Unang Pahina</kbd>."
+       "apihelp-watch-example-watch": "Bantayan ang pahinang <kbd>Main Page</kbd>."
 }
index 194e10f..8dd2bf4 100644 (file)
@@ -6,7 +6,8 @@
                        "Ahonc",
                        "Base",
                        "Dars",
-                       "Umherirrender"
+                       "Umherirrender",
+                       "Macofe"
                ]
        },
        "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-emailuser-param-subject": "Заголовок теми.",
        "apihelp-emailuser-param-text": "Тіло листа.",
        "apihelp-emailuser-param-ccme": "Надіслати копію цього повідомлення мені.",
-       "apihelp-emailuser-example-email": "Відправити листа користувачу <kbd>WikiSysop</kbd> з текстом <kbd>Вміст</kbd>.",
+       "apihelp-emailuser-example-email": "Відправити листа користувачу <kbd>WikiSysop</kbd> з текстом <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Розгортає усі шаблони у вікітекст.",
        "apihelp-expandtemplates-param-title": "Заголовок сторінки.",
        "apihelp-expandtemplates-param-text": "Вікітекст для перетворення.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Перерахувати сторінки лише в цьому просторі назв.",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Примітка:</strong> через [[mw:Manual:$wgMiserMode|«скупий режим»]], використання <var>$1user</var> і <var>$1namespace</var> одночасно можуть вилитися у видачу результатів менше ніж <var>$1limit</var> перед продовженням; в особливих випадках можуть видаватися нульові результати.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Коли використовується як генератор, генерувати заголовки замість ідентифікаторів версій.",
-       "apihelp-query+alldeletedrevisions-example-user": "Перерахувати останні 50 вилучених редагувань користувача <kbd>Example<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Перерахувати останні 50 вилучених редагувань користувача <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Перерахувати останні 50 вилучених версій у головному просторі назв.",
        "apihelp-query+allfileusages-description": "Перерахувати усі використання файлів, включно з тими, що не існують.",
        "apihelp-query+allfileusages-param-from": "Назва файлу, з якої почати перераховувати.",
        "apihelp-query+backlinks-param-filterredir": "Як відфільтрувати перенаправлення. Якщо встановлено <kbd>nonredirects</kbd> при увімкненому <var>$1redirect</var>, це застосовується лише до другого рівня.",
        "apihelp-query+backlinks-param-limit": "Скільки всього виводити сторінок. Якщо увімкнено <var>$1redirect</var>, ліміт застосовується до кожного рівня окремо (це означає, що може бути видано до 2 * <var>$1limit</var> результатів).",
        "apihelp-query+backlinks-param-redirect": "Якщо сторінка, яка посилається, є перенаправленням, знайти всі сторінки, які посилаються на це перенаправлення, теж. Максимальний ліміт зменшується наполовину.",
-       "apihelp-query+backlinks-example-simple": "Показати посилання на <kbd>Main page<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Отримати інформацію про сторінки, що посилаються на <kbd>Main page<kbd>.",
+       "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-start": "Часова мітка, з якої почати перелік.",
        "apihelp-query+blocks-param-end": "Часова мітка закінчення переліку.",
        "apihelp-query+extlinks-param-protocol": "Протокол URL. Якщо пусто і вказано <var>$1query</var>, протокол <kbd>http</kbd>. Залиште пустими і це, і <var>$1query</var>, щоб перелічити усі зовнішні посилання.",
        "apihelp-query+extlinks-param-query": "Шукати рядок без протоколу. Корисно для перевірки, чи містить певна сторінка певне зовнішнє посилання.",
        "apihelp-query+extlinks-param-expandurl": "Розгорнути протокол-залежні URL за канонічним протоколом.",
-       "apihelp-query+extlinks-example-simple": "Отримати список зовнішніх посилань на <kbd>Main Page<kbd>.",
+       "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-watch-description": "Додати або вилучити сторінки з списку спостереження поточного користувача.",
        "apihelp-watch-param-title": "Сторінки до додання/вилучення. Використовуйте <var>$1titles</var> натомість.",
        "apihelp-watch-param-unwatch": "Якщо вказано, сторінку буде вилучено зі списку спостереження замість додання до нього.",
-       "apihelp-watch-example-watch": "Спостерігати за сторінкою <kbd>Головна сторінка</kbd>.",
+       "apihelp-watch-example-watch": "Спостерігати за сторінкою <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Вилучити сторінку <kbd>Головна сторінка</kbd> зі списку спостереження.",
        "apihelp-watch-example-generator": "Додати перші декілька сторінок основного простору назв до списку спостереження.",
        "apihelp-format-example-generic": "Повернути результат запиту у форматі $1.",
index 53bc4e8..8e4f790 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Minh Nguyen",
                        "Max20091",
-                       "Dinhxuanduyet"
+                       "Dinhxuanduyet",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Tác vụ để thực hiện.",
@@ -43,8 +44,8 @@
        "apihelp-delete-param-pageid": "Xóa ID của trang. Không thể sử dụng cùng với <var>$1title</var>.",
        "apihelp-delete-param-watch": "Thêm trang vào danh sách theo dõi của người dùng hiện tại.",
        "apihelp-delete-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của người dùng hiện tại.",
-       "apihelp-delete-example-simple": "Xóa <kbd>Trang Chính</kbd>.",
-       "apihelp-delete-example-reason": "Xóa <kbd>Trang Chính</kbd> với lý do <kbd>Chuẩn bị di chuyển</kbd>.",
+       "apihelp-delete-example-simple": "Xóa <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Xóa <kbd>Main Page</kbd> với lý do <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Mô đun này đã bị vô hiệu hóa.",
        "apihelp-edit-description": "Tạo và sửa trang.",
        "apihelp-edit-param-section": "Số phần trang. <kbd>0</kbd> là phần đầu; <kbd>new</kbd> là phần mới.",
@@ -68,7 +69,7 @@
        "apihelp-emailuser-param-subject": "Tiêu đề bức thư.",
        "apihelp-emailuser-param-text": "Nội dung bức thư.",
        "apihelp-emailuser-param-ccme": "Gửi bản sao của thư này cho tôi.",
-       "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên <kbd>BQVWiki</kbd> với văn bản <kbd>Nội dung</kbd>.",
+       "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên <kbd>WikiSysop</kbd> với văn bản <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Bung tất cả bản mẫu trong văn bản wiki.",
        "apihelp-expandtemplates-param-title": "Tên trang.",
        "apihelp-expandtemplates-param-text": "Văn bản wiki để bung.",
@@ -96,7 +97,7 @@
        "apihelp-feedwatchlist-example-default": "Xem nguồn cấp danh sách theo dõi.",
        "apihelp-filerevert-param-comment": "Tải lên bình luận.",
        "apihelp-filerevert-param-archivename": "Tên lưu trữ của bản sửa đổi để trở lại .",
-       "apihelp-filerevert-example-revert": "Hoàn nguyên <kbd>Wiki.png</kbd> veef phiên bản 2011-03-05T15 : 27:40Z",
+       "apihelp-filerevert-example-revert": "Hoàn nguyên <kbd>Wiki.png</kbd> veef phiên bản <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Hiển thị trợ giúp cho các mô-đun xác định.",
        "apihelp-help-param-helpformat": "Định dạng của văn bản trợ giúp được cho ra.",
        "apihelp-help-example-recursive": "Tất cả trợ giúp trong một trang",
index dd3fb8f..14835e0 100644 (file)
@@ -29,7 +29,7 @@
        "apihelp-main-param-servedby": "包含保存结果请求的主机名。",
        "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
        "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。这必须匹配<code>Origin</code>中的一个起点:从头到底,因此它已经设置为像<kbd>https://zh.wikipedia.org</kbd>或<kbd>https://meta.wikimedia.org</kbd>的东西。如果此参数不匹配<code>Origin</code>页顶,就返回403错误响应。如果此参数匹配<code>Origin</code>页顶并且起点被白名单,将设置一个<code>Access-Control-Allow-Origin</code>开头。",
-       "apihelp-main-param-uselang": "用于消息翻译的语言。代码列表可从<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>通过<kbd>siprop=languages</kbd>获取,或指定<kbd>user</kbd>以使用当前用户的语言设置,或指定<kbd>content</kbd>以使用此wiki的内容语言。",
+       "apihelp-main-param-uselang": "用于消息翻译的语言。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>与<kbd>siprop=languages</kbd>可返回语言代码列表,或指定<kbd>user</kbd>以使用当前用户的语言设置,或指定<kbd>content</kbd>以使用此wiki的内容语言。",
        "apihelp-block-description": "封禁一位用户。",
        "apihelp-block-param-user": "您要封禁的用户、IP地址或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>,封禁将无限期。",
@@ -86,7 +86,7 @@
        "apihelp-edit-param-title": "您希望编辑的页面标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-edit-param-pageid": "要编辑的页面的页面 ID。不能与<var>$1title</var>一起使用。",
        "apihelp-edit-param-section": "段落数。<kbd>0</kbd>用于首段,<kbd>new</kbd>用于新的段落。",
-       "apihelp-edit-param-sectiontitle": "新小节的标题。",
+       "apihelp-edit-param-sectiontitle": "新段落的标题。",
        "apihelp-edit-param-text": "页面内容。",
        "apihelp-edit-param-summary": "编辑摘要。当$1section=new且未设置$1sectiontitle时,还包括小节标题。",
        "apihelp-edit-param-tags": "更改标签以应用修订。",
        "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型<code>$1</code>)",
        "apihelp-parse-param-pst": "在解析输入前,对输入做一次保存前变换处理。仅当使用文本时有效。",
        "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与<kbd>$1prop=langlinks</kbd>一起使用)。",
-       "apihelp-parse-param-section": "只检索此段数的内容,或只当<kbd>new</kbd>生成新的段落时检索。\n\n<kbd>new</kbd>段落只当指定<var>text</var>时受尊重。",
+       "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": "从解析器输出中省略限制报告(“NewPP limit report”)。",
        "apihelp-parse-param-disablepp": "请改用<var>$1disablelimitreport</var>。",
        "apihelp-parse-param-disabletidy": "不要在解析器输出中运行HTML清理(例如tidy)。",
        "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型<code>$1</code>;被<kbd>$2prop=parsetree</kbd>所取代)。",
        "apihelp-parse-param-preview": "在预览模式下解析。",
-       "apihelp-parse-param-sectionpreview": "在小节预览模式下解析 (同时要启用预览模式)。",
+       "apihelp-parse-param-sectionpreview": "在段落预览模式下解析(同时要启用预览模式)。",
        "apihelp-parse-param-disabletoc": "在输出中省略目录。",
        "apihelp-parse-param-contentformat": "用于输入文本的内容序列化格式。只当与$1text一起使用时有效。",
        "apihelp-parse-example-page": "解析一个页面。",
        "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],同时使用<var>$1user</var>和<var>$1namespace</var>将导致继续前返回少于<var>$1limit</var>个结果,在极端条件下可能不返回任何结果。",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。",
-       "apihelp-query+alldeletedrevisions-example-user": "列出由<kbd>Example<kbd>作出的最近50次已删除贡献。",
+       "apihelp-query+alldeletedrevisions-example-user": "列出由<kbd>Example</kbd>作出的最近50次已删除贡献。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "列出前50次已删除的主名字空间修订。",
        "apihelp-query+allfileusages-description": "列出所有文件用途,包括不存在的。",
        "apihelp-query+allfileusages-param-from": "要列举的起始文件标题。",
        "apihelp-query+allmessages-description": "返回来自该网站的消息。",
        "apihelp-query+allmessages-param-messages": "要输出的消息。<kbd>*</kbd>(默认)表示所有消息。",
        "apihelp-query+allmessages-param-prop": "要获取的属性。",
+       "apihelp-query+allmessages-param-nocontent": "如果设置,不要在输出中包含消息内容。",
        "apihelp-query+allmessages-param-args": "要替代进消息的参数。",
        "apihelp-query+allmessages-param-filter": "只返回名称包含此字符串的消息。",
        "apihelp-query+allmessages-param-customised": "只返回在此定制情形下的消息。",
        "apihelp-query+backlinks-param-filterredir": "如何过滤重定向。当<var>$1redirect</var>被启用时如果设置为<kbd>nonredirects</kbd>,这只会应用到第二级。",
        "apihelp-query+backlinks-param-limit": "返回总计页面数。如果<var>$1redirect</var>被启用,则限定分别适用于每一等级(这意味着将返回多达2 * <var>$1limit</var>个结果)。",
        "apihelp-query+backlinks-param-redirect": "如果链入页面是一个重定向,则寻找所有链接至此重定向的页面。最大限制减半。",
-       "apihelp-query+backlinks-example-simple": "显示至<kbd>Main page<kbd>的链接。",
-       "apihelp-query+backlinks-example-generator": "获取关于链接至<kbd>Main page<kbd>的页面的信息。",
+       "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-start": "枚举的起始时间戳。",
        "apihelp-query+blocks-param-end": "枚举的结束时间戳。",
        "apihelp-query+categorymembers-param-prop": "要包含的信息束:",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "添加页面ID。",
        "apihelp-query+categorymembers-paramvalue-prop-title": "添加页面标题和名字空间ID。",
-       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Adds the sortkey used for sorting in the category (hexadecimal string).",
-       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey).",
-       "apihelp-query+categorymembers-paramvalue-prop-type": "Adds the type that the page has been categorised as (page, subcat or file).",
-       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Adds the timestamp of when the page was included.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "添加用于分类中排序的关键字(十六进制字符串)。",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "添加用于分类中排序的关键字前缀(关键字的人类可读部分)。",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "添加页面被分类的类型(页面、子分类或文件)。",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "添加页面被包括时的时间戳。",
        "apihelp-query+categorymembers-param-namespace": "仅包含这些名字空间的页面。注意<kbd>$1type=subcat</kbd>或<kbd>$1type=file</kbd>可能被使用,而不是<kbd>$1namespace=14</kbd>或<kbd>6</kbd>。",
        "apihelp-query+categorymembers-param-type": "包含的分类成员类型。当<kbd>$1sort=timestamp</kbd>被设置时会忽略。",
        "apihelp-query+categorymembers-param-limit": "返回页面的最大数量。",
        "apihelp-query+categorymembers-param-start": "开始列举的时间戳。只能与<kbd>$1sort=timestamp</kbd>一起使用。",
        "apihelp-query+categorymembers-param-end": "列举的结尾时间戳。只能与<kbd>$1sort=timestamp</kbd>一起使用。",
        "apihelp-query+categorymembers-param-starthexsortkey": "开始列举的关键词,由<kbd>$1prop=sortkey</kbd>返回。不能与<kbd>$1sort=sortkey</kbd>一起使用。",
-       "apihelp-query+categorymembers-param-endhexsortkey": "结束列举的关键词,由<kbd>$1prop=sortkey</kbd>返回。不能与<kbd>$1sort=sortkey</kbd>一起使用。",
+       "apihelp-query+categorymembers-param-endhexsortkey": "结束列举的关键字,由<kbd>$1prop=sortkey</kbd>返回。只能与<kbd>$1sort=sortkey</kbd>一起使用。",
        "apihelp-query+categorymembers-param-startsortkeyprefix": "要开始列举的排序关键词前缀。只能与<kbd>$1sort=sortkey</kbd>一起使用。覆盖<var>$1starthexsortkey</var>。",
+       "apihelp-query+categorymembers-param-endsortkeyprefix": "要结束列举<strong>before</strong>的关键字前缀(而不是<strong>at</strong>;如果此值出现,它将不被包括!)只能与$1sort=sortkey一起使用。覆盖$1endhexsortkey。",
        "apihelp-query+categorymembers-param-startsortkey": "请改用$1starthexsortkey。",
        "apihelp-query+categorymembers-param-endsortkey": "请改用$1endhexsortkey。",
        "apihelp-query+categorymembers-example-simple": "获取<kbd>Category:Physics</kbd>中的前10个页面。",
        "apihelp-query+extlinks-param-protocol": "URL协议。如果为空并且<var>$1query</var>被设置,协议为<kbd>http</kbd>。将此和<var>$1query</var>都留空以列举所有外部链接。",
        "apihelp-query+extlinks-param-query": "不使用协议搜索字符串。对于检查某一页面是否包含某一外部URL很有用。",
        "apihelp-query+extlinks-param-expandurl": "扩展协议相对URL与规范协议。",
-       "apihelp-query+extlinks-example-simple": "获取<kbd>Main Page<kbd>的外部链接列表。",
+       "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+imageusage-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
        "apihelp-query+imageusage-param-namespace": "要列举的名字空间。",
        "apihelp-query+imageusage-param-dir": "罗列所采用的方向。",
+       "apihelp-query+imageusage-param-limit": "返回总计页面数。如果<var>$1redirect</var>被启用,则限定分别适用于每一等级(这意味着将返回多达2 * <var>$1limit</var>个结果)。",
        "apihelp-query+imageusage-example-simple": "显示使用[[:File:Albert Einstein Head.jpg]]的页面。",
        "apihelp-query+imageusage-example-generator": "获取有关使用[[:File:Albert Einstein Head.jpg]]的页面的信息。",
        "apihelp-query+info-description": "获取基本页面信息。",
        "apihelp-query+pagepropnames-description": "列出wiki中所有使用中的页面属性名称。",
        "apihelp-query+pagepropnames-param-limit": "返回名称的最大数量。",
        "apihelp-query+pagepropnames-example-simple": "获取前10个属性名称。",
-       "apihelp-query+pageprops-description": "获取页面内容中定义的各种属性。",
-       "apihelp-query+pageprops-param-prop": "只列出这些组。在检查某一页面是否使用某一个页面属性时有用。",
+       "apihelp-query+pageprops-description": "获取页面内容中定义的各种页面属性。",
+       "apihelp-query+pageprops-param-prop": "只列出这些页面属性(<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd>返回使用中的页面属性名称)。在检查页面是否使用某一页面属性时有用。",
        "apihelp-query+pageprops-example-simple": "获取用于页面<kbd>Main Page</kbd>和<kbd>MediaWiki</kbd>的属性。",
        "apihelp-query+pageswithprop-description": "列出所有使用指定页面属性的页面。",
-       "apihelp-query+pageswithprop-param-propname": "要用于列举页面的页面属性。",
+       "apihelp-query+pageswithprop-param-propname": "要用于列举页面的页面属性(<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd>返回正在使用中的页面属性名称)。",
        "apihelp-query+pageswithprop-param-prop": "要包含的信息束:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "添加页面ID。",
        "apihelp-query+pageswithprop-paramvalue-prop-title": "添加页面的标题和名字空间ID。",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[Main Page]]的信息。",
        "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。",
        "apihelp-query+revisions-param-end": "列举直至此时间戳。",
+       "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-example-first5": "获取<kbd>Main Page</kbd>的前5次修订。",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "标记已巡查编辑。",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "列举用于编辑的标签。",
        "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:<kbd>$2show=!minor</kbd>。\n\n如果<kbd>$2show=patrolled</kbd>或<kbd>$2show=!patrolled</kbd>被设定,早于<var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>($1秒)的修订不会被显示。",
+       "apihelp-query+usercontribs-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+usercontribs-example-user": "显示用户<kbd>Example</kbd>的贡献。",
        "apihelp-query+usercontribs-example-ipprefix": "显示来自<kbd>192.0.2.</kbd>前缀所有 IP 地址的贡献。",
        "apihelp-query+userinfo-description": "获取有关当前用户的信息。",
        "apihelp-query+watchlistraw-param-limit": "根据结果返回的结果总数。",
        "apihelp-query+watchlistraw-param-prop": "要获取的额外属性:",
        "apihelp-query+watchlistraw-paramvalue-prop-changed": "添加最近被通知有关编辑的用户的时间戳。",
+       "apihelp-query+watchlistraw-param-show": "只列出符合这些标准的项目。",
        "apihelp-query+watchlistraw-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-query+watchlistraw-param-fromtitle": "要列举的起始标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-param-totitle": "要列举的最终标题(带名字空间前缀)。",
        "apihelp-setnotificationtimestamp-example-page": "重置用于<kbd>Main page</kbd>的通知状态。",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置<kbd>Main page</kbd>的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。",
        "apihelp-setnotificationtimestamp-example-allpages": "重置在<kbd>{{ns:user}}</kbd>名字空间中的页面的通知状态。",
+       "apihelp-stashedit-param-title": "已开始编辑的页面标题。",
+       "apihelp-stashedit-param-section": "段落数。<kbd>0</kbd>用于首段,<kbd>new</kbd>用于新的段落。",
+       "apihelp-stashedit-param-sectiontitle": "新段落的标题。",
+       "apihelp-stashedit-param-text": "页面内容。",
+       "apihelp-stashedit-param-contentmodel": "新内容的内容模型。",
        "apihelp-tag-description": "从个别修订或日志记录中添加或移除更改标签。",
        "apihelp-tag-param-rcid": "要添加或移除标签的一个或更多的最近更改ID。",
        "apihelp-tag-param-revid": "要添加或移除标签的一个或更多的修订ID。",
index b1e6d95..226d448 100644 (file)
@@ -5,7 +5,8 @@
                        "Liuxinyu970226",
                        "LNDDYL",
                        "EagerLin",
-                       "Zhxy 519"
+                       "Zhxy 519",
+                       "Macofe"
                ]
        },
        "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: 錯誤與警告]]。",
@@ -23,7 +24,7 @@
        "apihelp-block-param-reblock": "若使用者已被封鎖,覆寫既有的封鎖設定值。",
        "apihelp-block-param-watchuser": "監視使用者或 IP 位址的使用者頁面與對話頁面。",
        "apihelp-block-example-ip-simple": "封鎖 IP 位址 <kbd>192.0.2.5</kbd> 三天,原因為 <kbd>First strike</kbd>。",
-       "apihelp-block-example-user-complex": "永久封鎖 IP 位址 <kbd>Vandal</kbd>,原因為 <kbd>First strike</kbd>。",
+       "apihelp-block-example-user-complex": "永久封鎖 IP 位址 <kbd>Vandal</kbd>,原因為 <kbd>Vandalism</kbd>。",
        "apihelp-checktoken-description": "檢查來自 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> 的密鑰有效性。",
        "apihelp-checktoken-param-type": "要測試的密鑰類型。",
        "apihelp-checktoken-param-token": "要測試的密鑰。",
        "apihelp-query+usercontribs-param-limit": "回傳的貢獻數量上限。",
        "apihelp-query+watchlist-param-limit": "每個請求要回傳的結果總數。",
        "apihelp-query+watchlistraw-param-limit": "每個請求要回傳的結果總數。",
+       "apihelp-stashedit-param-title": "正在編輯此頁面的標題。",
+       "apihelp-stashedit-param-text": "頁面內容。",
        "apihelp-tokens-description": "取得資料修改動作的密鑰。\n\n此模組已因支援 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 而停用。",
        "apihelp-unblock-param-reason": "解除封鎖的原因。",
        "apihelp-unblock-example-id": "解除封銷 ID #<kbd>105</kbd>。",
index 1296c13..549ac84 100644 (file)
@@ -133,7 +133,7 @@ class BacklinkCache {
        /**
         * Set the Database object to use
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         */
        public function setDB( $db ) {
                $this->db = $db;
index 698b304..d98888f 100644 (file)
@@ -231,7 +231,7 @@ class LinkBatch {
         * Construct a WHERE clause which will match all the given titles.
         *
         * @param string $prefix The appropriate table's field name prefix ('page', 'pl', etc)
-        * @param DatabaseBase $db DatabaseBase object to use
+        * @param IDatabase $db DatabaseBase object to use
         * @return string|bool String with SQL where clause fragment, or false if no items.
         */
        public function constructSet( $prefix, $db ) {
index 56c9256..3db84a6 100644 (file)
  * @ingroup Cache
  */
 class LinkCache {
-       // Increment $mClassVer whenever old serialized versions of this class
-       // becomes incompatible with the new version.
-       private $mClassVer = 5;
-
        /**
         * @var MapCacheLRU
         */
index 276e84a..f5b2350 100644 (file)
@@ -23,6 +23,7 @@
 use Cdb\Exception as CdbException;
 use Cdb\Reader as CdbReader;
 use Cdb\Writer as CdbWriter;
+use CLDRPluralRuleParser\Evaluator;
 
 /**
  * Class for caching the contents of localisation files, Messages*.php
@@ -576,7 +577,7 @@ class LocalisationCache {
                        return null;
                }
                try {
-                       $compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
+                       $compiledRules = Evaluator::compile( $rules );
                } catch ( CLDRPluralRuleError $e ) {
                        wfDebugLog( 'l10n', $e->getMessage() );
 
index 19349b2..63d8c7e 100644 (file)
@@ -167,7 +167,7 @@ class MessageBlobStore {
         * @param string $name Module name
         * @param ResourceLoaderModule $module
         * @param string $lang Language code
-        * @return string Regenerated message blob, or null if there was no blob for
+        * @return string|null Regenerated message blob, or null if there was no blob for
         *   the given module/language pair.
         */
        public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
index f22c860..ef70589 100644 (file)
@@ -394,21 +394,19 @@ class MessageCache {
                $saveSuccess = $this->saveToCaches( $cache, 'all', $code );
 
                if ( !$saveSuccess ) {
-                       # Cache save has failed.
-                       # There are two main scenarios where this could be a problem:
-                       #
-                       #   - The cache is more than the maximum size (typically
-                       #     1MB compressed).
-                       #
-                       #   - Memcached has no space remaining in the relevant slab
-                       #     class. This is unlikely with recent versions of
-                       #     memcached.
-                       #
-                       # Either way, if there is a local cache, nothing bad will
-                       # happen. If there is no local cache, disabling the message
-                       # cache for all requests avoids incurring a loadFromDB()
-                       # overhead on every request, and thus saves the wiki from
-                       # complete downtime under moderate traffic conditions.
+                       /**
+                        * Cache save has failed.
+                        *
+                        * There are two main scenarios where this could be a problem:
+                        * - The cache is more than the maximum size (typically 1MB compressed).
+                        * - Memcached has no space remaining in the relevant slab class. This is
+                        *   unlikely with recent versions of memcached.
+                        *
+                        * Either way, if there is a local cache, nothing bad will happen. If there
+                        * is no local cache, disabling the message cache for all requests avoids
+                        * incurring a loadFromDB() overhead on every request, and thus saves the
+                        * wiki from complete downtime under moderate traffic conditions.
+                        */
                        if ( !$wgUseLocalMessageCache ) {
                                $this->mMemc->set( $statusKey, 'error', 60 * 5 );
                                $where[] = 'could not save cache, disabled globally for 5 minutes';
diff --git a/includes/changes/CategoryMembershipChange.php b/includes/changes/CategoryMembershipChange.php
new file mode 100644 (file)
index 0000000..a12a1d8
--- /dev/null
@@ -0,0 +1,275 @@
+<?php
+/**
+ * Helper class for category membership changes
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Kai Nissen
+ * @author Adam Shorland
+ * @since 1.26
+ */
+
+use Wikimedia\Assert\Assert;
+
+class CategoryMembershipChange {
+
+       const CATEGORY_ADDITION = 1;
+       const CATEGORY_REMOVAL = -1;
+
+       /**
+        * @var string Current timestamp, set during CategoryMembershipChange::__construct()
+        */
+       private $timestamp;
+
+       /**
+        * @var Title Title instance of the categorized page
+        */
+       private $pageTitle;
+
+       /**
+        * @var Revision|null Latest Revision instance of the categorized page
+        */
+       private $revision;
+
+       /**
+        * @var int
+        * Number of pages this WikiPage is embedded by; set by CategoryMembershipChange::setRecursive()
+        */
+       private $numTemplateLinks = 0;
+
+       /**
+        * @var callable|null
+        */
+       private $newForCategorizationCallback = null;
+
+       /**
+        * @param Title $pageTitle Title instance of the categorized page
+        * @param Revision $revision Latest Revision instance of the categorized page
+        *
+        * @throws MWException
+        */
+       public function __construct( Title $pageTitle, Revision $revision = null ) {
+               $this->pageTitle = $pageTitle;
+               $this->timestamp = wfTimestampNow();
+               $this->revision = $revision;
+               $this->newForCategorizationCallback = array( 'RecentChange', 'newForCategorization' );
+       }
+
+       /**
+        * Overrides the default new for categorization callback
+        * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
+        *
+        * @param callable $callback
+        * @see RecentChange::newForCategorization for callback signiture
+        *
+        * @throws MWException
+        */
+       public function overrideNewForCategorizationCallback( $callback ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException( 'Cannot override newForCategorization callback in operation.' );
+               }
+               Assert::parameterType( 'callable', $callback, '$callback' );
+               $this->newForCategorizationCallback = $callback;
+       }
+
+       /**
+        * Determines the number of template links for recursive link updates
+        */
+       public function checkTemplateLinks() {
+               $this->numTemplateLinks = $this->pageTitle->getBacklinkCache()->getNumLinks( 'templatelinks' );
+       }
+
+       /**
+        * Create a recentchanges entry for category additions
+        *
+        * @param Title $categoryTitle
+        */
+       public function triggerCategoryAddedNotification( Title $categoryTitle ) {
+               $this->createRecentChangesEntry( $categoryTitle, self::CATEGORY_ADDITION );
+       }
+
+       /**
+        * Create a recentchanges entry for category removals
+        *
+        * @param Title $categoryTitle
+        */
+       public function triggerCategoryRemovedNotification( Title $categoryTitle ) {
+               $this->createRecentChangesEntry( $categoryTitle, self::CATEGORY_REMOVAL );
+       }
+
+       /**
+        * Create a recentchanges entry using RecentChange::notifyCategorization()
+        *
+        * @param Title $categoryTitle
+        * @param int $type
+        */
+       private function createRecentChangesEntry( Title $categoryTitle, $type ) {
+               $this->notifyCategorization(
+                       $this->timestamp,
+                       $categoryTitle,
+                       $this->getUser(),
+                       $this->getChangeMessageText( $type, array(
+                               'prefixedText' => $this->pageTitle->getPrefixedText(),
+                               'numTemplateLinks' => $this->numTemplateLinks
+                       ) ),
+                       $this->pageTitle,
+                       $this->getPreviousRevisionTimestamp(),
+                       $this->revision
+               );
+       }
+
+       /**
+        * @param string $timestamp Timestamp of the recent change to occur in TS_MW format
+        * @param Title $categoryTitle Title of the category a page is being added to or removed from
+        * @param User $user User object of the user that made the change
+        * @param string $comment Change summary
+        * @param Title $pageTitle Title of the page that is being added or removed
+        * @param string $lastTimestamp Parent revision timestamp of this change in TS_MW format
+        * @param Revision|null $revision
+        *
+        * @throws MWException
+        */
+       private function notifyCategorization(
+               $timestamp,
+               Title $categoryTitle,
+               User $user = null,
+               $comment,
+               Title $pageTitle,
+               $lastTimestamp,
+               $revision
+       ) {
+               $deleted = $revision ? $revision->getVisibility() & Revision::SUPPRESSED_USER : 0;
+               $newRevId = $revision ? $revision->getId() : 0;
+
+               /**
+                * T109700 - Default bot flag to true when there is no corresponding RC entry
+                * This means all changes caused by parser functions & Lua on reparse are marked as bot
+                * Also in the case no RC entry could be found due to slave lag
+                */
+               $bot = 1;
+               $lastRevId = 0;
+               $ip = '';
+
+               # If no revision is given, the change was probably triggered by parser functions
+               if ( $revision !== null ) {
+                       $correspondingRc = $this->revision->getRecentChange();
+                       if ( $correspondingRc === null ) {
+                               $correspondingRc = $this->revision->getRecentChange( Revision::READ_LATEST );
+                       }
+                       if ( $correspondingRc !== null ) {
+                               $bot = $correspondingRc->getAttribute( 'rc_bot' ) ?: 0;
+                               $ip = $correspondingRc->getAttribute( 'rc_ip' ) ?: '';
+                               $lastRevId = $correspondingRc->getAttribute( 'rc_last_oldid' ) ?: 0;
+                       }
+               }
+
+               $rc = call_user_func_array(
+                       $this->newForCategorizationCallback,
+                       array(
+                               $timestamp,
+                               $categoryTitle,
+                               $user,
+                               $comment,
+                               $pageTitle,
+                               $lastRevId,
+                               $newRevId,
+                               $lastTimestamp,
+                               $bot,
+                               $ip,
+                               $deleted
+                       )
+               );
+               $rc->save();
+       }
+
+       /**
+        * Get the user associated with this change.
+        *
+        * If there is no revision associated with the change and thus no editing user
+        * fallback to a default.
+        *
+        * False will be returned if the user name specified in the
+        * 'autochange-username' message is invalid.
+        *
+        * @return User|bool
+        */
+       private function getUser() {
+               if ( $this->revision ) {
+                       $userId = $this->revision->getUser( Revision::RAW );
+                       if ( $userId === 0 ) {
+                               return User::newFromName( $this->revision->getUserText( Revision::RAW ), false );
+                       } else {
+                               return User::newFromId( $userId );
+                       }
+               }
+
+               $username = wfMessage( 'autochange-username' )->inContentLanguage()->text();
+               $user = User::newFromName( $username );
+               # User::newFromName() can return false on a badly configured wiki.
+               if ( $user && !$user->isLoggedIn() ) {
+                       $user->addToDatabase();
+               }
+
+               return $user;
+       }
+
+       /**
+        * Returns the change message according to the type of category membership change
+        *
+        * The message keys created in this method may be one of:
+        * - recentchanges-page-added-to-category
+        * - recentchanges-page-added-to-category-bundled
+        * - recentchanges-page-removed-from-category
+        * - recentchanges-page-removed-from-category-bundled
+        *
+        * @param int $type may be CategoryMembershipChange::CATEGORY_ADDITION
+        * or CategoryMembershipChange::CATEGORY_REMOVAL
+        * @param array $params
+        * - prefixedUrl: result of Title::->getPrefixedURL()
+        *
+        * @return string
+        */
+       private function getChangeMessageText( $type, array $params ) {
+               $array = array(
+                       self::CATEGORY_ADDITION => 'recentchanges-page-added-to-category',
+                       self::CATEGORY_REMOVAL => 'recentchanges-page-removed-from-category',
+               );
+
+               $msgKey = $array[$type];
+
+               if ( intval( $params['numTemplateLinks'] ) > 0 ) {
+                       $msgKey .= '-bundled';
+               }
+
+               return wfMessage( $msgKey, $params )->inContentLanguage()->text();
+       }
+
+       /**
+        * Returns the timestamp of the page's previous revision or null if the latest revision
+        * does not refer to a parent revision
+        *
+        * @return null|string
+        */
+       private function getPreviousRevisionTimestamp() {
+               $previousRev = Revision::newFromId(
+                               $this->pageTitle->getPreviousRevisionID( $this->pageTitle->getLatestRevID() )
+                       );
+
+               return $previousRev ? $previousRev->getTimestamp() : null;
+       }
+
+}
index d912e3a..1dcb7ae 100644 (file)
@@ -283,6 +283,10 @@ class EnhancedChangesList extends ChangesList {
                // Further down are some assumptions that $block is a 0-indexed array
                // with (count-1) as last key. Let's make sure it is.
                $block = array_values( $block );
+               if ( empty( $block ) ) {
+                       // if we can't show anything, don't display this block altogether
+                       return '';
+               }
 
                $r .= $this->getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden );
 
@@ -453,6 +457,10 @@ class EnhancedChangesList extends ChangesList {
         * @return string
         */
        protected function getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden ) {
+               if ( empty( $block ) ) {
+                       return '';
+               }
+
                # Changes message
                static $nchanges = array();
                static $sinceLastVisitMsg = array();
index 87871f4..2ccc24b 100644 (file)
@@ -67,6 +67,7 @@ class RecentChange {
        const SRC_NEW = 'mw.new';
        const SRC_LOG = 'mw.log';
        const SRC_EXTERNAL = 'mw.external'; // obsolete
+       const SRC_CATEGORIZE = 'mw.categorize';
 
        public $mAttribs = array();
        public $mExtra = array();
@@ -97,6 +98,7 @@ class RecentChange {
                'new' => RC_NEW,
                'log' => RC_LOG,
                'external' => RC_EXTERNAL,
+               'categorize' => RC_CATEGORIZE,
        );
 
        # Factory methods
@@ -171,12 +173,17 @@ class RecentChange {
         *
         * @param array $conds Array of conditions
         * @param mixed $fname Override the method name in profiling/logs
-        * @param array $options Query options
+        * @param int $dbType DB_* constant
+        *
         * @return RecentChange|null
         */
-       public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) {
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname, $options );
+       public static function newFromConds(
+               $conds,
+               $fname = __METHOD__,
+               $dbType = DB_SLAVE
+       ) {
+               $db = wfGetDB( $dbType );
+               $row = $db->selectRow( 'recentchanges', self::selectFields(), $conds, $fname );
                if ( $row !== false ) {
                        return self::newFromRow( $row );
                } else {
@@ -293,7 +300,7 @@ class RecentChange {
                $this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] );
                $this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' );
 
-               ## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
+               # # If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
                if ( $dbw->cascadingDeletes() && $this->mAttribs['rc_cur_id'] == 0 ) {
                        unset( $this->mAttribs['rc_cur_id'] );
                }
@@ -688,7 +695,7 @@ class RecentChange {
                $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) {
                global $wgRequest;
 
-               ## Get pageStatus for email notification
+               # # Get pageStatus for email notification
                switch ( $type . '-' . $action ) {
                        case 'delete-delete':
                                $pageStatus = 'deleted';
@@ -749,6 +756,80 @@ class RecentChange {
                return $rc;
        }
 
+       /**
+        * Constructs a RecentChange object for the given categorization
+        * This does not call save() on the object and thus does not write to the db
+        *
+        * @since 1.26
+        *
+        * @param string $timestamp Timestamp of the recent change to occur
+        * @param Title $categoryTitle Title of the category a page is being added to or removed from
+        * @param User $user User object of the user that made the change
+        * @param string $comment Change summary
+        * @param Title $pageTitle Title of the page that is being added or removed
+        * @param int $oldRevId Parent revision ID of this change
+        * @param int $newRevId Revision ID of this change
+        * @param string $lastTimestamp Parent revision timestamp of this change
+        * @param bool $bot true, if the change was made by a bot
+        * @param string $ip IP address of the user, if the change was made anonymously
+        * @param int $deleted Indicates whether the change has been deleted
+        *
+        * @return RecentChange
+        */
+       public static function newForCategorization(
+               $timestamp,
+               Title $categoryTitle,
+               User $user = null,
+               $comment,
+               Title $pageTitle,
+               $oldRevId,
+               $newRevId,
+               $lastTimestamp,
+               $bot,
+               $ip = '',
+               $deleted = 0
+       ) {
+
+               $rc = new RecentChange;
+               $rc->mTitle = $categoryTitle;
+               $rc->mPerformer = $user;
+               $rc->mAttribs = array(
+                       'rc_timestamp' => $timestamp,
+                       'rc_namespace' => $categoryTitle->getNamespace(),
+                       'rc_title' => $categoryTitle->getDBkey(),
+                       'rc_type' => RC_CATEGORIZE,
+                       'rc_source' => self::SRC_CATEGORIZE,
+                       'rc_minor' => 0,
+                       'rc_cur_id' => $pageTitle->getArticleID(),
+                       'rc_user' => $user ? $user->getId() : 0,
+                       'rc_user_text' => $user ? $user->getName() : '',
+                       'rc_comment' => $comment,
+                       'rc_this_oldid' => $newRevId,
+                       'rc_last_oldid' => $oldRevId,
+                       'rc_bot' => $bot ? 1 : 0,
+                       'rc_ip' => self::checkIPAddress( $ip ),
+                       'rc_patrolled' => 1, // Always patrolled, just like log entries
+                       'rc_new' => 0, # obsolete
+                       'rc_old_len' => 0,
+                       'rc_new_len' => 0,
+                       'rc_deleted' => $deleted,
+                       'rc_logid' => 0,
+                       'rc_log_type' => null,
+                       'rc_log_action' => '',
+                       'rc_params' => ''
+               );
+
+               $rc->mExtra = array(
+                       'prefixedDBkey' => $categoryTitle->getPrefixedDBkey(),
+                       'lastTimestamp' => $lastTimestamp,
+                       'oldSize' => 0,
+                       'newSize' => 0,
+                       'pageStatus' => 'changed'
+               );
+
+               return $rc;
+       }
+
        /**
         * Initialises the members of this object from a mysql row object
         *
index 12f738f..e1b9b27 100644 (file)
@@ -1090,7 +1090,9 @@ class ChangeTags {
        public static function listExtensionActivatedTags() {
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'active-tags' ),
-                       function() {
+                       function ( $oldValue, &$ttl, array &$setOpts ) {
+                               $setOpts += DatabaseBase::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+
                                // Ask extensions which tags they consider active
                                $extensionActive = array();
                                Hooks::run( 'ChangeTagsListActive', array( &$extensionActive ) );
@@ -1130,10 +1132,12 @@ class ChangeTags {
 
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'valid-tags-db' ),
-                       function() use ( $fname ) {
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_SLAVE );
-                               $tags = $dbr->selectFieldValues(
-                                       'valid_tag', 'vt_tag', array(), $fname );
+
+                               $setOpts += DatabaseBase::getCacheSetOptions( $dbr );
+
+                               $tags = $dbr->selectFieldValues( 'valid_tag', 'vt_tag', array(), $fname );
 
                                return array_filter( array_unique( $tags ) );
                        },
@@ -1155,7 +1159,9 @@ class ChangeTags {
        public static function listExtensionDefinedTags() {
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'valid-tags-hook' ),
-                       function() {
+                       function ( $oldValue, &$ttl, array &$setOpts ) {
+                               $setOpts += DatabaseBase::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+
                                $tags = array();
                                Hooks::run( 'ListDefinedTags', array( &$tags ) );
                                return array_filter( array_unique( $tags ) );
@@ -1212,10 +1218,11 @@ class ChangeTags {
                $fname = __METHOD__;
                $cachedStats = ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'change-tag-statistics' ),
-                       function() use ( $fname ) {
-                               $out = array();
-
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_SLAVE, 'vslow' );
+
+                               $setOpts += DatabaseBase::getCacheSetOptions( $dbr );
+
                                $res = $dbr->select(
                                        'change_tag',
                                        array( 'ct_tag', 'hitcount' => 'count(*)' ),
@@ -1224,6 +1231,7 @@ class ChangeTags {
                                        array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' )
                                );
 
+                               $out = array();
                                foreach ( $res as $row ) {
                                        $out[$row->ct_tag] = $row->hitcount;
                                }
index 4526ee3..3bffbdf 100644 (file)
@@ -29,7 +29,7 @@ class ChangeTagsLogList extends ChangeTagsList {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return mixed
         */
        public function doQuery( $db ) {
index ec401bc..f0dfc0f 100644 (file)
@@ -29,7 +29,7 @@ class ChangeTagsRevisionList extends ChangeTagsList {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return mixed
         */
        public function doQuery( $db ) {
index ec0573e..8a88fab 100644 (file)
@@ -442,7 +442,9 @@ class RedisConnRef {
         * @param Redis $conn
         * @param LoggerInterface $logger
         */
-       public function __construct( RedisConnectionPool $pool, $server, Redis $conn, LoggerInterface $logger ) {
+       public function __construct(
+               RedisConnectionPool $pool, $server, Redis $conn, LoggerInterface $logger
+       ) {
                $this->pool = $pool;
                $this->server = $server;
                $this->conn = $conn;
index b8e44c7..38ce855 100644 (file)
@@ -143,7 +143,7 @@ define( 'UTF8_MAX', "\xf4\x8f\xbf\xbf" /*codepointToUtf8( UNICODE_MAX )*/ );
  * @deprecated since 1.25, use UtfNormal\Constants instead
  */
 define( 'UTF8_REPLACEMENT', "\xef\xbf\xbd" /*codepointToUtf8( UNICODE_REPLACEMENT )*/ );
-#define( 'UTF8_REPLACEMENT', '!' );
+# define( 'UTF8_REPLACEMENT', '!' );
 
 /**
  * @deprecated since 1.25, use UtfNormal\Constants instead
index 6542d7d..c98b0ec 100644 (file)
@@ -446,7 +446,7 @@ abstract class AbstractContent implements Content {
         */
        public function convert( $toModel, $lossy = '' ) {
                if ( $this->getModel() === $toModel ) {
-                       //nothing to do, shorten out.
+                       // nothing to do, shorten out.
                        return $this;
                }
 
index bf91a4f..76f2a7b 100644 (file)
@@ -630,7 +630,7 @@ abstract class ContentHandler {
         * @return DifferenceEngine
         */
        public function createDifferenceEngine( IContextSource $context, $old = 0, $new = 0,
-               $rcid = 0, //FIXME: Deprecated, no longer used
+               $rcid = 0, // FIXME: Deprecated, no longer used
                $refreshCache = false, $unhide = false ) {
 
                // hook: get difference engine
index 5b84657..e3f9375 100644 (file)
@@ -83,7 +83,7 @@ class MessageContent extends AbstractContent {
         * @return Message The message object.
         */
        public function getNativeData() {
-               //NOTE: Message objects are mutable. Cloning here makes MessageContent immutable.
+               // NOTE: Message objects are mutable. Cloning here makes MessageContent immutable.
                return clone $this->mMessage;
        }
 
index 93adde1..42a2aee 100644 (file)
@@ -159,7 +159,10 @@ class RequestContext implements IContextSource, MutableContext {
                if ( $this->title === null ) {
                        global $wgTitle; # fallback to $wg till we can improve this
                        $this->title = $wgTitle;
-                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers( 5 ) . ' with no title set.' );
+                       wfDebugLog(
+                               'GlobalTitleFail',
+                               __METHOD__ . ' called by ' . wfGetAllCallers( 5 ) . ' with no title set.'
+                       );
                }
 
                return $this->title;
index 9eb3e2f..bc703f3 100644 (file)
@@ -98,7 +98,7 @@ class CloneDatabase {
                                }
                                $this->db->dropTable( $tbl, __METHOD__ );
                                wfDebug( __METHOD__ . " dropping {$newTableName}\n" );
-                               //Dropping the oldTable because the prefix was changed
+                               // Dropping the oldTable because the prefix was changed
                        }
 
                        # Create new table
index b4f3f79..4195719 100644 (file)
@@ -449,15 +449,15 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
-       public function resultObject( $result ) {
+       public function ping() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
-       public function ping() {
+       public function getLag() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
-       public function getLag() {
+       public function getSessionLagStatus() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
index 1e54f55..f044002 100644 (file)
@@ -45,6 +45,9 @@ abstract class DatabaseBase implements IDatabase {
 
        protected $mServer, $mUser, $mPassword, $mDBname;
 
+       /** @var BagOStuff APC cache */
+       protected $srvCache;
+
        /** @var resource Database connection */
        protected $mConn = null;
        protected $mOpened = false;
@@ -96,6 +99,9 @@ abstract class DatabaseBase implements IDatabase {
         */
        private $mTrxTimestamp = null;
 
+       /** @var float Lag estimate at the time of BEGIN */
+       private $mTrxSlaveLag = null;
+
        /**
         * Remembers the function name given for starting the most recent transaction via begin().
         * Used to provide additional context for error reporting.
@@ -124,9 +130,9 @@ abstract class DatabaseBase implements IDatabase {
        /**
         * Array of levels of atomicity within transactions
         *
-        * @var SplStack
+        * @var array
         */
-       private $mTrxAtomicLevels;
+       private $mTrxAtomicLevels = array();
 
        /**
         * Record if the current transaction was started implicitly by DatabaseBase::startAtomic
@@ -322,24 +328,6 @@ abstract class DatabaseBase implements IDatabase {
                }
        }
 
-       /**
-        * Set lag time in seconds for a fake slave
-        *
-        * @param mixed $lag Valid values for this parameter are determined by the
-        *   subclass, but should be a PHP scalar or array that would be sensible
-        *   as part of $wgLBFactoryConf.
-        */
-       public function setFakeSlaveLag( $lag ) {
-       }
-
-       /**
-        * Make this connection a fake master
-        *
-        * @param bool $enabled
-        */
-       public function setFakeMaster( $enabled = true ) {
-       }
-
        /**
         * @return TransactionProfiler
         */
@@ -497,11 +485,7 @@ abstract class DatabaseBase implements IDatabase {
         *   - DBO_PERSISTENT: use persistant database connection
         */
        public function setFlag( $flag ) {
-               global $wgDebugDBTransactions;
                $this->mFlags |= $flag;
-               if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
-                       wfDebug( "Implicit transactions are now enabled.\n" );
-               }
        }
 
        /**
@@ -516,11 +500,7 @@ abstract class DatabaseBase implements IDatabase {
         *   - DBO_PERSISTENT: use persistant database connection
         */
        public function clearFlag( $flag ) {
-               global $wgDebugDBTransactions;
                $this->mFlags &= ~$flag;
-               if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
-                       wfDebug( "Implicit transactions are now disabled.\n" );
-               }
        }
 
        /**
@@ -625,9 +605,10 @@ abstract class DatabaseBase implements IDatabase {
         * @param array $params Parameters passed from DatabaseBase::factory()
         */
        function __construct( array $params ) {
-               global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode, $wgDebugDBTransactions;
+               global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode;
 
                $this->mTrxAtomicLevels = new SplStack;
+               $this->srvCache = ObjectCache::newAccelerator( 'hash' );
 
                $server = $params['host'];
                $user = $params['user'];
@@ -642,14 +623,8 @@ abstract class DatabaseBase implements IDatabase {
                if ( $this->mFlags & DBO_DEFAULT ) {
                        if ( $wgCommandLineMode ) {
                                $this->mFlags &= ~DBO_TRX;
-                               if ( $wgDebugDBTransactions ) {
-                                       wfDebug( "Implicit transaction open disabled.\n" );
-                               }
                        } else {
                                $this->mFlags |= DBO_TRX;
-                               if ( $wgDebugDBTransactions ) {
-                                       wfDebug( "Implicit transaction open enabled.\n" );
-                               }
                        }
                }
 
@@ -946,7 +921,7 @@ abstract class DatabaseBase implements IDatabase {
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
-               global $wgUser, $wgDebugDBTransactions, $wgDebugDumpSqlLength;
+               global $wgUser;
 
                $this->mLastQuery = $sql;
 
@@ -976,9 +951,6 @@ abstract class DatabaseBase implements IDatabase {
                $commentedSql = preg_replace( '/\s|$/', " /* $fname $userName */ ", $sql, 1 );
 
                if ( !$this->mTrxLevel && $this->getFlag( DBO_TRX ) && $this->isTransactableQuery( $sql ) ) {
-                       if ( $wgDebugDBTransactions ) {
-                               wfDebug( "Implicit transaction start.\n" );
-                       }
                        $this->begin( __METHOD__ . " ($fname)" );
                        $this->mTrxAutomatic = true;
                }
@@ -1010,15 +982,7 @@ abstract class DatabaseBase implements IDatabase {
                }
 
                if ( $this->debug() ) {
-                       static $cnt = 0;
-
-                       $cnt++;
-                       $sqlx = $wgDebugDumpSqlLength ? substr( $commentedSql, 0, $wgDebugDumpSqlLength )
-                               : $commentedSql;
-                       $sqlx = strtr( $sqlx, "\t\n", '  ' );
-
-                       $master = $isMaster ? 'master' : 'slave';
-                       wfDebug( "Query {$this->mDBname} ($cnt) ($master): $sqlx\n" );
+                       wfDebugLog( 'queries', sprintf( "%s: %s", $this->mDBname, $sql ) );
                }
 
                $queryId = MWDebug::query( $sql, $fname, $isMaster );
@@ -1079,8 +1043,8 @@ abstract class DatabaseBase implements IDatabase {
                $res = $this->resultObject( $ret );
 
                // Destroy profile sections in the opposite order to their creation
-               $queryProfSection = false;
-               $totalProfSection = false;
+               ScopedCallback::consume( $queryProfSection );
+               ScopedCallback::consume( $totalProfSection );
 
                if ( $isWriteQuery && $this->mTrxLevel ) {
                        $this->mTrxWriteDuration += $queryRuntime;
@@ -1250,6 +1214,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param string|array $options The query options. See DatabaseBase::select() for details.
         *
         * @return bool|mixed The value from the field, or false on failure.
+        * @throws DBUnexpectedError
         */
        public function selectField(
                $table, $var, $cond = '', $fname = __METHOD__, $options = array()
@@ -1347,9 +1312,9 @@ abstract class DatabaseBase implements IDatabase {
                $preLimitTail .= $this->makeOrderBy( $options );
 
                // if (isset($options['LIMIT'])) {
-               //      $tailOpts .= $this->limitResult('', $options['LIMIT'],
-               //              isset($options['OFFSET']) ? $options['OFFSET']
-               //              : false);
+               //      $tailOpts .= $this->limitResult('', $options['LIMIT'],
+               //              isset($options['OFFSET']) ? $options['OFFSET']
+               //              : false);
                // }
 
                if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
@@ -1773,7 +1738,7 @@ abstract class DatabaseBase implements IDatabase {
         *
         * @return string
         */
-       static function generalizeSQL( $sql ) {
+       protected static function generalizeSQL( $sql ) {
                # This does the same as the regexp below would do, but in such a way
                # as to avoid crashing php on some large strings.
                # $sql = preg_replace( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql );
@@ -2437,7 +2402,7 @@ abstract class DatabaseBase implements IDatabase {
                if ( !$alias || (string)$alias === (string)$name ) {
                        return $name;
                } else {
-                       return $name . ' AS ' . $alias; //PostgreSQL needs AS
+                       return $name . ' AS ' . $alias; // PostgreSQL needs AS
                }
        }
 
@@ -3211,11 +3176,6 @@ abstract class DatabaseBase implements IDatabase {
                $args = func_get_args();
                $function = array_shift( $args );
                $tries = self::DEADLOCK_TRIES;
-               if ( is_array( $function ) ) {
-                       $fname = $function[0];
-               } else {
-                       $fname = $function;
-               }
 
                $this->begin( __METHOD__ );
 
@@ -3417,7 +3377,7 @@ abstract class DatabaseBase implements IDatabase {
                        }
                }
 
-               $this->mTrxAtomicLevels->push( $fname );
+               $this->mTrxAtomicLevels[] = $fname;
        }
 
        /**
@@ -3435,13 +3395,13 @@ abstract class DatabaseBase implements IDatabase {
                if ( !$this->mTrxLevel ) {
                        throw new DBUnexpectedError( $this, 'No atomic transaction is open.' );
                }
-               if ( $this->mTrxAtomicLevels->isEmpty() ||
-                       $this->mTrxAtomicLevels->pop() !== $fname
+               if ( !$this->mTrxAtomicLevels ||
+                       array_pop( $this->mTrxAtomicLevels ) !== $fname
                ) {
                        throw new DBUnexpectedError( $this, 'Invalid atomic section ended.' );
                }
 
-               if ( $this->mTrxAtomicLevels->isEmpty() && $this->mTrxAutomaticAtomic ) {
+               if ( !$this->mTrxAtomicLevels && $this->mTrxAutomaticAtomic ) {
                        $this->commit( $fname, 'flush' );
                }
        }
@@ -3462,10 +3422,8 @@ abstract class DatabaseBase implements IDatabase {
         * @throws DBError
         */
        final public function begin( $fname = __METHOD__ ) {
-               global $wgDebugDBTransactions;
-
                if ( $this->mTrxLevel ) { // implicit commit
-                       if ( !$this->mTrxAtomicLevels->isEmpty() ) {
+                       if ( $this->mTrxAtomicLevels ) {
                                // If the current transaction was an automatic atomic one, then we definitely have
                                // a problem. Same if there is any unclosed atomic level.
                                throw new DBUnexpectedError( $this,
@@ -3484,9 +3442,8 @@ abstract class DatabaseBase implements IDatabase {
                                        ) )
                                );
                        } else {
-                               // if the transaction was automatic and has done write operations,
-                               // log it if $wgDebugDBTransactions is enabled.
-                               if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
+                               // if the transaction was automatic and has done write operations
+                               if ( $this->mTrxDoneWrites ) {
                                        wfDebug( "$fname: Automatic transaction with writes in progress" .
                                                " (from {$this->mTrxFname}), performing implicit commit!\n"
                                        );
@@ -3513,11 +3470,16 @@ abstract class DatabaseBase implements IDatabase {
                $this->mTrxDoneWrites = false;
                $this->mTrxAutomatic = false;
                $this->mTrxAutomaticAtomic = false;
-               $this->mTrxAtomicLevels = new SplStack;
+               $this->mTrxAtomicLevels = array();
                $this->mTrxIdleCallbacks = array();
                $this->mTrxPreCommitCallbacks = array();
                $this->mTrxShortId = wfRandomString( 12 );
                $this->mTrxWriteDuration = 0.0;
+               // First SELECT after BEGIN will establish the snapshot in REPEATABLE-READ.
+               // Get an estimate of the slave lag before then, treating estimate staleness
+               // as lag itself just to be safe
+               $status = $this->getApproximateLagStatus();
+               $this->mTrxSlaveLag = $status['lag'] + ( microtime( true ) - $status['since'] );
        }
 
        /**
@@ -3546,7 +3508,7 @@ abstract class DatabaseBase implements IDatabase {
         * @throws DBUnexpectedError
         */
        final public function commit( $fname = __METHOD__, $flush = '' ) {
-               if ( !$this->mTrxAtomicLevels->isEmpty() ) {
+               if ( $this->mTrxLevel && $this->mTrxAtomicLevels ) {
                        // There are still atomic sections open. This cannot be ignored
                        throw new DBUnexpectedError(
                                $this,
@@ -3632,7 +3594,7 @@ abstract class DatabaseBase implements IDatabase {
                $this->doRollback( $fname );
                $this->mTrxIdleCallbacks = array(); // cancel
                $this->mTrxPreCommitCallbacks = array(); // cancel
-               $this->mTrxAtomicLevels = new SplStack;
+               $this->mTrxAtomicLevels = array();
                if ( $this->mTrxDoneWrites ) {
                        $this->getTransactionProfiler()->transactionWritingOut(
                                $this->mServer, $this->mDBname, $this->mTrxShortId );
@@ -3766,14 +3728,13 @@ abstract class DatabaseBase implements IDatabase {
         * Once upon a time, DatabaseBase::query() returned a bare MySQL result
         * resource, and it was necessary to call this function to convert it to
         * a wrapper. Nowadays, raw database objects are never exposed to external
-        * callers, so this is unnecessary in external code. For compatibility with
-        * old code, ResultWrapper objects are passed through unaltered.
+        * callers, so this is unnecessary in external code.
         *
-        * @param bool|ResultWrapper|resource $result
+        * @param bool|ResultWrapper|resource|object $result
         * @return bool|ResultWrapper
         */
-       public function resultObject( $result ) {
-               if ( empty( $result ) ) {
+       protected function resultObject( $result ) {
+               if ( !$result ) {
                        return false;
                } elseif ( $result instanceof ResultWrapper ) {
                        return $result;
@@ -3795,6 +3756,80 @@ 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();
+       }
+
+       /**
+        * Get the slave lag when the current transaction started
+        *
+        * 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. This returns null if there is no transaction.
+        *
+        * @return array|null ('lag': seconds, 'since': UNIX timestamp of BEGIN)
+        * @since 1.27
+        */
+       public function getTransactionLagStatus() {
+               return $this->mTrxLevel
+                       ? array( 'lag' => $this->mTrxSlaveLag, 'since' => $this->trxTimestamp() )
+                       : null;
+       }
+
+       /**
+        * Get a slave lag estimate for this server
+        *
+        * @return array ('lag': seconds, 'since': UNIX timestamp of estimate)
+        * @since 1.27
+        */
+       public function getApproximateLagStatus() {
+               return array(
+                       'lag'   => $this->getLBInfo( 'slave' ) ? $this->getLag() : 0,
+                       'since' => microtime( true )
+               );
+       }
+
+       /**
+        * Merge the result of getSessionLagStatus() for several DBs
+        * using the most pessimistic values to estimate the lag of
+        * any data derived from them in combination
+        *
+        * This is information is useful for caching modules
+        *
+        * @see WANObjectCache::set()
+        * @see WANObjectCache::getWithSetCallback()
+        *
+        * @param IDatabase $db1
+        * @param IDatabase ...
+        * @return array ('lag': highest lag, 'since': lowest estimate UNIX timestamp)
+        * @since 1.27
+        */
+       public static function getCacheSetOptions( IDatabase $db1 ) {
+               $res = array( 'lag' => 0, 'since' => INF );
+               foreach ( func_get_args() as $db ) {
+                       /** @var IDatabase $db */
+                       $status = $db->getSessionLagStatus();
+                       $res['lag'] = max( $res['lag'], $status['lag'] );
+                       $res['since'] = min( $res['since'], $status['since'] );
+               }
+
+               return $res;
+       }
+
        /**
         * Get slave lag. Currently supported only by MySQL.
         *
@@ -4271,3 +4306,11 @@ abstract class DatabaseBase implements IDatabase {
                }
        }
 }
+
+/**
+ * @since 1.27
+ */
+abstract class Database extends DatabaseBase {
+       // B/C until nothing type hints for DatabaseBase
+       // @TODO: finish renaming DatabaseBase => Database
+}
index 85f1b96..5acbc6c 100644 (file)
@@ -28,7 +28,7 @@
 /**
  * @ingroup Database
  */
-class DatabaseMssql extends DatabaseBase {
+class DatabaseMssql extends Database {
        protected $mInsertId = null;
        protected $mLastResult = null;
        protected $mAffectedRows = null;
@@ -145,8 +145,8 @@ class DatabaseMssql extends DatabaseBase {
         * @param bool|MssqlResultWrapper|resource $result
         * @return bool|MssqlResultWrapper
         */
-       public function resultObject( $result ) {
-               if ( empty( $result ) ) {
+       protected function resultObject( $result ) {
+               if ( !$result ) {
                        return false;
                } elseif ( $result instanceof MssqlResultWrapper ) {
                        return $result;
index be34242..907cdbf 100644 (file)
  * @since 1.22
  * @see Database
  */
-abstract class DatabaseMysqlBase extends DatabaseBase {
+abstract class DatabaseMysqlBase extends Database {
        /** @var MysqlMasterPos */
        protected $lastKnownSlavePos;
-
-       /** @var null|int */
-       protected $mFakeSlaveLag = null;
-
-       protected $mFakeMaster = false;
+       /** @var string Method to detect slave lag */
+       protected $lagDetectionMethod;
 
        /** @var string|null */
        private $serverVersion = null;
 
+       /**
+        * Additional $params include:
+        *   - lagDetectionMethod : set to one of (Seconds_Behind_Master,pt-heartbeat).
+        *                          pt-heartbeat assumes the table is at heartbeat.heartbeat
+        *                          and uses UTC timestamps in the heartbeat.ts column.
+        *                          (https://www.percona.com/doc/percona-toolkit/2.2/pt-heartbeat.html)
+        * @param array $params
+        */
+       function __construct( array $params ) {
+               parent::__construct( $params );
+
+               $this->lagDetectionMethod = isset( $params['lagDetectionMethod'] )
+                       ? $params['lagDetectionMethod']
+                       : 'Seconds_Behind_Master';
+       }
+
        /**
         * @return string
         */
@@ -138,7 +151,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
                if ( $set ) {
                        // Use doQuery() to avoid opening implicit transactions (DBO_TRX)
-                       $success = $this->doQuery( 'SET ' . implode( ', ', $set ), __METHOD__ );
+                       $success = $this->doQuery( 'SET ' . implode( ', ', $set ) );
                        if ( !$success ) {
                                wfLogDBError(
                                        'Error setting MySQL variables on server {db_server} (check $wgSQLMode)',
@@ -302,7 +315,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                // We are not checking for any errors here, since
                // these are no errors mysql_num_rows can cause.
                // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-               // See https://bugzilla.wikimedia.org/42430
+               // See https://phabricator.wikimedia.org/T44430
                return $n;
        }
 
@@ -554,6 +567,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                return $sQuoted;
        }
 
+       /**
+        * @param string $s
+        * @return mixed
+        */
+       abstract protected function mysqlRealEscapeString( $s );
+
        /**
         * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
         *
@@ -601,24 +620,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         */
        abstract protected function mysqlPing();
 
-       /**
-        * Set lag time in seconds for a fake slave
-        *
-        * @param int $lag
-        */
-       public function setFakeSlaveLag( $lag ) {
-               $this->mFakeSlaveLag = $lag;
-       }
-
-       /**
-        * Make this connection a fake master
-        *
-        * @param bool $enabled
-        */
-       public function setFakeMaster( $enabled = true ) {
-               $this->mFakeMaster = $enabled;
-       }
-
        /**
         * Returns slave lag.
         *
@@ -627,32 +628,73 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return int
         */
        function getLag() {
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
-
-                       return $this->mFakeSlaveLag;
+               if ( $this->lagDetectionMethod === 'pt-heartbeat' ) {
+                       return $this->getLagFromPtHeartbeat();
+               } else {
+                       return $this->getLagFromSlaveStatus();
                }
-
-               return $this->getLagFromSlaveStatus();
        }
 
        /**
         * @return bool|int
         */
-       function getLagFromSlaveStatus() {
+       protected function getLagFromSlaveStatus() {
                $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
-               if ( !$res ) {
-                       return false;
+               $row = $res ? $res->fetchObject() : false;
+               if ( $row && strval( $row->Seconds_Behind_Master ) !== '' ) {
+                       return intval( $row->Seconds_Behind_Master );
                }
-               $row = $res->fetchObject();
-               if ( !$row ) {
-                       return false;
+
+               return false;
+       }
+
+       /**
+        * @return bool|float
+        */
+       protected function getLagFromPtHeartbeat() {
+               $key = wfMemcKey( 'mysql', 'master-server-id', $this->getServer() );
+               $masterId = intval( $this->srvCache->get( $key ) );
+               if ( !$masterId ) {
+                       $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
+                       $row = $res ? $res->fetchObject() : false;
+                       if ( $row && strval( $row->Master_Server_Id ) !== '' ) {
+                               $masterId = intval( $row->Master_Server_Id );
+                               $this->srvCache->set( $key, $masterId, 30 );
+                       }
                }
-               if ( strval( $row->Seconds_Behind_Master ) === '' ) {
+
+               if ( !$masterId ) {
                        return false;
-               } else {
-                       return intval( $row->Seconds_Behind_Master );
                }
+
+               $res = $this->query(
+                       "SELECT TIMESTAMPDIFF(MICROSECOND,ts,UTC_TIMESTAMP(6)) AS Lag " .
+                       "FROM heartbeat.heartbeat WHERE server_id = $masterId"
+               );
+               $row = $res ? $res->fetchObject() : false;
+               if ( $row ) {
+                       return max( floatval( $row->Lag ) / 1e6, 0.0 );
+               }
+
+               return false;
+       }
+
+       public function getApproximateLagStatus() {
+               if ( $this->lagDetectionMethod === 'pt-heartbeat' ) {
+                       // Disable caching since this is fast enough and we don't wan't
+                       // to be *too* pessimistic by having both the cache TTL and the
+                       // pt-heartbeat interval count as lag in getSessionLagStatus()
+                       return parent::getApproximateLagStatus();
+               }
+
+               $key = wfGlobalCacheKey( 'mysql-lag', $this->getServer() );
+               $approxLag = $this->srvCache->get( $key );
+               if ( !$approxLag ) {
+                       $approxLag = parent::getApproximateLagStatus();
+                       $this->srvCache->set( $key, $approxLag, 1 );
+               }
+
+               return $approxLag;
        }
 
        /**
@@ -673,25 +715,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                # Commit any open transactions
                $this->commit( __METHOD__, 'flush' );
 
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       $wait = intval( ( $pos->pos - microtime( true ) + $this->mFakeSlaveLag ) * 1e6 );
-
-                       if ( $wait > $timeout * 1e6 ) {
-                               wfDebug( "Fake slave timed out waiting for $pos ($wait us)\n" );
-
-                               return -1;
-                       } elseif ( $wait > 0 ) {
-                               wfDebug( "Fake slave waiting $wait us\n" );
-                               usleep( $wait );
-
-                               return 1;
-                       } else {
-                               wfDebug( "Fake slave up to date ($wait us)\n" );
-
-                               return 0;
-                       }
-               }
-
                # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
                $encFile = $this->addQuotes( $pos->file );
                $encPos = intval( $pos->pos );
@@ -715,13 +738,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return MySQLMasterPos|bool
         */
        function getSlavePos() {
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       $pos = new MySQLMasterPos( 'fake', microtime( true ) - $this->mFakeSlaveLag );
-                       wfDebug( __METHOD__ . ": fake slave pos = $pos\n" );
-
-                       return $pos;
-               }
-
                $res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
                $row = $this->fetchObject( $res );
 
@@ -742,10 +758,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return MySQLMasterPos|bool
         */
        function getMasterPos() {
-               if ( $this->mFakeMaster ) {
-                       return new MySQLMasterPos( 'fake', microtime( true ) );
-               }
-
                $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
                $row = $this->fetchObject( $res );
 
@@ -940,7 +952,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                                $value = $this->mDefaultBigSelects;
                        }
                } elseif ( $this->mDefaultBigSelects === null ) {
-                       $this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects', '', __METHOD__ );
+                       $this->mDefaultBigSelects =
+                               (bool)$this->selectField( false, '@@sql_big_selects', '', __METHOD__ );
                }
                $encValue = $value ? '1' : '0';
                $this->query( "SET sql_big_selects=$encValue", __METHOD__ );
@@ -1256,7 +1269,7 @@ class MySQLField implements Field {
         * @return string
         */
        function tableName() {
-               return $this->tableName;
+               return $this->tablename;
        }
 
        /**
index 87c3164..66004ec 100644 (file)
@@ -185,7 +185,7 @@ class ORAField implements Field {
 /**
  * @ingroup Database
  */
-class DatabaseOracle extends DatabaseBase {
+class DatabaseOracle extends Database {
        /** @var resource */
        protected $mLastResult = null;
 
@@ -335,7 +335,7 @@ class DatabaseOracle extends DatabaseBase {
                MediaWiki\restoreWarnings();
 
                if ( $this->mUser != $this->mDBname ) {
-                       //change current schema in session
+                       // change current schema in session
                        $this->selectDB( $this->mDBname );
                }
 
@@ -982,7 +982,7 @@ class DatabaseOracle extends DatabaseBase {
         * @return string Version information from the database
         */
        function getServerVersion() {
-               //better version number, fallback on driver
+               // better version number, fallback on driver
                $rset = $this->doQuery(
                        'SELECT version FROM product_component_version ' .
                                'WHERE UPPER(product) LIKE \'ORACLE DATABASE%\''
index 56a5b2c..c9d7b35 100644 (file)
@@ -128,89 +128,6 @@ SQL;
        }
 }
 
-/**
- * Used to debug transaction processing
- * Only used if $wgDebugDBTransactions is true
- *
- * @since 1.19
- * @ingroup Database
- */
-class PostgresTransactionState {
-       private static $WATCHED = array(
-               array(
-                       "desc" => "%s: Connection state changed from %s -> %s\n",
-                       "states" => array(
-                               PGSQL_CONNECTION_OK => "OK",
-                               PGSQL_CONNECTION_BAD => "BAD"
-                       )
-               ),
-               array(
-                       "desc" => "%s: Transaction state changed from %s -> %s\n",
-                       "states" => array(
-                               PGSQL_TRANSACTION_IDLE => "IDLE",
-                               PGSQL_TRANSACTION_ACTIVE => "ACTIVE",
-                               PGSQL_TRANSACTION_INTRANS => "TRANS",
-                               PGSQL_TRANSACTION_INERROR => "ERROR",
-                               PGSQL_TRANSACTION_UNKNOWN => "UNKNOWN"
-                       )
-               )
-       );
-
-       /** @var array */
-       private $mNewState;
-
-       /** @var array */
-       private $mCurrentState;
-
-       public function __construct( $conn ) {
-               $this->mConn = $conn;
-               $this->update();
-               $this->mCurrentState = $this->mNewState;
-       }
-
-       public function update() {
-               $this->mNewState = array(
-                       pg_connection_status( $this->mConn ),
-                       pg_transaction_status( $this->mConn )
-               );
-       }
-
-       public function check() {
-               global $wgDebugDBTransactions;
-               $this->update();
-               if ( $wgDebugDBTransactions ) {
-                       if ( $this->mCurrentState !== $this->mNewState ) {
-                               $old = reset( $this->mCurrentState );
-                               $new = reset( $this->mNewState );
-                               foreach ( self::$WATCHED as $watched ) {
-                                       if ( $old !== $new ) {
-                                               $this->log_changed( $old, $new, $watched );
-                                       }
-                                       $old = next( $this->mCurrentState );
-                                       $new = next( $this->mNewState );
-                               }
-                       }
-               }
-               $this->mCurrentState = $this->mNewState;
-       }
-
-       protected function describe_changed( $status, $desc_table ) {
-               if ( isset( $desc_table[$status] ) ) {
-                       return $desc_table[$status];
-               } else {
-                       return "STATUS " . $status;
-               }
-       }
-
-       protected function log_changed( $old, $new, $watched ) {
-               wfDebug( sprintf( $watched["desc"],
-                       $this->mConn,
-                       $this->describe_changed( $old, $watched["states"] ),
-                       $this->describe_changed( $new, $watched["states"] )
-               ) );
-       }
-}
-
 /**
  * Manage savepoints within a transaction
  * @ingroup Database
@@ -252,11 +169,7 @@ class SavepointPostgres {
        }
 
        protected function query( $keyword, $msg_ok, $msg_failed ) {
-               global $wgDebugDBTransactions;
                if ( $this->dbw->doQuery( $keyword . " " . $this->id ) !== false ) {
-                       if ( $wgDebugDBTransactions ) {
-                               wfDebug( sprintf( $msg_ok, $this->id ) );
-                       }
                } else {
                        wfDebug( sprintf( $msg_failed, $this->id ) );
                }
@@ -291,7 +204,7 @@ class SavepointPostgres {
 /**
  * @ingroup Database
  */
-class DatabasePostgres extends DatabaseBase {
+class DatabasePostgres extends Database {
        /** @var resource */
        protected $mLastResult = null;
 
@@ -307,9 +220,6 @@ class DatabasePostgres extends DatabaseBase {
        /** @var string Connect string to open a PostgreSQL connection */
        private $connectString;
 
-       /** @var PostgresTransactionState */
-       private $mTransactionState;
-
        /** @var string */
        private $mCoreSchema;
 
@@ -428,7 +338,6 @@ class DatabasePostgres extends DatabaseBase {
                }
 
                $this->mOpened = true;
-               $this->mTransactionState = new PostgresTransactionState( $this->mConn );
 
                global $wgCommandLineMode;
                # If called from the command-line (e.g. importDump), only show errors
@@ -486,12 +395,10 @@ class DatabasePostgres extends DatabaseBase {
                if ( function_exists( 'mb_convert_encoding' ) ) {
                        $sql = mb_convert_encoding( $sql, 'UTF-8' );
                }
-               $this->mTransactionState->check();
                if ( pg_send_query( $this->mConn, $sql ) === false ) {
                        throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" );
                }
                $this->mLastResult = pg_get_result( $this->mConn );
-               $this->mTransactionState->check();
                $this->mAffectedRows = null;
                if ( pg_result_error( $this->mLastResult ) ) {
                        return false;
@@ -1581,11 +1488,11 @@ SQL;
 
                $preLimitTail .= $this->makeOrderBy( $options );
 
-               //if ( isset( $options['LIMIT'] ) ) {
-               //      $tailOpts .= $this->limitResult( '', $options['LIMIT'],
-               //              isset( $options['OFFSET'] ) ? $options['OFFSET']
-               //              : false );
-               //}
+               // if ( isset( $options['LIMIT'] ) ) {
+               //      $tailOpts .= $this->limitResult( '', $options['LIMIT'],
+               //              isset( $options['OFFSET'] ) ? $options['OFFSET']
+               //              : false );
+               // }
 
                if ( isset( $options['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE OF ' .
index 656547b..bb3028d 100644 (file)
@@ -25,7 +25,7 @@
 /**
  * @ingroup Database
  */
-class DatabaseSqlite extends DatabaseBase {
+class DatabaseSqlite extends Database {
        /** @var bool Whether full text is enabled */
        private static $fulltextEnabled = null;
 
@@ -799,15 +799,21 @@ class DatabaseSqlite extends DatabaseBase {
                        return (int)$s;
                } elseif ( strpos( $s, "\0" ) !== false ) {
                        // SQLite doesn't support \0 in strings, so use the hex representation as a workaround.
-                       // This is a known limitation of SQLite's mprintf function which PDO should work around,
-                       // but doesn't. I have reported this to php.net as bug #63419:
+                       // This is a known limitation of SQLite's mprintf function which PDO
+                       // should work around, but doesn't. I have reported this to php.net as bug #63419:
                        // https://bugs.php.net/bug.php?id=63419
                        // There was already a similar report for SQLite3::escapeString, bug #62361:
                        // https://bugs.php.net/bug.php?id=62361
                        // There is an additional bug regarding sorting this data after insert
                        // on older versions of sqlite shipped with ubuntu 12.04
-                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=72367
-                       wfDebugLog( __CLASS__, __FUNCTION__ . ': Quoting value containing null byte. For consistency all binary data should have been first processed with self::encodeBlob()' );
+                       // https://phabricator.wikimedia.org/T74367
+                       wfDebugLog(
+                               __CLASS__,
+                               __FUNCTION__ .
+                                       ': Quoting value containing null byte. ' .
+                                       'For consistency all binary data should have been ' .
+                                       'first processed with self::encodeBlob()'
+                       );
                        return "x'" . bin2hex( $s ) . "'";
                } else {
                        return $this->mConn->quote( $s );
@@ -985,7 +991,7 @@ class DatabaseSqlite extends DatabaseBase {
                        $indexInfo = $this->query( 'PRAGMA INDEX_INFO(' . $this->addQuotes( $index->name ) . ')' );
                        $fields = array();
                        foreach ( $indexInfo as $indexInfoRow ) {
-                               $fields[ $indexInfoRow->seqno ] = $indexInfoRow->name;
+                               $fields[$indexInfoRow->seqno] = $indexInfoRow->name;
                        }
 
                        $sql .= '(' . implode( ',', $fields ) . ')';
@@ -1026,6 +1032,14 @@ class DatabaseSqlite extends DatabaseBase {
 
                return $endArray;
        }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               return 'SQLite ' . (string)$this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION );
+       }
+
 } // end DatabaseSqlite class
 
 /**
index 49d0514..51c4bfe 100644 (file)
@@ -29,7 +29,7 @@
  * Basic database interface for live and lazy-loaded DB handles
  *
  * @todo: loosen up DB classes from MWException
- * @note: DatabaseBase and DBConnRef should be updated to reflect any changes
+ * @note: IDatabase and DBConnRef should be updated to reflect any changes
  * @ingroup Database
  */
 interface IDatabase {
@@ -137,7 +137,7 @@ interface IDatabase {
        public function implicitOrderby();
 
        /**
-        * Return the last query that went through DatabaseBase::query()
+        * Return the last query that went through IDatabase::query()
         * @return string
         */
        public function lastQuery();
@@ -259,7 +259,7 @@ interface IDatabase {
         * member variables.
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
+        * @param ResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
         * @return stdClass|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -270,7 +270,7 @@ interface IDatabase {
         * form. Fields are retrieved with $row['fieldname'].
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
+        * @param ResultWrapper $res Result object as returned from IDatabase::query(), etc.
         * @return array|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -448,12 +448,12 @@ interface IDatabase {
         *
         * If no result rows are returned from the query, false is returned.
         *
-        * @param string|array $table Table name. See DatabaseBase::select() for details.
+        * @param string|array $table Table name. See IDatabase::select() for details.
         * @param string $var The field name to select. This must be a valid SQL
         *   fragment: do not use unvalidated user input.
-        * @param string|array $cond The condition array. See DatabaseBase::select() for details.
+        * @param string|array $cond The condition array. See IDatabase::select() for details.
         * @param string $fname The function name of the caller.
-        * @param string|array $options The query options. See DatabaseBase::select() for details.
+        * @param string|array $options The query options. See IDatabase::select() for details.
         *
         * @return bool|mixed The value from the field, or false on failure.
         */
@@ -469,12 +469,12 @@ interface IDatabase {
         *
         * If no result rows are returned from the query, false is returned.
         *
-        * @param string|array $table Table name. See DatabaseBase::select() for details.
+        * @param string|array $table Table name. See IDatabase::select() for details.
         * @param string $var The field name to select. This must be a valid SQL
         *   fragment: do not use unvalidated user input.
-        * @param string|array $cond The condition array. See DatabaseBase::select() for details.
+        * @param string|array $cond The condition array. See IDatabase::select() for details.
         * @param string $fname The function name of the caller.
-        * @param string|array $options The query options. See DatabaseBase::select() for details.
+        * @param string|array $options The query options. See IDatabase::select() for details.
         *
         * @return bool|array The values from the field, or false on failure
         * @since 1.25
@@ -506,7 +506,7 @@ interface IDatabase {
         * for use in field names (e.g. a.user_name).
         *
         * All of the table names given here are automatically run through
-        * DatabaseBase::tableName(), which causes the table prefix (if any) to be
+        * IDatabase::tableName(), which causes the table prefix (if any) to be
         * added, and various other table name mappings to be performed.
         *
         *
@@ -546,8 +546,8 @@ interface IDatabase {
         * Note that expressions are often DBMS-dependent in their syntax.
         * DBMS-independent wrappers are provided for constructing several types of
         * expression commonly used in condition queries. See:
-        *    - DatabaseBase::buildLike()
-        *    - DatabaseBase::conditional()
+        *    - IDatabase::buildLike()
+        *    - IDatabase::conditional()
         *
         *
         * @param string|array $options
@@ -630,7 +630,7 @@ interface IDatabase {
        );
 
        /**
-        * The equivalent of DatabaseBase::select() except that the constructed SQL
+        * The equivalent of IDatabase::select() except that the constructed SQL
         * is returned, instead of being immediately executed. This can be useful for
         * doing UNION queries, where the SQL text of each query is needed. In general,
         * however, callers outside of Database classes should just use select().
@@ -643,7 +643,7 @@ interface IDatabase {
         * @param string|array $join_conds Join conditions
         *
         * @return string SQL query string.
-        * @see DatabaseBase::select()
+        * @see IDatabase::select()
         */
        public function selectSQLText(
                $table, $vars, $conds = '', $fname = __METHOD__,
@@ -651,7 +651,7 @@ interface IDatabase {
        );
 
        /**
-        * Single row SELECT wrapper. Equivalent to DatabaseBase::select(), except
+        * Single row SELECT wrapper. Equivalent to IDatabase::select(), except
         * that a single row object is returned. If the query returns no rows,
         * false is returned.
         *
@@ -679,7 +679,7 @@ interface IDatabase {
         * For DBMSs that don't support fast result size estimation, this function
         * will actually perform the SELECT COUNT(*).
         *
-        * Takes the same arguments as DatabaseBase::select().
+        * Takes the same arguments as IDatabase::select().
         *
         * @param string $table Table name
         * @param string $vars Unused
@@ -697,7 +697,7 @@ interface IDatabase {
         *
         * This is useful when trying to do COUNT(*) but with a LIMIT for performance.
         *
-        * Takes the same arguments as DatabaseBase::select().
+        * Takes the same arguments as IDatabase::select().
         *
         * @param string $table Table name
         * @param string $vars Unused
@@ -770,15 +770,15 @@ interface IDatabase {
         *
         * $options is an array of options, with boolean options encoded as values
         * with numeric keys, in the same style as $options in
-        * DatabaseBase::select(). Supported options are:
+        * IDatabase::select(). Supported options are:
         *
         *   - IGNORE: Boolean: if present, duplicate key errors are ignored, and
         *     any rows which cause duplicate key errors are not inserted. It's
         *     possible to determine how many rows were successfully inserted using
-        *     DatabaseBase::affectedRows().
+        *     IDatabase::affectedRows().
         *
         * @param string $table Table name. This will be passed through
-        *   DatabaseBase::tableName().
+        *   IDatabase::tableName().
         * @param array $a Array of rows to insert
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @param array $options Array of options
@@ -791,12 +791,12 @@ interface IDatabase {
         * UPDATE wrapper. Takes a condition array and a SET array.
         *
         * @param string $table Name of the table to UPDATE. This will be passed through
-        *   DatabaseBase::tableName().
+        *   IDatabase::tableName().
         * @param array $values An array of values to SET. For each array element,
         *   the key gives the field name, and the value gives the data to set
-        *   that field to. The data will be quoted by DatabaseBase::addQuotes().
+        *   that field to. The data will be quoted by IDatabase::addQuotes().
         * @param array $conds An array of conditions (WHERE). See
-        *   DatabaseBase::select() for the details of the format of condition
+        *   IDatabase::select() for the details of the format of condition
         *   arrays. Use '*' to update all rows.
         * @param string $fname The function name of the caller (from __METHOD__),
         *   for logging and profiling.
@@ -814,7 +814,7 @@ interface IDatabase {
         * @param int $mode Constant
         *    - LIST_COMMA: Comma separated, no field names
         *    - LIST_AND:   ANDed WHERE clause (without the WHERE). See the
-        *      documentation for $conds in DatabaseBase::select().
+        *      documentation for $conds in IDatabase::select().
         *    - LIST_OR:    ORed WHERE clause (without the WHERE)
         *    - LIST_SET:   Comma separated with field names, like a SET clause
         *    - LIST_NAMES: Comma separated field names
@@ -975,7 +975,7 @@ interface IDatabase {
         * @param array $uniqueIndexes Is an array of indexes. Each element may be either
         *    a field name or an array of field names
         * @param array $rows Can be either a single row to insert, or multiple rows,
-        *    in the same format as for DatabaseBase::insert()
+        *    in the same format as for IDatabase::insert()
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         */
        public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ );
@@ -1004,12 +1004,12 @@ interface IDatabase {
         *
         * @since 1.22
         *
-        * @param string $table Table name. This will be passed through DatabaseBase::tableName().
+        * @param string $table Table name. This will be passed through IDatabase::tableName().
         * @param array $rows A single row or list of rows to insert
         * @param array $uniqueIndexes List of single field names or field name tuples
         * @param array $set An array of values to SET. For each array element, the
         *   key gives the field name, and the value gives the data to set that
-        *   field to. The data will be quoted by DatabaseBase::addQuotes().
+        *   field to. The data will be quoted by IDatabase::addQuotes().
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @throws Exception
         * @return bool
@@ -1046,7 +1046,7 @@ interface IDatabase {
         * DELETE query wrapper.
         *
         * @param array $table Table name
-        * @param string|array $conds Array of conditions. See $conds in DatabaseBase::select()
+        * @param string|array $conds Array of conditions. See $conds in IDatabase::select()
         *   for the format. Use $conds == "*" to delete all rows
         * @param string $fname Name of the calling function
         * @throws DBUnexpectedError
@@ -1065,18 +1065,18 @@ interface IDatabase {
         * @param array $varMap Must be an associative array of the form
         *    array( 'dest1' => 'source1', ...). Source items may be literals
         *    rather than field names, but strings should be quoted with
-        *    DatabaseBase::addQuotes()
+        *    IDatabase::addQuotes()
         *
-        * @param array $conds Condition array. See $conds in DatabaseBase::select() for
+        * @param array $conds Condition array. See $conds in IDatabase::select() for
         *    the details of the format of condition arrays. May be "*" to copy the
         *    whole table.
         *
         * @param string $fname The function name of the caller, from __METHOD__
         *
         * @param array $insertOptions Options for the INSERT part of the query, see
-        *    DatabaseBase::insert() for details.
+        *    IDatabase::insert() for details.
         * @param array $selectOptions Options for the SELECT part of the query, see
-        *    DatabaseBase::select() for details.
+        *    IDatabase::select() for details.
         *
         * @return ResultWrapper
         */
@@ -1236,7 +1236,7 @@ interface IDatabase {
         * Atomic sections are more strict than transactions. With transactions,
         * attempting to begin a new transaction when one is already running results
         * in MediaWiki issuing a brief warning and doing an implicit commit. All
-        * atomic levels *must* be explicitly closed using DatabaseBase::endAtomic(),
+        * atomic levels *must* be explicitly closed using IDatabase::endAtomic(),
         * and any database transactions cannot be began or committed until all atomic
         * levels are closed. There is no such thing as implicitly opening or closing
         * an atomic section.
@@ -1254,7 +1254,7 @@ interface IDatabase {
         * if necessary.
         *
         * @since 1.23
-        * @see DatabaseBase::startAtomic
+        * @see IDatabase::startAtomic
         * @param string $fname
         * @throws DBError
         */
@@ -1347,22 +1347,6 @@ interface IDatabase {
         */
        public function timestampOrNull( $ts = null );
 
-       /**
-        * Take the result from a query, and wrap it in a ResultWrapper if
-        * necessary. Boolean values are passed through as is, to indicate success
-        * of write queries or failure.
-        *
-        * Once upon a time, DatabaseBase::query() returned a bare MySQL result
-        * resource, and it was necessary to call this function to convert it to
-        * a wrapper. Nowadays, raw database objects are never exposed to external
-        * callers, so this is unnecessary in external code. For compatibility with
-        * old code, ResultWrapper objects are passed through unaltered.
-        *
-        * @param bool|ResultWrapper|resource $result
-        * @return bool|ResultWrapper
-        */
-       public function resultObject( $result );
-
        /**
         * Ping the server and try to reconnect if it there is no connection
         *
@@ -1381,6 +1365,21 @@ interface IDatabase {
         */
        public function getLag();
 
+       /**
+        * 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 the maximum number of items allowed in a list, or 0 for unlimited.
         *
@@ -1392,7 +1391,7 @@ interface IDatabase {
         * Some DBMSs have a special format for inserting into blob fields, they
         * don't allow simple quoted strings to be inserted. To insert into such
         * a field, pass the data through this function before passing it to
-        * DatabaseBase::insert().
+        * IDatabase::insert().
         *
         * @param string $b
         * @return string
diff --git a/includes/db/LBFactory.php b/includes/db/LBFactory.php
deleted file mode 100644 (file)
index cf522b2..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-<?php
-/**
- * Generator of database load balancing objects.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-
-/**
- * An interface for generating database load balancers
- * @ingroup Database
- */
-abstract class LBFactory {
-       /** @var LBFactory */
-       private static $instance;
-
-       /**
-        * Disables all access to the load balancer, will cause all database access
-        * to throw a DBAccessError
-        */
-       public static function disableBackend() {
-               global $wgLBFactoryConf;
-               self::$instance = new LBFactoryFake( $wgLBFactoryConf );
-       }
-
-       /**
-        * Get an LBFactory instance
-        *
-        * @return LBFactory
-        */
-       public static function singleton() {
-               global $wgLBFactoryConf;
-
-               if ( is_null( self::$instance ) ) {
-                       $class = self::getLBFactoryClass( $wgLBFactoryConf );
-
-                       self::$instance = new $class( $wgLBFactoryConf );
-               }
-
-               return self::$instance;
-       }
-
-       /**
-        * Returns the LBFactory class to use and the load balancer configuration.
-        *
-        * @param array $config (e.g. $wgLBFactoryConf)
-        * @return string Class name
-        */
-       public static function getLBFactoryClass( array $config ) {
-               // For configuration backward compatibility after removing
-               // underscores from class names in MediaWiki 1.23.
-               $bcClasses = array(
-                       'LBFactory_Simple' => 'LBFactorySimple',
-                       'LBFactory_Single' => 'LBFactorySingle',
-                       'LBFactory_Multi' => 'LBFactoryMulti',
-                       'LBFactory_Fake' => 'LBFactoryFake',
-               );
-
-               $class = $config['class'];
-
-               if ( isset( $bcClasses[$class] ) ) {
-                       $class = $bcClasses[$class];
-                       wfDeprecated(
-                               '$wgLBFactoryConf must be updated. See RELEASE-NOTES for details',
-                               '1.23'
-                       );
-               }
-
-               return $class;
-       }
-
-       /**
-        * Shut down, close connections and destroy the cached instance.
-        */
-       public static function destroyInstance() {
-               if ( self::$instance ) {
-                       self::$instance->shutdown();
-                       self::$instance->forEachLBCallMethod( 'closeAll' );
-                       self::$instance = null;
-               }
-       }
-
-       /**
-        * Set the instance to be the given object
-        *
-        * @param LBFactory $instance
-        */
-       public static function setInstance( $instance ) {
-               self::destroyInstance();
-               self::$instance = $instance;
-       }
-
-       /**
-        * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
-        * @param array $conf
-        */
-       abstract public function __construct( array $conf );
-
-       /**
-        * Create a new load balancer object. The resulting object will be untracked,
-        * not chronology-protected, and the caller is responsible for cleaning it up.
-        *
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       abstract public function newMainLB( $wiki = false );
-
-       /**
-        * Get a cached (tracked) load balancer object.
-        *
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       abstract public function getMainLB( $wiki = false );
-
-       /**
-        * Create a new load balancer for external storage. The resulting object will be
-        * untracked, not chronology-protected, and the caller is responsible for
-        * cleaning it up.
-        *
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       abstract protected function newExternalLB( $cluster, $wiki = false );
-
-       /**
-        * Get a cached (tracked) load balancer for external storage
-        *
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       abstract public function &getExternalLB( $cluster, $wiki = false );
-
-       /**
-        * Execute a function for each tracked load balancer
-        * The callback is called with the load balancer as the first parameter,
-        * and $params passed as the subsequent parameters.
-        *
-        * @param callable $callback
-        * @param array $params
-        */
-       abstract public function forEachLB( $callback, array $params = array() );
-
-       /**
-        * Prepare all tracked load balancers for shutdown
-        * STUB
-        */
-       public function shutdown() {
-       }
-
-       /**
-        * Call a method of each tracked load balancer
-        *
-        * @param string $methodName
-        * @param array $args
-        */
-       private function forEachLBCallMethod( $methodName, array $args = array() ) {
-               $this->forEachLB( function ( LoadBalancer $loadBalancer, $methodName, array $args ) {
-                       call_user_func_array( array( $loadBalancer, $methodName ), $args );
-               }, array( $methodName, $args ) );
-       }
-
-       /**
-        * Commit on all connections. Done for two reasons:
-        * 1. To commit changes to the masters.
-        * 2. To release the snapshot on all connections, master and slave.
-        */
-       public function commitAll() {
-               $this->forEachLBCallMethod( 'commitAll' );
-       }
-
-       /**
-        * Commit changes on all master connections
-        */
-       public function commitMasterChanges() {
-               $this->forEachLBCallMethod( 'commitMasterChanges' );
-       }
-
-       /**
-        * Rollback changes on all master connections
-        * @since 1.23
-        */
-       public function rollbackMasterChanges() {
-               $this->forEachLBCallMethod( 'rollbackMasterChanges' );
-       }
-
-       /**
-        * Detemine if any master connection has pending changes.
-        * @since 1.23
-        * @return bool
-        */
-       public function hasMasterChanges() {
-               $ret = false;
-               $this->forEachLB( function ( LoadBalancer $lb ) use ( &$ret ) {
-                       $ret = $ret || $lb->hasMasterChanges();
-               } );
-               return $ret;
-       }
-}
-
-/**
- * A simple single-master LBFactory that gets its configuration from the b/c globals
- */
-class LBFactorySimple extends LBFactory {
-       /** @var LoadBalancer */
-       private $mainLB;
-
-       /** @var LoadBalancer[] */
-       private $extLBs = array();
-
-       /** @var ChronologyProtector */
-       private $chronProt;
-
-       public function __construct( array $conf ) {
-               $this->chronProt = new ChronologyProtector;
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       public function newMainLB( $wiki = false ) {
-               global $wgDBservers;
-               if ( $wgDBservers ) {
-                       $servers = $wgDBservers;
-               } else {
-                       global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgDebugDumpSql;
-                       global $wgDBssl, $wgDBcompress;
-
-                       $flags = DBO_DEFAULT;
-                       if ( $wgDebugDumpSql ) {
-                               $flags |= DBO_DEBUG;
-                       }
-                       if ( $wgDBssl ) {
-                               $flags |= DBO_SSL;
-                       }
-                       if ( $wgDBcompress ) {
-                               $flags |= DBO_COMPRESS;
-                       }
-
-                       $servers = array( array(
-                               'host' => $wgDBserver,
-                               'user' => $wgDBuser,
-                               'password' => $wgDBpassword,
-                               'dbname' => $wgDBname,
-                               'type' => $wgDBtype,
-                               'load' => 1,
-                               'flags' => $flags
-                       ) );
-               }
-
-               return new LoadBalancer( array(
-                       'servers' => $servers,
-               ) );
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       public function getMainLB( $wiki = false ) {
-               if ( !isset( $this->mainLB ) ) {
-                       $this->mainLB = $this->newMainLB( $wiki );
-                       $this->mainLB->parentInfo( array( 'id' => 'main' ) );
-                       $this->chronProt->initLB( $this->mainLB );
-               }
-
-               return $this->mainLB;
-       }
-
-       /**
-        * @throws MWException
-        * @param string $cluster
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       protected function newExternalLB( $cluster, $wiki = false ) {
-               global $wgExternalServers;
-               if ( !isset( $wgExternalServers[$cluster] ) ) {
-                       throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
-               }
-
-               return new LoadBalancer( array(
-                       'servers' => $wgExternalServers[$cluster]
-               ) );
-       }
-
-       /**
-        * @param string $cluster
-        * @param bool|string $wiki
-        * @return array
-        */
-       public function &getExternalLB( $cluster, $wiki = false ) {
-               if ( !isset( $this->extLBs[$cluster] ) ) {
-                       $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
-                       $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
-                       $this->chronProt->initLB( $this->extLBs[$cluster] );
-               }
-
-               return $this->extLBs[$cluster];
-       }
-
-       /**
-        * Execute a function for each tracked load balancer
-        * The callback is called with the load balancer as the first parameter,
-        * and $params passed as the subsequent parameters.
-        *
-        * @param callable $callback
-        * @param array $params
-        */
-       public function forEachLB( $callback, array $params = array() ) {
-               if ( isset( $this->mainLB ) ) {
-                       call_user_func_array( $callback, array_merge( array( $this->mainLB ), $params ) );
-               }
-               foreach ( $this->extLBs as $lb ) {
-                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
-               }
-       }
-
-       public function shutdown() {
-               if ( $this->mainLB ) {
-                       $this->chronProt->shutdownLB( $this->mainLB );
-               }
-               foreach ( $this->extLBs as $extLB ) {
-                       $this->chronProt->shutdownLB( $extLB );
-               }
-               $this->chronProt->shutdown();
-               $this->commitMasterChanges();
-       }
-}
-
-/**
- * LBFactory class that throws an error on any attempt to use it.
- * This will typically be done via wfGetDB().
- * Call LBFactory::disableBackend() to start using this, and
- * LBFactory::enableBackend() to return to normal behavior
- */
-class LBFactoryFake extends LBFactory {
-       public function __construct( array $conf ) {
-       }
-
-       public function newMainLB( $wiki = false ) {
-               throw new DBAccessError;
-       }
-
-       public function getMainLB( $wiki = false ) {
-               throw new DBAccessError;
-       }
-
-       protected function newExternalLB( $cluster, $wiki = false ) {
-               throw new DBAccessError;
-       }
-
-       public function &getExternalLB( $cluster, $wiki = false ) {
-               throw new DBAccessError;
-       }
-
-       public function forEachLB( $callback, array $params = array() ) {
-       }
-}
-
-/**
- * Exception class for attempted DB access
- */
-class DBAccessError extends MWException {
-       public function __construct() {
-               parent::__construct( "Mediawiki tried to access the database via wfGetDB(). " .
-                       "This is not allowed." );
-       }
-}
diff --git a/includes/db/LBFactoryMulti.php b/includes/db/LBFactoryMulti.php
deleted file mode 100644 (file)
index 92fbccd..0000000
+++ /dev/null
@@ -1,399 +0,0 @@
-<?php
-/**
- * Advanced generator of database load balancing objects for wiki farms.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-
-/**
- * A multi-wiki, multi-master factory for Wikimedia and similar installations.
- * Ignores the old configuration globals
- *
- * Configuration:
- *     sectionsByDB                A map of database names to section names.
- *
- *     sectionLoads                A 2-d map. For each section, gives a map of server names to
- *                                 load ratios. For example:
- *                                 array(
- *                                     'section1' => array(
- *                                         'db1' => 100,
- *                                         'db2' => 100
- *                                     )
- *                                 )
- *
- *     serverTemplate              A server info associative array as documented for $wgDBservers.
- *                                 The host, hostName and load entries will be overridden.
- *
- *     groupLoadsBySection         A 3-d map giving server load ratios for each section and group.
- *                                 For example:
- *                                 array(
- *                                     'section1' => array(
- *                                         'group1' => array(
- *                                             'db1' => 100,
- *                                             'db2' => 100
- *                                         )
- *                                     )
- *                                 )
- *
- *     groupLoadsByDB              A 3-d map giving server load ratios by DB name.
- *
- *     hostsByName                 A map of hostname to IP address.
- *
- *     externalLoads               A map of external storage cluster name to server load map.
- *
- *     externalTemplateOverrides   A set of server info keys overriding serverTemplate for external
- *                                 storage.
- *
- *     templateOverridesByServer   A 2-d map overriding serverTemplate and
- *                                 externalTemplateOverrides on a server-by-server basis. Applies
- *                                 to both core and external storage.
- *
- *     templateOverridesByCluster  A 2-d map overriding the server info by external storage cluster.
- *
- *     masterTemplateOverrides     An override array for all master servers.
- *
- *     readOnlyBySection           A map of section name to read-only message.
- *                                 Missing or false for read/write.
- *
- * @ingroup Database
- */
-class LBFactoryMulti extends LBFactory {
-       // Required settings
-
-       /** @var array A map of database names to section names */
-       private $sectionsByDB;
-
-       /**
-        * @var array A 2-d map. For each section, gives a map of server names to
-        * load ratios
-        */
-       private $sectionLoads;
-
-       /**
-        * @var array A server info associative array as documented for
-        * $wgDBservers. The host, hostName and load entries will be
-        * overridden
-        */
-       private $serverTemplate;
-
-       // Optional settings
-
-       /** @var array A 3-d map giving server load ratios for each section and group */
-       private $groupLoadsBySection = array();
-
-       /** @var array A 3-d map giving server load ratios by DB name */
-       private $groupLoadsByDB = array();
-
-       /** @var array A map of hostname to IP address */
-       private $hostsByName = array();
-
-       /** @var array A map of external storage cluster name to server load map */
-       private $externalLoads = array();
-
-       /**
-        * @var array A set of server info keys overriding serverTemplate for
-        * external storage
-        */
-       private $externalTemplateOverrides;
-
-       /**
-        * @var array A 2-d map overriding serverTemplate and
-        * externalTemplateOverrides on a server-by-server basis. Applies to both
-        * core and external storage
-        */
-       private $templateOverridesByServer;
-
-       /** @var array A 2-d map overriding the server info by external storage cluster */
-       private $templateOverridesByCluster;
-
-       /** @var array An override array for all master servers */
-       private $masterTemplateOverrides;
-
-       /**
-        * @var array|bool A map of section name to read-only message. Missing or
-        * false for read/write
-        */
-       private $readOnlyBySection = array();
-
-       // Other stuff
-
-       /** @var array Load balancer factory configuration */
-       private $conf;
-
-       /** @var LoadBalancer[] */
-       private $mainLBs = array();
-
-       /** @var LoadBalancer[] */
-       private $extLBs = array();
-
-       /** @var string */
-       private $lastWiki;
-
-       /** @var string */
-       private $lastSection;
-
-       /**
-        * @param array $conf
-        * @throws MWException
-        */
-       public function __construct( array $conf ) {
-               $this->chronProt = new ChronologyProtector;
-               $this->conf = $conf;
-               $required = array( 'sectionsByDB', 'sectionLoads', 'serverTemplate' );
-               $optional = array( 'groupLoadsBySection', 'groupLoadsByDB', 'hostsByName',
-                       'externalLoads', 'externalTemplateOverrides', 'templateOverridesByServer',
-                       'templateOverridesByCluster', 'masterTemplateOverrides',
-                       'readOnlyBySection' );
-
-               foreach ( $required as $key ) {
-                       if ( !isset( $conf[$key] ) ) {
-                               throw new MWException( __CLASS__ . ": $key is required in configuration" );
-                       }
-                       $this->$key = $conf[$key];
-               }
-
-               foreach ( $optional as $key ) {
-                       if ( isset( $conf[$key] ) ) {
-                               $this->$key = $conf[$key];
-                       }
-               }
-
-               // Check for read-only mode
-               $section = $this->getSectionForWiki();
-               if ( !empty( $this->readOnlyBySection[$section] ) ) {
-                       global $wgReadOnly;
-                       $wgReadOnly = $this->readOnlyBySection[$section];
-               }
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return string
-        */
-       private function getSectionForWiki( $wiki = false ) {
-               if ( $this->lastWiki === $wiki ) {
-                       return $this->lastSection;
-               }
-               list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
-               if ( isset( $this->sectionsByDB[$dbName] ) ) {
-                       $section = $this->sectionsByDB[$dbName];
-               } else {
-                       $section = 'DEFAULT';
-               }
-               $this->lastSection = $section;
-               $this->lastWiki = $wiki;
-
-               return $section;
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       public function newMainLB( $wiki = false ) {
-               list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
-               $section = $this->getSectionForWiki( $wiki );
-               $groupLoads = array();
-               if ( isset( $this->groupLoadsByDB[$dbName] ) ) {
-                       $groupLoads = $this->groupLoadsByDB[$dbName];
-               }
-
-               if ( isset( $this->groupLoadsBySection[$section] ) ) {
-                       $groupLoads = array_merge_recursive( $groupLoads, $this->groupLoadsBySection[$section] );
-               }
-
-               return $this->newLoadBalancer(
-                       $this->serverTemplate,
-                       $this->sectionLoads[$section],
-                       $groupLoads
-               );
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       public function getMainLB( $wiki = false ) {
-               $section = $this->getSectionForWiki( $wiki );
-               if ( !isset( $this->mainLBs[$section] ) ) {
-                       $lb = $this->newMainLB( $wiki );
-                       $lb->parentInfo( array( 'id' => "main-$section" ) );
-                       $this->chronProt->initLB( $lb );
-                       $this->mainLBs[$section] = $lb;
-               }
-
-               return $this->mainLBs[$section];
-       }
-
-       /**
-        * @param string $cluster
-        * @param bool|string $wiki
-        * @throws MWException
-        * @return LoadBalancer
-        */
-       protected function newExternalLB( $cluster, $wiki = false ) {
-               if ( !isset( $this->externalLoads[$cluster] ) ) {
-                       throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
-               }
-               $template = $this->serverTemplate;
-               if ( isset( $this->externalTemplateOverrides ) ) {
-                       $template = $this->externalTemplateOverrides + $template;
-               }
-               if ( isset( $this->templateOverridesByCluster[$cluster] ) ) {
-                       $template = $this->templateOverridesByCluster[$cluster] + $template;
-               }
-
-               return $this->newLoadBalancer( $template, $this->externalLoads[$cluster], array() );
-       }
-
-       /**
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       public function &getExternalLB( $cluster, $wiki = false ) {
-               if ( !isset( $this->extLBs[$cluster] ) ) {
-                       $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
-                       $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
-                       $this->chronProt->initLB( $this->extLBs[$cluster] );
-               }
-
-               return $this->extLBs[$cluster];
-       }
-
-       /**
-        * Make a new load balancer object based on template and load array
-        *
-        * @param array $template
-        * @param array $loads
-        * @param array $groupLoads
-        * @return LoadBalancer
-        */
-       private function newLoadBalancer( $template, $loads, $groupLoads ) {
-               $servers = $this->makeServerArray( $template, $loads, $groupLoads );
-               $lb = new LoadBalancer( array(
-                       'servers' => $servers,
-               ) );
-
-               return $lb;
-       }
-
-       /**
-        * Make a server array as expected by LoadBalancer::__construct, using a template and load array
-        *
-        * @param array $template
-        * @param array $loads
-        * @param array $groupLoads
-        * @return array
-        */
-       private function makeServerArray( $template, $loads, $groupLoads ) {
-               $servers = array();
-               $master = true;
-               $groupLoadsByServer = $this->reindexGroupLoads( $groupLoads );
-               foreach ( $groupLoadsByServer as $server => $stuff ) {
-                       if ( !isset( $loads[$server] ) ) {
-                               $loads[$server] = 0;
-                       }
-               }
-               foreach ( $loads as $serverName => $load ) {
-                       $serverInfo = $template;
-                       if ( $master ) {
-                               $serverInfo['master'] = true;
-                               if ( isset( $this->masterTemplateOverrides ) ) {
-                                       $serverInfo = $this->masterTemplateOverrides + $serverInfo;
-                               }
-                               $master = false;
-                       }
-                       if ( isset( $this->templateOverridesByServer[$serverName] ) ) {
-                               $serverInfo = $this->templateOverridesByServer[$serverName] + $serverInfo;
-                       }
-                       if ( isset( $groupLoadsByServer[$serverName] ) ) {
-                               $serverInfo['groupLoads'] = $groupLoadsByServer[$serverName];
-                       }
-                       if ( isset( $this->hostsByName[$serverName] ) ) {
-                               $serverInfo['host'] = $this->hostsByName[$serverName];
-                       } else {
-                               $serverInfo['host'] = $serverName;
-                       }
-                       $serverInfo['hostName'] = $serverName;
-                       $serverInfo['load'] = $load;
-                       $servers[] = $serverInfo;
-               }
-
-               return $servers;
-       }
-
-       /**
-        * Take a group load array indexed by group then server, and reindex it by server then group
-        * @param array $groupLoads
-        * @return array
-        */
-       private function reindexGroupLoads( $groupLoads ) {
-               $reindexed = array();
-               foreach ( $groupLoads as $group => $loads ) {
-                       foreach ( $loads as $server => $load ) {
-                               $reindexed[$server][$group] = $load;
-                       }
-               }
-
-               return $reindexed;
-       }
-
-       /**
-        * Get the database name and prefix based on the wiki ID
-        * @param bool|string $wiki
-        * @return array
-        */
-       private function getDBNameAndPrefix( $wiki = false ) {
-               if ( $wiki === false ) {
-                       global $wgDBname, $wgDBprefix;
-
-                       return array( $wgDBname, $wgDBprefix );
-               } else {
-                       return wfSplitWikiID( $wiki );
-               }
-       }
-
-       /**
-        * Execute a function for each tracked load balancer
-        * The callback is called with the load balancer as the first parameter,
-        * and $params passed as the subsequent parameters.
-        * @param callable $callback
-        * @param array $params
-        */
-       public function forEachLB( $callback, array $params = array() ) {
-               foreach ( $this->mainLBs as $lb ) {
-                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
-               }
-               foreach ( $this->extLBs as $lb ) {
-                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
-               }
-       }
-
-       public function shutdown() {
-               foreach ( $this->mainLBs as $lb ) {
-                       $this->chronProt->shutdownLB( $lb );
-               }
-               foreach ( $this->extLBs as $extLB ) {
-                       $this->chronProt->shutdownLB( $extLB );
-               }
-               $this->chronProt->shutdown();
-               $this->commitMasterChanges();
-       }
-}
diff --git a/includes/db/LBFactorySingle.php b/includes/db/LBFactorySingle.php
deleted file mode 100644 (file)
index a41dadf..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-/**
- * Simple generator of database connections that always returns the same object.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-
-/**
- * An LBFactory class that always returns a single database object.
- */
-class LBFactorySingle extends LBFactory {
-       /** @var LoadBalancerSingle */
-       private $lb;
-
-       /**
-        * @param array $conf An associative array with one member:
-        *  - connection: The DatabaseBase connection object
-        */
-       public function __construct( array $conf ) {
-               $this->lb = new LoadBalancerSingle( $conf );
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancerSingle
-        */
-       public function newMainLB( $wiki = false ) {
-               return $this->lb;
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancerSingle
-        */
-       public function getMainLB( $wiki = false ) {
-               return $this->lb;
-       }
-
-       /**
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancerSingle
-        */
-       protected function newExternalLB( $cluster, $wiki = false ) {
-               return $this->lb;
-       }
-
-       /**
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancerSingle
-        */
-       public function &getExternalLB( $cluster, $wiki = false ) {
-               return $this->lb;
-       }
-
-       /**
-        * @param string|callable $callback
-        * @param array $params
-        */
-       public function forEachLB( $callback, array $params = array() ) {
-               call_user_func_array( $callback, array_merge( array( $this->lb ), $params ) );
-       }
-}
-
-/**
- * Helper class for LBFactorySingle.
- */
-class LoadBalancerSingle extends LoadBalancer {
-       /** @var DatabaseBase */
-       private $db;
-
-       /**
-        * @param array $params
-        */
-       public function __construct( array $params ) {
-               $this->db = $params['connection'];
-               parent::__construct( array( 'servers' => array( array(
-                       'type' => $this->db->getType(),
-                       'host' => $this->db->getServer(),
-                       'dbname' => $this->db->getDBname(),
-                       'load' => 1,
-               ) ) ) );
-       }
-
-       /**
-        *
-        * @param string $server
-        * @param bool $dbNameOverride
-        *
-        * @return DatabaseBase
-        */
-       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
-               return $this->db;
-       }
-}
diff --git a/includes/db/LoadBalancer.php b/includes/db/LoadBalancer.php
deleted file mode 100644 (file)
index 52dca08..0000000
+++ /dev/null
@@ -1,1273 +0,0 @@
-<?php
-/**
- * Database load balancing.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-
-/**
- * Database load balancing object
- *
- * @todo document
- * @ingroup Database
- */
-class LoadBalancer {
-       /** @var array[] Map of (server index => server config array) */
-       private $mServers;
-       /** @var array[] Map of (local/foreignUsed/foreignFree => server index => DatabaseBase array) */
-       private $mConns;
-       /** @var array Map of (server index => weight) */
-       private $mLoads;
-       /** @var array[] Map of (group => server index => weight) */
-       private $mGroupLoads;
-       /** @var bool Whether to disregard slave lag as a factor in slave selection */
-       private $mAllowLagged;
-       /** @var integer Seconds to spend waiting on slave lag to resolve */
-       private $mWaitTimeout;
-
-       /** @var array LBFactory information */
-       private $mParentInfo;
-       /** @var string The LoadMonitor subclass name */
-       private $mLoadMonitorClass;
-       /** @var LoadMonitor */
-       private $mLoadMonitor;
-
-       /** @var bool|DatabaseBase Database connection that caused a problem */
-       private $mErrorConnection;
-       /** @var integer The generic (not query grouped) slave index (of $mServers) */
-       private $mReadIndex;
-       /** @var bool|DBMasterPos False if not set */
-       private $mWaitForPos;
-       /** @var bool Whether the generic reader fell back to a lagged slave */
-       private $mLaggedSlaveMode;
-       /** @var string The last DB selection or connection error */
-       private $mLastError = 'Unknown error';
-       /** @var integer Total connections opened */
-       private $connsOpened = 0;
-
-       /** @var integer Warn when this many connection are held */
-       const CONN_HELD_WARN_THRESHOLD = 10;
-
-       /**
-        * @param array $params Array with keys:
-        *   servers           Required. Array of server info structures.
-        *   loadMonitor       Name of a class used to fetch server lag and load.
-        * @throws MWException
-        */
-       public function __construct( array $params ) {
-               if ( !isset( $params['servers'] ) ) {
-                       throw new MWException( __CLASS__ . ': missing servers parameter' );
-               }
-               $this->mServers = $params['servers'];
-               $this->mWaitTimeout = 10;
-
-               $this->mReadIndex = -1;
-               $this->mWriteIndex = -1;
-               $this->mConns = array(
-                       'local' => array(),
-                       'foreignUsed' => array(),
-                       'foreignFree' => array() );
-               $this->mLoads = array();
-               $this->mWaitForPos = false;
-               $this->mLaggedSlaveMode = false;
-               $this->mErrorConnection = false;
-               $this->mAllowLagged = false;
-
-               if ( isset( $params['loadMonitor'] ) ) {
-                       $this->mLoadMonitorClass = $params['loadMonitor'];
-               } else {
-                       $master = reset( $params['servers'] );
-                       if ( isset( $master['type'] ) && $master['type'] === 'mysql' ) {
-                               $this->mLoadMonitorClass = 'LoadMonitorMySQL';
-                       } else {
-                               $this->mLoadMonitorClass = 'LoadMonitorNull';
-                       }
-               }
-
-               foreach ( $params['servers'] as $i => $server ) {
-                       $this->mLoads[$i] = $server['load'];
-                       if ( isset( $server['groupLoads'] ) ) {
-                               foreach ( $server['groupLoads'] as $group => $ratio ) {
-                                       if ( !isset( $this->mGroupLoads[$group] ) ) {
-                                               $this->mGroupLoads[$group] = array();
-                                       }
-                                       $this->mGroupLoads[$group][$i] = $ratio;
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Get a LoadMonitor instance
-        *
-        * @return LoadMonitor
-        */
-       private function getLoadMonitor() {
-               if ( !isset( $this->mLoadMonitor ) ) {
-                       $class = $this->mLoadMonitorClass;
-                       $this->mLoadMonitor = new $class( $this );
-               }
-
-               return $this->mLoadMonitor;
-       }
-
-       /**
-        * Get or set arbitrary data used by the parent object, usually an LBFactory
-        * @param mixed $x
-        * @return mixed
-        */
-       public function parentInfo( $x = null ) {
-               return wfSetVar( $this->mParentInfo, $x );
-       }
-
-       /**
-        * Given an array of non-normalised probabilities, this function will select
-        * an element and return the appropriate key
-        *
-        * @deprecated since 1.21, use ArrayUtils::pickRandom()
-        *
-        * @param array $weights
-        * @return bool|int|string
-        */
-       public function pickRandom( array $weights ) {
-               return ArrayUtils::pickRandom( $weights );
-       }
-
-       /**
-        * @param array $loads
-        * @param bool|string $wiki Wiki to get non-lagged for
-        * @param float $maxLag Restrict the maximum allowed lag to this many seconds
-        * @return bool|int|string
-        */
-       private function getRandomNonLagged( array $loads, $wiki = false, $maxLag = INF ) {
-               $lags = $this->getLagTimes( $wiki );
-
-               # Unset excessively lagged servers
-               foreach ( $lags as $i => $lag ) {
-                       if ( $i != 0 ) {
-                               $maxServerLag = $maxLag;
-                               if ( isset( $this->mServers[$i]['max lag'] ) ) {
-                                       $maxServerLag = min( $maxServerLag, $this->mServers[$i]['max lag'] );
-                               }
-                               if ( $lag === false ) {
-                                       wfDebugLog( 'replication', "Server #$i is not replicating" );
-                                       unset( $loads[$i] );
-                               } elseif ( $lag > $maxServerLag ) {
-                                       wfDebugLog( 'replication', "Server #$i is excessively lagged ($lag seconds)" );
-                                       unset( $loads[$i] );
-                               }
-                       }
-               }
-
-               # Find out if all the slaves with non-zero load are lagged
-               $sum = 0;
-               foreach ( $loads as $load ) {
-                       $sum += $load;
-               }
-               if ( $sum == 0 ) {
-                       # No appropriate DB servers except maybe the master and some slaves with zero load
-                       # Do NOT use the master
-                       # Instead, this function will return false, triggering read-only mode,
-                       # and a lagged slave will be used instead.
-                       return false;
-               }
-
-               if ( count( $loads ) == 0 ) {
-                       return false;
-               }
-
-               #wfDebugLog( 'connect', var_export( $loads, true ) );
-
-               # Return a random representative of the remainder
-               return ArrayUtils::pickRandom( $loads );
-       }
-
-       /**
-        * Get the index of the reader connection, which may be a slave
-        * This takes into account load ratios and lag times. It should
-        * always return a consistent index during a given invocation
-        *
-        * Side effect: opens connections to databases
-        * @param string|bool $group Query group, or false for the generic reader
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        * @throws MWException
-        * @return bool|int|string
-        */
-       public function getReaderIndex( $group = false, $wiki = false ) {
-               global $wgDBtype;
-
-               # @todo FIXME: For now, only go through all this for mysql databases
-               if ( $wgDBtype != 'mysql' ) {
-                       return $this->getWriterIndex();
-               }
-
-               if ( count( $this->mServers ) == 1 ) {
-                       # Skip the load balancing if there's only one server
-                       return 0;
-               } elseif ( $group === false && $this->mReadIndex >= 0 ) {
-                       # Shortcut if generic reader exists already
-                       return $this->mReadIndex;
-               }
-
-               # Find the relevant load array
-               if ( $group !== false ) {
-                       if ( isset( $this->mGroupLoads[$group] ) ) {
-                               $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" );
-
-                               return false;
-                       }
-               } else {
-                       $nonErrorLoads = $this->mLoads;
-               }
-
-               if ( !count( $nonErrorLoads ) ) {
-                       throw new MWException( "Empty server array given to LoadBalancer" );
-               }
-
-               # Scale the configured load ratios according to the dynamic load (if the load monitor supports it)
-               $this->getLoadMonitor()->scaleLoads( $nonErrorLoads, $group, $wiki );
-
-               $laggedSlaveMode = false;
-
-               # No server found yet
-               $i = false;
-               # First try quickly looking through the available servers for a server that
-               # meets our criteria
-               $currentLoads = $nonErrorLoads;
-               while ( count( $currentLoads ) ) {
-                       if ( $this->mAllowLagged || $laggedSlaveMode ) {
-                               $i = ArrayUtils::pickRandom( $currentLoads );
-                       } else {
-                               $i = false;
-                               if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) {
-                                       # ChronologyProtecter causes mWaitForPos to be set via sessions.
-                                       # This triggers doWait() after connect, so it's especially good to
-                                       # avoid lagged servers so as to avoid just blocking in that method.
-                                       $ago = microtime( true ) - $this->mWaitForPos->asOfTime();
-                                       # Aim for <= 1 second of waiting (being too picky can backfire)
-                                       $i = $this->getRandomNonLagged( $currentLoads, $wiki, $ago + 1 );
-                               }
-                               if ( $i === false ) {
-                                       # Any server with less lag than it's 'max lag' param is preferable
-                                       $i = $this->getRandomNonLagged( $currentLoads, $wiki );
-                               }
-                               if ( $i === false && count( $currentLoads ) != 0 ) {
-                                       # All slaves lagged. Switch to read-only mode
-                                       wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode" );
-                                       $i = ArrayUtils::pickRandom( $currentLoads );
-                                       $laggedSlaveMode = true;
-                               }
-                       }
-
-                       if ( $i === false ) {
-                               # pickRandom() returned false
-                               # This is permanent and means the configuration or the load monitor
-                               # wants us to return false.
-                               wfDebugLog( 'connect', __METHOD__ . ": pickRandom() returned false" );
-
-                               return false;
-                       }
-
-                       $serverName = $this->getServerName( $i );
-                       wfDebugLog( 'connect', __METHOD__ . ": Using reader #$i: $serverName..." );
-
-                       $conn = $this->openConnection( $i, $wiki );
-                       if ( !$conn ) {
-                               wfDebugLog( 'connect', __METHOD__ . ": Failed connecting to $i/$wiki" );
-                               unset( $nonErrorLoads[$i] );
-                               unset( $currentLoads[$i] );
-                               $i = false;
-                               continue;
-                       }
-
-                       // Decrement reference counter, we are finished with this connection.
-                       // It will be incremented for the caller later.
-                       if ( $wiki !== false ) {
-                               $this->reuseConnection( $conn );
-                       }
-
-                       # Return this server
-                       break;
-               }
-
-               # If all servers were down, quit now
-               if ( !count( $nonErrorLoads ) ) {
-                       wfDebugLog( 'connect', "All servers down" );
-               }
-
-               if ( $i !== false ) {
-                       # Slave connection successful
-                       # Wait for the session master pos for a short time
-                       if ( $this->mWaitForPos && $i > 0 ) {
-                               if ( !$this->doWait( $i ) ) {
-                                       $this->mServers[$i]['slave pos'] = $conn->getSlavePos();
-                               }
-                       }
-                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
-                               $this->mReadIndex = $i;
-                               # Record if the generic reader index is in "lagged slave" mode
-                               if ( $laggedSlaveMode ) {
-                                       $this->mLaggedSlaveMode = true;
-                               }
-                       }
-                       $serverName = $this->getServerName( $i );
-                       wfDebug( __METHOD__ . ": using server $serverName for group '$group'\n" );
-               }
-
-               return $i;
-       }
-
-       /**
-        * Set the master wait position
-        * If a DB_SLAVE connection has been opened already, waits
-        * Otherwise sets a variable telling it to wait if such a connection is opened
-        * @param DBMasterPos $pos
-        */
-       public function waitFor( $pos ) {
-               $this->mWaitForPos = $pos;
-               $i = $this->mReadIndex;
-
-               if ( $i > 0 ) {
-                       if ( !$this->doWait( $i ) ) {
-                               $this->mServers[$i]['slave pos'] = $this->getAnyOpenConnection( $i )->getSlavePos();
-                               $this->mLaggedSlaveMode = true;
-                       }
-               }
-       }
-
-       /**
-        * Set the master wait position and wait for a "generic" slave to catch up to it
-        *
-        * This can be used a faster proxy for waitForAll()
-        *
-        * @param DBMasterPos $pos
-        * @param int $timeout Max seconds to wait; default is mWaitTimeout
-        * @return bool Success (able to connect and no timeouts reached)
-        * @since 1.26
-        */
-       public function waitForOne( $pos, $timeout = null ) {
-               $this->mWaitForPos = $pos;
-
-               $i = $this->mReadIndex;
-               if ( $i <= 0 ) {
-                       // Pick a generic slave if there isn't one yet
-                       $readLoads = $this->mLoads;
-                       unset( $readLoads[$this->getWriterIndex()] ); // slaves only
-                       $readLoads = array_filter( $readLoads ); // with non-zero load
-                       $i = ArrayUtils::pickRandom( $readLoads );
-               }
-
-               if ( $i > 0 ) {
-                       $ok = $this->doWait( $i, true, $timeout );
-               } else {
-                       $ok = true; // no applicable loads
-               }
-
-               return $ok;
-       }
-
-       /**
-        * Set the master wait position and wait for ALL slaves to catch up to it
-        * @param DBMasterPos $pos
-        * @param int $timeout Max seconds to wait; default is mWaitTimeout
-        * @return bool Success (able to connect and no timeouts reached)
-        */
-       public function waitForAll( $pos, $timeout = null ) {
-               $this->mWaitForPos = $pos;
-               $serverCount = count( $this->mServers );
-
-               $ok = true;
-               for ( $i = 1; $i < $serverCount; $i++ ) {
-                       if ( $this->mLoads[$i] > 0 ) {
-                               $ok = $this->doWait( $i, true, $timeout ) && $ok;
-                       }
-               }
-
-               return $ok;
-       }
-
-       /**
-        * Get any open connection to a given server index, local or foreign
-        * Returns false if there is no connection open
-        *
-        * @param int $i
-        * @return DatabaseBase|bool False on failure
-        */
-       public function getAnyOpenConnection( $i ) {
-               foreach ( $this->mConns as $conns ) {
-                       if ( !empty( $conns[$i] ) ) {
-                               return reset( $conns[$i] );
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Wait for a given slave to catch up to the master pos stored in $this
-        * @param int $index Server index
-        * @param bool $open Check the server even if a new connection has to be made
-        * @param int $timeout Max seconds to wait; default is mWaitTimeout
-        * @return bool
-        */
-       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
-               $conn = $this->getAnyOpenConnection( $index );
-               if ( !$conn ) {
-                       if ( !$open ) {
-                               wfDebug( __METHOD__ . ": no connection open\n" );
-
-                               return false;
-                       } else {
-                               $conn = $this->openConnection( $index, '' );
-                               if ( !$conn ) {
-                                       wfDebug( __METHOD__ . ": failed to open connection\n" );
-
-                                       return false;
-                               }
-                               // Avoid connection spam in waitForAll() when connections
-                               // are made just for the sake of doing this lag check.
-                               $close = true;
-                       }
-               }
-
-               wfDebug( __METHOD__ . ": Waiting for slave #$index 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 );
-                       $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
-                       wfDebug( "$msg\n" );
-                       wfDebugLog( 'DBPerformance', "$msg:\n" . wfBacktrace( true ) );
-                       $ok = false;
-               } else {
-                       wfDebug( __METHOD__ . ": Done\n" );
-                       $ok = true;
-               }
-
-               if ( $close ) {
-                       $this->closeConnection( $conn );
-               }
-
-               return $ok;
-       }
-
-       /**
-        * Get a connection by index
-        * This is the main entry point for this class.
-        *
-        * @param int $i Server index
-        * @param array|string|bool $groups Query group(s), or false for the generic reader
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        *
-        * @throws MWException
-        * @return DatabaseBase
-        */
-       public function getConnection( $i, $groups = array(), $wiki = false ) {
-               if ( $i === null || $i === false ) {
-                       throw new MWException( 'Attempt to call ' . __METHOD__ .
-                               ' with invalid server index' );
-               }
-
-               if ( $wiki === wfWikiID() ) {
-                       $wiki = false;
-               }
-
-               $groups = ( $groups === false || $groups === array() )
-                       ? array( false ) // check one "group": the generic pool
-                       : (array)$groups;
-
-               $masterOnly = ( $i == DB_MASTER || $i == $this->getWriterIndex() );
-               $oldConnsOpened = $this->connsOpened; // connections open now
-
-               if ( $i == DB_MASTER ) {
-                       $i = $this->getWriterIndex();
-               } else {
-                       # Try to find an available server in any the query groups (in order)
-                       foreach ( $groups as $group ) {
-                               $groupIndex = $this->getReaderIndex( $group, $wiki );
-                               if ( $groupIndex !== false ) {
-                                       $i = $groupIndex;
-                                       break;
-                               }
-                       }
-               }
-
-               # Operation-based index
-               if ( $i == DB_SLAVE ) {
-                       $this->mLastError = 'Unknown error'; // reset error string
-                       # Try the general server pool if $groups are unavailable.
-                       $i = in_array( false, $groups, true )
-                               ? false // don't bother with this if that is what was tried above
-                               : $this->getReaderIndex( false, $wiki );
-                       # Couldn't find a working server in getReaderIndex()?
-                       if ( $i === false ) {
-                               $this->mLastError = 'No working slave server: ' . $this->mLastError;
-
-                               return $this->reportConnectionError();
-                       }
-               }
-
-               # Now we have an explicit index into the servers array
-               $conn = $this->openConnection( $i, $wiki );
-               if ( !$conn ) {
-                       return $this->reportConnectionError();
-               }
-
-               # Profile any new connections that happen
-               if ( $this->connsOpened > $oldConnsOpened ) {
-                       $host = $conn->getServer();
-                       $dbname = $conn->getDBname();
-                       $trxProf = Profiler::instance()->getTransactionProfiler();
-                       $trxProf->recordConnection( $host, $dbname, $masterOnly );
-               }
-
-               return $conn;
-       }
-
-       /**
-        * Mark a foreign connection as being available for reuse under a different
-        * DB name or prefix. This mechanism is reference-counted, and must be called
-        * the same number of times as getConnection() to work.
-        *
-        * @param DatabaseBase $conn
-        * @throws MWException
-        */
-       public function reuseConnection( $conn ) {
-               $serverIndex = $conn->getLBInfo( 'serverIndex' );
-               $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 ) {
-                        *     $conn = $lb->getConnection( DB_SLAVE, array(), $db );
-                        *     ...
-                        *     $lb->reuseConnection( $conn );
-                        *   }
-                        * When a connection to the local DB is opened in this way, reuseConnection()
-                        * should be ignored
-                        */
-
-                       return;
-               }
-
-               $dbName = $conn->getDBname();
-               $prefix = $conn->tablePrefix();
-               if ( strval( $prefix ) !== '' ) {
-                       $wiki = "$dbName-$prefix";
-               } else {
-                       $wiki = $dbName;
-               }
-               if ( $this->mConns['foreignUsed'][$serverIndex][$wiki] !== $conn ) {
-                       throw new MWException( __METHOD__ . ": connection not found, has " .
-                               "the connection been freed already?" );
-               }
-               $conn->setLBInfo( 'foreignPoolRefCount', --$refCount );
-               if ( $refCount <= 0 ) {
-                       $this->mConns['foreignFree'][$serverIndex][$wiki] = $conn;
-                       unset( $this->mConns['foreignUsed'][$serverIndex][$wiki] );
-                       wfDebug( __METHOD__ . ": freed connection $serverIndex/$wiki\n" );
-               } else {
-                       wfDebug( __METHOD__ . ": reference count for $serverIndex/$wiki reduced to $refCount\n" );
-               }
-       }
-
-       /**
-        * Get a database connection handle reference
-        *
-        * The handle's methods wrap simply wrap those of a DatabaseBase handle
-        *
-        * @see LoadBalancer::getConnection() for parameter information
-        *
-        * @param int $db
-        * @param array|string|bool $groups Query group(s), or false for the generic reader
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        * @return DBConnRef
-        */
-       public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
-               return new DBConnRef( $this, $this->getConnection( $db, $groups, $wiki ) );
-       }
-
-       /**
-        * Get a database connection handle reference without connecting yet
-        *
-        * The handle's methods wrap simply wrap those of a DatabaseBase handle
-        *
-        * @see LoadBalancer::getConnection() for parameter information
-        *
-        * @param int $db
-        * @param array|string|bool $groups Query group(s), or false for the generic reader
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        * @return DBConnRef
-        */
-       public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
-               return new DBConnRef( $this, array( $db, $groups, $wiki ) );
-       }
-
-       /**
-        * Open a connection to the server given by the specified index
-        * Index must be an actual index into the array.
-        * If the server is already open, returns it.
-        *
-        * On error, returns false, and the connection which caused the
-        * error will be available via $this->mErrorConnection.
-        *
-        * @param int $i Server index
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        * @return DatabaseBase
-        *
-        * @access private
-        */
-       public function openConnection( $i, $wiki = false ) {
-               if ( $wiki !== false ) {
-                       $conn = $this->openForeignConnection( $i, $wiki );
-               } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
-                       $conn = $this->mConns['local'][$i][0];
-               } else {
-                       $server = $this->mServers[$i];
-                       $server['serverIndex'] = $i;
-                       $conn = $this->reallyOpenConnection( $server, false );
-                       $serverName = $this->getServerName( $i );
-                       if ( $conn->isOpen() ) {
-                               wfDebug( "Connected to database $i at $serverName\n" );
-                               $this->mConns['local'][$i][0] = $conn;
-                       } else {
-                               wfDebug( "Failed to connect to database $i at $serverName\n" );
-                               $this->mErrorConnection = $conn;
-                               $conn = false;
-                       }
-               }
-
-               if ( $conn && !$conn->isOpen() ) {
-                       // Connection was made but later unrecoverably lost for some reason.
-                       // Do not return a handle that will just throw exceptions on use,
-                       // but let the calling code (e.g. getReaderIndex) try another server.
-                       // See DatabaseMyslBase::ping() for how this can happen.
-                       $this->mErrorConnection = $conn;
-                       $conn = false;
-               }
-
-               return $conn;
-       }
-
-       /**
-        * Open a connection to a foreign DB, or return one if it is already open.
-        *
-        * Increments a reference count on the returned connection which locks the
-        * connection to the requested wiki. This reference count can be
-        * decremented by calling reuseConnection().
-        *
-        * If a connection is open to the appropriate server already, but with the wrong
-        * database, it will be switched to the right database and returned, as long as
-        * it has been freed first with reuseConnection().
-        *
-        * On error, returns false, and the connection which caused the
-        * error will be available via $this->mErrorConnection.
-        *
-        * @param int $i Server index
-        * @param string $wiki Wiki ID to open
-        * @return DatabaseBase
-        */
-       private function openForeignConnection( $i, $wiki ) {
-               list( $dbName, $prefix ) = wfSplitWikiID( $wiki );
-               if ( isset( $this->mConns['foreignUsed'][$i][$wiki] ) ) {
-                       // Reuse an already-used connection
-                       $conn = $this->mConns['foreignUsed'][$i][$wiki];
-                       wfDebug( __METHOD__ . ": reusing connection $i/$wiki\n" );
-               } elseif ( isset( $this->mConns['foreignFree'][$i][$wiki] ) ) {
-                       // Reuse a free connection for the same wiki
-                       $conn = $this->mConns['foreignFree'][$i][$wiki];
-                       unset( $this->mConns['foreignFree'][$i][$wiki] );
-                       $this->mConns['foreignUsed'][$i][$wiki] = $conn;
-                       wfDebug( __METHOD__ . ": reusing free connection $i/$wiki\n" );
-               } elseif ( !empty( $this->mConns['foreignFree'][$i] ) ) {
-                       // Reuse a connection from another wiki
-                       $conn = reset( $this->mConns['foreignFree'][$i] );
-                       $oldWiki = key( $this->mConns['foreignFree'][$i] );
-
-                       // The empty string as a DB name means "don't care".
-                       // DatabaseMysqlBase::open() already handle this on connection.
-                       if ( $dbName !== '' && !$conn->selectDB( $dbName ) ) {
-                               $this->mLastError = "Error selecting database $dbName on server " .
-                                       $conn->getServer() . " from client host " . wfHostname() . "\n";
-                               $this->mErrorConnection = $conn;
-                               $conn = false;
-                       } else {
-                               $conn->tablePrefix( $prefix );
-                               unset( $this->mConns['foreignFree'][$i][$oldWiki] );
-                               $this->mConns['foreignUsed'][$i][$wiki] = $conn;
-                               wfDebug( __METHOD__ . ": reusing free connection from $oldWiki for $wiki\n" );
-                       }
-               } else {
-                       // Open a new connection
-                       $server = $this->mServers[$i];
-                       $server['serverIndex'] = $i;
-                       $server['foreignPoolRefCount'] = 0;
-                       $server['foreign'] = true;
-                       $conn = $this->reallyOpenConnection( $server, $dbName );
-                       if ( !$conn->isOpen() ) {
-                               wfDebug( __METHOD__ . ": error opening connection for $i/$wiki\n" );
-                               $this->mErrorConnection = $conn;
-                               $conn = false;
-                       } else {
-                               $conn->tablePrefix( $prefix );
-                               $this->mConns['foreignUsed'][$i][$wiki] = $conn;
-                               wfDebug( __METHOD__ . ": opened new connection for $i/$wiki\n" );
-                       }
-               }
-
-               // Increment reference count
-               if ( $conn ) {
-                       $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
-                       $conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
-               }
-
-               return $conn;
-       }
-
-       /**
-        * Test if the specified index represents an open connection
-        *
-        * @param int $index Server index
-        * @access private
-        * @return bool
-        */
-       private function isOpen( $index ) {
-               if ( !is_integer( $index ) ) {
-                       return false;
-               }
-
-               return (bool)$this->getAnyOpenConnection( $index );
-       }
-
-       /**
-        * Really opens a connection. Uncached.
-        * Returns a Database object whether or not the connection was successful.
-        * @access private
-        *
-        * @param array $server
-        * @param bool $dbNameOverride
-        * @throws MWException
-        * @return DatabaseBase
-        */
-       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
-               if ( !is_array( $server ) ) {
-                       throw new MWException( 'You must update your load-balancing configuration. ' .
-                               'See DefaultSettings.php entry for $wgDBservers.' );
-               }
-
-               if ( $dbNameOverride !== false ) {
-                       $server['dbname'] = $dbNameOverride;
-               }
-
-               // Log when many connection are made on requests
-               if ( ++$this->connsOpened >= self::CONN_HELD_WARN_THRESHOLD ) {
-                       $masterAddr = $this->getServerName( 0 );
-                       wfDebugLog( 'DBPerformance', __METHOD__ . ": " .
-                               "{$this->connsOpened}+ connections made (master=$masterAddr)\n" .
-                               wfBacktrace( true ) );
-               }
-
-               # Create object
-               try {
-                       $db = DatabaseBase::factory( $server['type'], $server );
-               } catch ( DBConnectionError $e ) {
-                       // FIXME: This is probably the ugliest thing I have ever done to
-                       // PHP. I'm half-expecting it to segfault, just out of disgust. -- TS
-                       $db = $e->db;
-               }
-
-               $db->setLBInfo( $server );
-               if ( isset( $server['fakeSlaveLag'] ) ) {
-                       $db->setFakeSlaveLag( $server['fakeSlaveLag'] );
-               }
-               if ( isset( $server['fakeMaster'] ) ) {
-                       $db->setFakeMaster( true );
-               }
-
-               return $db;
-       }
-
-       /**
-        * @throws DBConnectionError
-        * @return bool
-        */
-       private function reportConnectionError() {
-               $conn = $this->mErrorConnection; // The connection which caused the error
-               $context = array(
-                       'method' => __METHOD__,
-                       'last_error' => $this->mLastError,
-               );
-
-               if ( !is_object( $conn ) ) {
-                       // No last connection, probably due to all servers being too busy
-                       wfLogDBError(
-                               "LB failure with no last connection. Connection error: {last_error}",
-                               $context
-                       );
-
-                       // If all servers were busy, mLastError will contain something sensible
-                       throw new DBConnectionError( null, $this->mLastError );
-               } else {
-                       $context['db_server'] = $conn->getProperty( 'mServer' );
-                       wfLogDBError(
-                               "Connection error: {last_error} ({db_server})",
-                               $context
-                       );
-                       $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" ); // throws DBConnectionError
-               }
-
-               return false; /* not reached */
-       }
-
-       /**
-        * @return int
-        * @since 1.26
-        */
-       public function getWriterIndex() {
-               return 0;
-       }
-
-       /**
-        * Returns true if the specified index is a valid server index
-        *
-        * @param string $i
-        * @return bool
-        */
-       public function haveIndex( $i ) {
-               return array_key_exists( $i, $this->mServers );
-       }
-
-       /**
-        * Returns true if the specified index is valid and has non-zero load
-        *
-        * @param string $i
-        * @return bool
-        */
-       public function isNonZeroLoad( $i ) {
-               return array_key_exists( $i, $this->mServers ) && $this->mLoads[$i] != 0;
-       }
-
-       /**
-        * Get the number of defined servers (not the number of open connections)
-        *
-        * @return int
-        */
-       public function getServerCount() {
-               return count( $this->mServers );
-       }
-
-       /**
-        * Get the host name or IP address of the server with the specified index
-        * Prefer a readable name if available.
-        * @param string $i
-        * @return string
-        */
-       public function getServerName( $i ) {
-               if ( isset( $this->mServers[$i]['hostName'] ) ) {
-                       $name = $this->mServers[$i]['hostName'];
-               } elseif ( isset( $this->mServers[$i]['host'] ) ) {
-                       $name = $this->mServers[$i]['host'];
-               } else {
-                       $name = '';
-               }
-
-               return ( $name != '' ) ? $name : 'localhost';
-       }
-
-       /**
-        * Return the server info structure for a given index, or false if the index is invalid.
-        * @param int $i
-        * @return array|bool
-        */
-       public function getServerInfo( $i ) {
-               if ( isset( $this->mServers[$i] ) ) {
-                       return $this->mServers[$i];
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Sets the server info structure for the given index. Entry at index $i
-        * is created if it doesn't exist
-        * @param int $i
-        * @param array $serverInfo
-        */
-       public function setServerInfo( $i, array $serverInfo ) {
-               $this->mServers[$i] = $serverInfo;
-       }
-
-       /**
-        * Get the current master position for chronology control purposes
-        * @return mixed
-        */
-       public function getMasterPos() {
-               # If this entire request was served from a slave without opening a connection to the
-               # master (however unlikely that may be), then we can fetch the position from the slave.
-               $masterConn = $this->getAnyOpenConnection( 0 );
-               if ( !$masterConn ) {
-                       $serverCount = count( $this->mServers );
-                       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();
-               }
-
-               return false;
-       }
-
-       /**
-        * Close all open connections
-        */
-       public function closeAll() {
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               /** @var DatabaseBase $conn */
-                               foreach ( $conns3 as $conn ) {
-                                       $conn->close();
-                               }
-                       }
-               }
-               $this->mConns = array(
-                       'local' => array(),
-                       'foreignFree' => array(),
-                       'foreignUsed' => array(),
-               );
-               $this->connsOpened = 0;
-       }
-
-       /**
-        * Close a connection
-        * Using this function makes sure the LoadBalancer knows the connection is closed.
-        * If you use $conn->close() directly, the load balancer won't update its state.
-        * @param DatabaseBase $conn
-        */
-       public function closeConnection( $conn ) {
-               $done = false;
-               foreach ( $this->mConns as $i1 => $conns2 ) {
-                       foreach ( $conns2 as $i2 => $conns3 ) {
-                               foreach ( $conns3 as $i3 => $candidateConn ) {
-                                       if ( $conn === $candidateConn ) {
-                                               $conn->close();
-                                               unset( $this->mConns[$i1][$i2][$i3] );
-                                               --$this->connsOpened;
-                                               $done = true;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-               if ( !$done ) {
-                       $conn->close();
-               }
-       }
-
-       /**
-        * Commit transactions on all open connections
-        */
-       public function commitAll() {
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               /** @var DatabaseBase[] $conns3 */
-                               foreach ( $conns3 as $conn ) {
-                                       if ( $conn->trxLevel() ) {
-                                               $conn->commit( __METHOD__, 'flush' );
-                                       }
-                               }
-                       }
-               }
-       }
-
-       /**
-        *  Issue COMMIT only on master, only if queries were done on connection
-        */
-       public function commitMasterChanges() {
-               $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $conns2 ) {
-                       if ( empty( $conns2[$masterIndex] ) ) {
-                               continue;
-                       }
-                       /** @var DatabaseBase $conn */
-                       foreach ( $conns2[$masterIndex] as $conn ) {
-                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
-                                       $conn->commit( __METHOD__, 'flush' );
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Issue ROLLBACK only on master, only if queries were done on connection
-        * @since 1.23
-        */
-       public function rollbackMasterChanges() {
-               $failedServers = array();
-
-               $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $conns2 ) {
-                       if ( empty( $conns2[$masterIndex] ) ) {
-                               continue;
-                       }
-                       /** @var DatabaseBase $conn */
-                       foreach ( $conns2[$masterIndex] as $conn ) {
-                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
-                                       try {
-                                               $conn->rollback( __METHOD__, 'flush' );
-                                       } catch ( DBError $e ) {
-                                               MWExceptionHandler::logException( $e );
-                                               $failedServers[] = $conn->getServer();
-                                       }
-                               }
-                       }
-               }
-
-               if ( $failedServers ) {
-                       throw new DBExpectedError( null, "Rollback failed on server(s) " .
-                               implode( ', ', array_unique( $failedServers ) ) );
-               }
-       }
-
-       /**
-        * @return bool Whether a master connection is already open
-        * @since 1.24
-        */
-       public function hasMasterConnection() {
-               return $this->isOpen( $this->getWriterIndex() );
-       }
-
-       /**
-        * Determine if there are pending changes in a transaction by this thread
-        * @since 1.23
-        * @return bool
-        */
-       public function hasMasterChanges() {
-               $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $conns2 ) {
-                       if ( empty( $conns2[$masterIndex] ) ) {
-                               continue;
-                       }
-                       /** @var DatabaseBase $conn */
-                       foreach ( $conns2[$masterIndex] as $conn ) {
-                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Get the timestamp of the latest write query done by this thread
-        * @since 1.25
-        * @return float|bool UNIX timestamp or false
-        */
-       public function lastMasterChangeTimestamp() {
-               $lastTime = false;
-               $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $conns2 ) {
-                       if ( empty( $conns2[$masterIndex] ) ) {
-                               continue;
-                       }
-                       /** @var DatabaseBase $conn */
-                       foreach ( $conns2[$masterIndex] as $conn ) {
-                               $lastTime = max( $lastTime, $conn->lastDoneWrites() );
-                       }
-               }
-               return $lastTime;
-       }
-
-       /**
-        * Check if this load balancer object had any recent or still
-        * pending writes issued against it by this PHP thread
-        *
-        * @param float $age How many seconds ago is "recent" [defaults to mWaitTimeout]
-        * @return bool
-        * @since 1.25
-        */
-       public function hasOrMadeRecentMasterChanges( $age = null ) {
-               $age = ( $age === null ) ? $this->mWaitTimeout : $age;
-
-               return ( $this->hasMasterChanges()
-                       || $this->lastMasterChangeTimestamp() > microtime( true ) - $age );
-       }
-
-       /**
-        * @param mixed $value
-        * @return mixed
-        */
-       public function waitTimeout( $value = null ) {
-               return wfSetVar( $this->mWaitTimeout, $value );
-       }
-
-       /**
-        * @return bool Whether the generic connection for reads is highly "lagged"
-        */
-       public function getLaggedSlaveMode() {
-               # Get a generic reader connection
-               $this->getConnection( DB_SLAVE );
-
-               return $this->mLaggedSlaveMode;
-       }
-
-       /**
-        * Disables/enables lag checks
-        * @param null|bool $mode
-        * @return bool
-        */
-       public function allowLagged( $mode = null ) {
-               if ( $mode === null ) {
-                       return $this->mAllowLagged;
-               }
-               $this->mAllowLagged = $mode;
-
-               return $this->mAllowLagged;
-       }
-
-       /**
-        * @return bool
-        */
-       public function pingAll() {
-               $success = true;
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               /** @var DatabaseBase[] $conns3 */
-                               foreach ( $conns3 as $conn ) {
-                                       if ( !$conn->ping() ) {
-                                               $success = false;
-                                       }
-                               }
-                       }
-               }
-
-               return $success;
-       }
-
-       /**
-        * Call a function with each open connection object
-        * @param callable $callback
-        * @param array $params
-        */
-       public function forEachOpenConnection( $callback, array $params = array() ) {
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               foreach ( $conns3 as $conn ) {
-                                       $mergedParams = array_merge( array( $conn ), $params );
-                                       call_user_func_array( $callback, $mergedParams );
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Get the hostname and lag time of the most-lagged slave
-        *
-        * This is useful for maintenance scripts that need to throttle their updates.
-        * May attempt to open connections to slaves on the default DB. If there is
-        * no lag, the maximum lag will be reported as -1.
-        *
-        * @param bool|string $wiki Wiki ID, or false for the default database
-        * @return array ( host, max lag, index of max lagged host )
-        */
-       public function getMaxLag( $wiki = false ) {
-               $maxLag = -1;
-               $host = '';
-               $maxIndex = 0;
-
-               if ( $this->getServerCount() <= 1 ) {
-                       return array( $host, $maxLag, $maxIndex ); // no replication = no lag
-               }
-
-               $lagTimes = $this->getLagTimes( $wiki );
-               foreach ( $lagTimes as $i => $lag ) {
-                       if ( $lag > $maxLag ) {
-                               $maxLag = $lag;
-                               $host = $this->mServers[$i]['host'];
-                               $maxIndex = $i;
-                       }
-               }
-
-               return array( $host, $maxLag, $maxIndex );
-       }
-
-       /**
-        * Get lag time for each server
-        *
-        * Results are cached for a short time in memcached/process cache
-        *
-        * @param string|bool $wiki
-        * @return int[] Map of (server index => seconds)
-        */
-       public function getLagTimes( $wiki = false ) {
-               if ( $this->getServerCount() <= 1 ) {
-                       return array( 0 => 0 ); // no replication = no lag
-               }
-
-               # Send the request to the load monitor
-               return $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
-       }
-
-       /**
-        * Get the lag in seconds for a given connection, or zero if this load
-        * balancer does not have replication enabled.
-        *
-        * This should be used in preference to Database::getLag() in cases where
-        * replication may not be in use, since there is no way to determine if
-        * replication is in use at the connection level without running
-        * potentially restricted queries such as SHOW SLAVE STATUS. Using this
-        * function instead of Database::getLag() avoids a fatal error in this
-        * case on many installations.
-        *
-        * @param DatabaseBase $conn
-        * @return int
-        */
-       public function safeGetLag( $conn ) {
-               if ( $this->getServerCount() == 1 ) {
-                       return 0;
-               } else {
-                       return $conn->getLag();
-               }
-       }
-
-       /**
-        * Clear the cache for slag lag delay times
-        *
-        * This is only used for testing
-        */
-       public function clearLagTimeCache() {
-               $this->getLoadMonitor()->clearCaches();
-       }
-}
diff --git a/includes/db/LoadMonitor.php b/includes/db/LoadMonitor.php
deleted file mode 100644 (file)
index 4975ea1..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-/**
- * Database load monitoring.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-
-/**
- * An interface for database load monitoring
- *
- * @ingroup Database
- */
-interface LoadMonitor {
-       /**
-        * Construct a new LoadMonitor with a given LoadBalancer parent
-        *
-        * @param LoadBalancer $parent
-        */
-       public function __construct( $parent );
-
-       /**
-        * Perform pre-connection load ratio adjustment.
-        * @param array $loads
-        * @param string|bool $group The selected query group. Default: false
-        * @param string|bool $wiki Default: false
-        */
-       public function scaleLoads( &$loads, $group = false, $wiki = false );
-
-       /**
-        * Return an estimate of replication lag for each server
-        *
-        * @param array $serverIndexes
-        * @param string $wiki
-        *
-        * @return array Map of (server index => seconds)
-        */
-       public function getLagTimes( $serverIndexes, $wiki );
-}
-
-class LoadMonitorNull implements LoadMonitor {
-       public function __construct( $parent ) {
-       }
-
-       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
-       }
-
-       public function getLagTimes( $serverIndexes, $wiki ) {
-               return array_fill_keys( $serverIndexes, 0 );
-       }
-}
diff --git a/includes/db/LoadMonitorMySQL.php b/includes/db/LoadMonitorMySQL.php
deleted file mode 100644 (file)
index 3008419..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?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 Database
- */
-
-/**
- * Basic MySQL load monitor with no external dependencies
- * Uses memcached to cache the replication lag for a short time
- *
- * @ingroup Database
- */
-class LoadMonitorMySQL implements LoadMonitor {
-       /** @var LoadBalancer */
-       public $parent;
-       /** @var BagOStuff */
-       protected $srvCache;
-       /** @var BagOStuff */
-       protected $mainCache;
-
-       public function __construct( $parent ) {
-               $this->parent = $parent;
-
-               $this->srvCache = ObjectCache::newAccelerator( 'hash' );
-               $this->mainCache = wfGetMainCache();
-       }
-
-       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
-       }
-
-       public function getLagTimes( $serverIndexes, $wiki ) {
-               if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
-                       # Single server only, just return zero without caching
-                       return array( 0 => 0 );
-               }
-
-               $key = $this->getLagTimeCacheKey();
-               # Randomize TTLs to reduce stampedes (4.0 - 5.0 sec)
-               $ttl = mt_rand( 4e6, 5e6 ) / 1e6;
-               # Keep keys around longer as fallbacks
-               $staleTTL = 60;
-
-               # (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" );
-                       return $value['lagTimes']; // cache hit
-               }
-               $staleValue = $value ?: false;
-
-               # (b) Check the shared cache and backfill APC
-               $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" );
-
-                       return $value['lagTimes']; // cache hit
-               }
-               $staleValue = $value ?: $staleValue;
-
-               # (c) Cache key missing or expired; regenerate and backfill
-               if ( $this->mainCache->lock( $key, 0, 10 ) ) {
-                       # Let this process alone update the cache value
-                       $cache = $this->mainCache;
-                       /** @noinspection PhpUnusedLocalVariableInspection */
-                       $unlocker = new ScopedCallback( function () use ( $cache, $key ) {
-                               $cache->unlock( $key );
-                       } );
-               } elseif ( $staleValue ) {
-                       # Could not acquire lock but an old cache exists, so use it
-                       return $staleValue['lagTimes'];
-               }
-
-               $lagTimes = array();
-               foreach ( $serverIndexes as $i ) {
-                       if ( $i == 0 ) { # Master
-                               $lagTimes[$i] = 0;
-                       } elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
-                               $lagTimes[$i] = $conn->getLag();
-                       } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
-                               $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,
-                               # which is slightly inefficient, but this only matters for the lag
-                               # time cache miss cache, which is far less common that cache hits.
-                               $this->parent->closeConnection( $conn );
-                       }
-               }
-
-               # Add a timestamp key so we know when it was cached
-               $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)" );
-
-               return $value['lagTimes'];
-       }
-
-       public function clearCaches() {
-               $key = $this->getLagTimeCacheKey();
-               $this->srvCache->delete( $key );
-               $this->mainCache->delete( $key );
-       }
-
-       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 ) );
-       }
-}
diff --git a/includes/db/loadbalancer/LBFactory.php b/includes/db/loadbalancer/LBFactory.php
new file mode 100644 (file)
index 0000000..e5fb094
--- /dev/null
@@ -0,0 +1,239 @@
+<?php
+/**
+ * Generator of database load balancing objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * An interface for generating database load balancers
+ * @ingroup Database
+ */
+abstract class LBFactory {
+       /** @var LBFactory */
+       private static $instance;
+
+       /**
+        * Disables all access to the load balancer, will cause all database access
+        * to throw a DBAccessError
+        */
+       public static function disableBackend() {
+               global $wgLBFactoryConf;
+               self::$instance = new LBFactoryFake( $wgLBFactoryConf );
+       }
+
+       /**
+        * Get an LBFactory instance
+        *
+        * @return LBFactory
+        */
+       public static function singleton() {
+               global $wgLBFactoryConf;
+
+               if ( is_null( self::$instance ) ) {
+                       $class = self::getLBFactoryClass( $wgLBFactoryConf );
+
+                       self::$instance = new $class( $wgLBFactoryConf );
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * Returns the LBFactory class to use and the load balancer configuration.
+        *
+        * @param array $config (e.g. $wgLBFactoryConf)
+        * @return string Class name
+        */
+       public static function getLBFactoryClass( array $config ) {
+               // For configuration backward compatibility after removing
+               // underscores from class names in MediaWiki 1.23.
+               $bcClasses = array(
+                       'LBFactory_Simple' => 'LBFactorySimple',
+                       'LBFactory_Single' => 'LBFactorySingle',
+                       'LBFactory_Multi' => 'LBFactoryMulti',
+                       'LBFactory_Fake' => 'LBFactoryFake',
+               );
+
+               $class = $config['class'];
+
+               if ( isset( $bcClasses[$class] ) ) {
+                       $class = $bcClasses[$class];
+                       wfDeprecated(
+                               '$wgLBFactoryConf must be updated. See RELEASE-NOTES for details',
+                               '1.23'
+                       );
+               }
+
+               return $class;
+       }
+
+       /**
+        * Shut down, close connections and destroy the cached instance.
+        */
+       public static function destroyInstance() {
+               if ( self::$instance ) {
+                       self::$instance->shutdown();
+                       self::$instance->forEachLBCallMethod( 'closeAll' );
+                       self::$instance = null;
+               }
+       }
+
+       /**
+        * Set the instance to be the given object
+        *
+        * @param LBFactory $instance
+        */
+       public static function setInstance( $instance ) {
+               self::destroyInstance();
+               self::$instance = $instance;
+       }
+
+       /**
+        * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
+        * @param array $conf
+        */
+       abstract public function __construct( array $conf );
+
+       /**
+        * Create a new load balancer object. The resulting object will be untracked,
+        * not chronology-protected, and the caller is responsible for cleaning it up.
+        *
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       abstract public function newMainLB( $wiki = false );
+
+       /**
+        * Get a cached (tracked) load balancer object.
+        *
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       abstract public function getMainLB( $wiki = false );
+
+       /**
+        * Create a new load balancer for external storage. The resulting object will be
+        * untracked, not chronology-protected, and the caller is responsible for
+        * cleaning it up.
+        *
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       abstract protected function newExternalLB( $cluster, $wiki = false );
+
+       /**
+        * Get a cached (tracked) load balancer for external storage
+        *
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       abstract public function &getExternalLB( $cluster, $wiki = false );
+
+       /**
+        * Execute a function for each tracked load balancer
+        * The callback is called with the load balancer as the first parameter,
+        * and $params passed as the subsequent parameters.
+        *
+        * @param callable $callback
+        * @param array $params
+        */
+       abstract public function forEachLB( $callback, array $params = array() );
+
+       /**
+        * Prepare all tracked load balancers for shutdown
+        * STUB
+        */
+       public function shutdown() {
+       }
+
+       /**
+        * Call a method of each tracked load balancer
+        *
+        * @param string $methodName
+        * @param array $args
+        */
+       private function forEachLBCallMethod( $methodName, array $args = array() ) {
+               $this->forEachLB( function ( LoadBalancer $loadBalancer, $methodName, array $args ) {
+                       call_user_func_array( array( $loadBalancer, $methodName ), $args );
+               }, array( $methodName, $args ) );
+       }
+
+       /**
+        * Commit on all connections. Done for two reasons:
+        * 1. To commit changes to the masters.
+        * 2. To release the snapshot on all connections, master and slave.
+        */
+       public function commitAll() {
+               $this->forEachLBCallMethod( 'commitAll' );
+       }
+
+       /**
+        * Commit changes on all master connections
+        */
+       public function commitMasterChanges() {
+               $this->forEachLBCallMethod( 'commitMasterChanges' );
+       }
+
+       /**
+        * Rollback changes on all master connections
+        * @since 1.23
+        */
+       public function rollbackMasterChanges() {
+               $this->forEachLBCallMethod( 'rollbackMasterChanges' );
+       }
+
+       /**
+        * Determine if any master connection has pending changes
+        * @return bool
+        * @since 1.23
+        */
+       public function hasMasterChanges() {
+               $ret = false;
+               $this->forEachLB( function ( LoadBalancer $lb ) use ( &$ret ) {
+                       $ret = $ret || $lb->hasMasterChanges();
+               } );
+               return $ret;
+       }
+
+       /**
+        * Determine if any master connection has pending/written changes from this request
+        * @return bool
+        * @since 1.27
+        */
+       public function hasOrMadeRecentMasterChanges() {
+               $ret = false;
+               $this->forEachLB( function ( LoadBalancer $lb ) use ( &$ret ) {
+                       $ret = $ret || $lb->hasOrMadeRecentMasterChanges();
+               } );
+               return $ret;
+       }
+}
+
+/**
+ * Exception class for attempted DB access
+ */
+class DBAccessError extends MWException {
+       public function __construct() {
+               parent::__construct( "Mediawiki tried to access the database via wfGetDB(). " .
+                       "This is not allowed." );
+       }
+}
diff --git a/includes/db/loadbalancer/LBFactoryFake.php b/includes/db/loadbalancer/LBFactoryFake.php
new file mode 100644 (file)
index 0000000..d8becf5
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Generator of database load balancing objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * LBFactory class that throws an error on any attempt to use it.
+ * This will typically be done via wfGetDB().
+ * Call LBFactory::disableBackend() to start using this, and
+ * LBFactory::enableBackend() to return to normal behavior
+ */
+class LBFactoryFake extends LBFactory {
+       public function __construct( array $conf ) {
+       }
+
+       public function newMainLB( $wiki = false ) {
+               throw new DBAccessError;
+       }
+
+       public function getMainLB( $wiki = false ) {
+               throw new DBAccessError;
+       }
+
+       protected function newExternalLB( $cluster, $wiki = false ) {
+               throw new DBAccessError;
+       }
+
+       public function &getExternalLB( $cluster, $wiki = false ) {
+               throw new DBAccessError;
+       }
+
+       public function forEachLB( $callback, array $params = array() ) {
+       }
+}
diff --git a/includes/db/loadbalancer/LBFactoryMulti.php b/includes/db/loadbalancer/LBFactoryMulti.php
new file mode 100644 (file)
index 0000000..6397bca
--- /dev/null
@@ -0,0 +1,400 @@
+<?php
+/**
+ * Advanced generator of database load balancing objects for wiki farms.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * A multi-wiki, multi-master factory for Wikimedia and similar installations.
+ * Ignores the old configuration globals
+ *
+ * Configuration:
+ *     sectionsByDB                A map of database names to section names.
+ *
+ *     sectionLoads                A 2-d map. For each section, gives a map of server names to
+ *                                 load ratios. For example:
+ *                                 array(
+ *                                     'section1' => array(
+ *                                         'db1' => 100,
+ *                                         'db2' => 100
+ *                                     )
+ *                                 )
+ *
+ *     serverTemplate              A server info associative array as documented for $wgDBservers.
+ *                                 The host, hostName and load entries will be overridden.
+ *
+ *     groupLoadsBySection         A 3-d map giving server load ratios for each section and group.
+ *                                 For example:
+ *                                 array(
+ *                                     'section1' => array(
+ *                                         'group1' => array(
+ *                                             'db1' => 100,
+ *                                             'db2' => 100
+ *                                         )
+ *                                     )
+ *                                 )
+ *
+ *     groupLoadsByDB              A 3-d map giving server load ratios by DB name.
+ *
+ *     hostsByName                 A map of hostname to IP address.
+ *
+ *     externalLoads               A map of external storage cluster name to server load map.
+ *
+ *     externalTemplateOverrides   A set of server info keys overriding serverTemplate for external
+ *                                 storage.
+ *
+ *     templateOverridesByServer   A 2-d map overriding serverTemplate and
+ *                                 externalTemplateOverrides on a server-by-server basis. Applies
+ *                                 to both core and external storage.
+ *
+ *     templateOverridesByCluster  A 2-d map overriding the server info by external storage cluster.
+ *
+ *     masterTemplateOverrides     An override array for all master servers.
+ *
+ *     loadMonitorClass            Name of the LoadMonitor class to always use.
+ *
+ *     readOnlyBySection           A map of section name to read-only message.
+ *                                 Missing or false for read/write.
+ *
+ * @ingroup Database
+ */
+class LBFactoryMulti extends LBFactory {
+       // Required settings
+
+       /** @var array A map of database names to section names */
+       private $sectionsByDB;
+
+       /**
+        * @var array A 2-d map. For each section, gives a map of server names to
+        * load ratios
+        */
+       private $sectionLoads;
+
+       /**
+        * @var array A server info associative array as documented for
+        * $wgDBservers. The host, hostName and load entries will be
+        * overridden
+        */
+       private $serverTemplate;
+
+       // Optional settings
+
+       /** @var array A 3-d map giving server load ratios for each section and group */
+       private $groupLoadsBySection = array();
+
+       /** @var array A 3-d map giving server load ratios by DB name */
+       private $groupLoadsByDB = array();
+
+       /** @var array A map of hostname to IP address */
+       private $hostsByName = array();
+
+       /** @var array A map of external storage cluster name to server load map */
+       private $externalLoads = array();
+
+       /**
+        * @var array A set of server info keys overriding serverTemplate for
+        * external storage
+        */
+       private $externalTemplateOverrides;
+
+       /**
+        * @var array A 2-d map overriding serverTemplate and
+        * externalTemplateOverrides on a server-by-server basis. Applies to both
+        * core and external storage
+        */
+       private $templateOverridesByServer;
+
+       /** @var array A 2-d map overriding the server info by external storage cluster */
+       private $templateOverridesByCluster;
+
+       /** @var array An override array for all master servers */
+       private $masterTemplateOverrides;
+
+       /**
+        * @var array|bool A map of section name to read-only message. Missing or
+        * false for read/write
+        */
+       private $readOnlyBySection = array();
+
+       // Other stuff
+
+       /** @var array Load balancer factory configuration */
+       private $conf;
+
+       /** @var LoadBalancer[] */
+       private $mainLBs = array();
+
+       /** @var LoadBalancer[] */
+       private $extLBs = array();
+
+       /** @var string */
+       private $loadMonitorClass;
+
+       /** @var string */
+       private $lastWiki;
+
+       /** @var string */
+       private $lastSection;
+
+       /**
+        * @param array $conf
+        * @throws MWException
+        */
+       public function __construct( array $conf ) {
+               $this->chronProt = new ChronologyProtector;
+               $this->conf = $conf;
+               $required = array( 'sectionsByDB', 'sectionLoads', 'serverTemplate' );
+               $optional = array( 'groupLoadsBySection', 'groupLoadsByDB', 'hostsByName',
+                       'externalLoads', 'externalTemplateOverrides', 'templateOverridesByServer',
+                       'templateOverridesByCluster', 'masterTemplateOverrides',
+                       'readOnlyBySection', 'loadMonitorClass' );
+
+               foreach ( $required as $key ) {
+                       if ( !isset( $conf[$key] ) ) {
+                               throw new MWException( __CLASS__ . ": $key is required in configuration" );
+                       }
+                       $this->$key = $conf[$key];
+               }
+
+               foreach ( $optional as $key ) {
+                       if ( isset( $conf[$key] ) ) {
+                               $this->$key = $conf[$key];
+                       }
+               }
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return string
+        */
+       private function getSectionForWiki( $wiki = false ) {
+               if ( $this->lastWiki === $wiki ) {
+                       return $this->lastSection;
+               }
+               list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
+               if ( isset( $this->sectionsByDB[$dbName] ) ) {
+                       $section = $this->sectionsByDB[$dbName];
+               } else {
+                       $section = 'DEFAULT';
+               }
+               $this->lastSection = $section;
+               $this->lastWiki = $wiki;
+
+               return $section;
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       public function newMainLB( $wiki = false ) {
+               list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
+               $section = $this->getSectionForWiki( $wiki );
+               $groupLoads = array();
+               if ( isset( $this->groupLoadsByDB[$dbName] ) ) {
+                       $groupLoads = $this->groupLoadsByDB[$dbName];
+               }
+
+               if ( isset( $this->groupLoadsBySection[$section] ) ) {
+                       $groupLoads = array_merge_recursive( $groupLoads, $this->groupLoadsBySection[$section] );
+               }
+
+               return $this->newLoadBalancer(
+                       $this->serverTemplate,
+                       $this->sectionLoads[$section],
+                       $groupLoads
+               );
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       public function getMainLB( $wiki = false ) {
+               $section = $this->getSectionForWiki( $wiki );
+               if ( !isset( $this->mainLBs[$section] ) ) {
+                       $lb = $this->newMainLB( $wiki );
+                       $lb->parentInfo( array( 'id' => "main-$section" ) );
+                       $this->chronProt->initLB( $lb );
+                       $this->mainLBs[$section] = $lb;
+               }
+
+               return $this->mainLBs[$section];
+       }
+
+       /**
+        * @param string $cluster
+        * @param bool|string $wiki
+        * @throws MWException
+        * @return LoadBalancer
+        */
+       protected function newExternalLB( $cluster, $wiki = false ) {
+               if ( !isset( $this->externalLoads[$cluster] ) ) {
+                       throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
+               }
+               $template = $this->serverTemplate;
+               if ( isset( $this->externalTemplateOverrides ) ) {
+                       $template = $this->externalTemplateOverrides + $template;
+               }
+               if ( isset( $this->templateOverridesByCluster[$cluster] ) ) {
+                       $template = $this->templateOverridesByCluster[$cluster] + $template;
+               }
+
+               return $this->newLoadBalancer( $template, $this->externalLoads[$cluster], array() );
+       }
+
+       /**
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       public function &getExternalLB( $cluster, $wiki = false ) {
+               if ( !isset( $this->extLBs[$cluster] ) ) {
+                       $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
+                       $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+                       $this->chronProt->initLB( $this->extLBs[$cluster] );
+               }
+
+               return $this->extLBs[$cluster];
+       }
+
+       /**
+        * Make a new load balancer object based on template and load array
+        *
+        * @param array $template
+        * @param array $loads
+        * @param array $groupLoads
+        * @return LoadBalancer
+        */
+       private function newLoadBalancer( $template, $loads, $groupLoads ) {
+               $servers = $this->makeServerArray( $template, $loads, $groupLoads );
+               $lb = new LoadBalancer( array(
+                       'servers' => $servers,
+                       'loadMonitor' => $this->loadMonitorClass
+               ) );
+
+               return $lb;
+       }
+
+       /**
+        * Make a server array as expected by LoadBalancer::__construct, using a template and load array
+        *
+        * @param array $template
+        * @param array $loads
+        * @param array $groupLoads
+        * @return array
+        */
+       private function makeServerArray( $template, $loads, $groupLoads ) {
+               $servers = array();
+               $master = true;
+               $groupLoadsByServer = $this->reindexGroupLoads( $groupLoads );
+               foreach ( $groupLoadsByServer as $server => $stuff ) {
+                       if ( !isset( $loads[$server] ) ) {
+                               $loads[$server] = 0;
+                       }
+               }
+               foreach ( $loads as $serverName => $load ) {
+                       $serverInfo = $template;
+                       if ( $master ) {
+                               $serverInfo['master'] = true;
+                               if ( isset( $this->masterTemplateOverrides ) ) {
+                                       $serverInfo = $this->masterTemplateOverrides + $serverInfo;
+                               }
+                               $master = false;
+                       } else {
+                               $serverInfo['slave'] = true;
+                       }
+                       if ( isset( $this->templateOverridesByServer[$serverName] ) ) {
+                               $serverInfo = $this->templateOverridesByServer[$serverName] + $serverInfo;
+                       }
+                       if ( isset( $groupLoadsByServer[$serverName] ) ) {
+                               $serverInfo['groupLoads'] = $groupLoadsByServer[$serverName];
+                       }
+                       if ( isset( $this->hostsByName[$serverName] ) ) {
+                               $serverInfo['host'] = $this->hostsByName[$serverName];
+                       } else {
+                               $serverInfo['host'] = $serverName;
+                       }
+                       $serverInfo['hostName'] = $serverName;
+                       $serverInfo['load'] = $load;
+                       $servers[] = $serverInfo;
+               }
+
+               return $servers;
+       }
+
+       /**
+        * Take a group load array indexed by group then server, and reindex it by server then group
+        * @param array $groupLoads
+        * @return array
+        */
+       private function reindexGroupLoads( $groupLoads ) {
+               $reindexed = array();
+               foreach ( $groupLoads as $group => $loads ) {
+                       foreach ( $loads as $server => $load ) {
+                               $reindexed[$server][$group] = $load;
+                       }
+               }
+
+               return $reindexed;
+       }
+
+       /**
+        * Get the database name and prefix based on the wiki ID
+        * @param bool|string $wiki
+        * @return array
+        */
+       private function getDBNameAndPrefix( $wiki = false ) {
+               if ( $wiki === false ) {
+                       global $wgDBname, $wgDBprefix;
+
+                       return array( $wgDBname, $wgDBprefix );
+               } else {
+                       return wfSplitWikiID( $wiki );
+               }
+       }
+
+       /**
+        * Execute a function for each tracked load balancer
+        * The callback is called with the load balancer as the first parameter,
+        * and $params passed as the subsequent parameters.
+        * @param callable $callback
+        * @param array $params
+        */
+       public function forEachLB( $callback, array $params = array() ) {
+               foreach ( $this->mainLBs as $lb ) {
+                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
+               }
+               foreach ( $this->extLBs as $lb ) {
+                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
+               }
+       }
+
+       public function shutdown() {
+               foreach ( $this->mainLBs as $lb ) {
+                       $this->chronProt->shutdownLB( $lb );
+               }
+               foreach ( $this->extLBs as $extLB ) {
+                       $this->chronProt->shutdownLB( $extLB );
+               }
+               $this->chronProt->shutdown();
+               $this->commitMasterChanges();
+       }
+}
diff --git a/includes/db/loadbalancer/LBFactorySimple.php b/includes/db/loadbalancer/LBFactorySimple.php
new file mode 100644 (file)
index 0000000..90c33b0
--- /dev/null
@@ -0,0 +1,168 @@
+<?php
+/**
+ * Generator of database load balancing objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * A simple single-master LBFactory that gets its configuration from the b/c globals
+ */
+class LBFactorySimple extends LBFactory {
+       /** @var LoadBalancer */
+       private $mainLB;
+       /** @var LoadBalancer[] */
+       private $extLBs = array();
+       /** @var ChronologyProtector */
+       private $chronProt;
+
+       /** @var string */
+       private $loadMonitorClass;
+
+       public function __construct( array $conf ) {
+               $this->chronProt = new ChronologyProtector;
+               $this->loadMonitorClass = isset( $conf['loadMonitorClass'] )
+                       ? $conf['loadMonitorClass']
+                       : null;
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       public function newMainLB( $wiki = false ) {
+               global $wgDBservers;
+
+               if ( is_array( $wgDBservers ) ) {
+                       $servers = $wgDBservers;
+                       foreach ( $servers as $i => &$server ) {
+                               if ( $i == 0 ) {
+                                       $server['master'] = true;
+                               } else {
+                                       $server['slave'] = true;
+                               }
+                       }
+               } else {
+                       global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgDebugDumpSql;
+                       global $wgDBssl, $wgDBcompress;
+
+                       $flags = DBO_DEFAULT;
+                       if ( $wgDebugDumpSql ) {
+                               $flags |= DBO_DEBUG;
+                       }
+                       if ( $wgDBssl ) {
+                               $flags |= DBO_SSL;
+                       }
+                       if ( $wgDBcompress ) {
+                               $flags |= DBO_COMPRESS;
+                       }
+
+                       $servers = array( array(
+                               'host' => $wgDBserver,
+                               'user' => $wgDBuser,
+                               'password' => $wgDBpassword,
+                               'dbname' => $wgDBname,
+                               'type' => $wgDBtype,
+                               'load' => 1,
+                               'flags' => $flags,
+                               'master' => true
+                       ) );
+               }
+
+               return new LoadBalancer( array(
+                       'servers' => $servers,
+                       'loadMonitor' => $this->loadMonitorClass
+               ) );
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       public function getMainLB( $wiki = false ) {
+               if ( !isset( $this->mainLB ) ) {
+                       $this->mainLB = $this->newMainLB( $wiki );
+                       $this->mainLB->parentInfo( array( 'id' => 'main' ) );
+                       $this->chronProt->initLB( $this->mainLB );
+               }
+
+               return $this->mainLB;
+       }
+
+       /**
+        * @throws MWException
+        * @param string $cluster
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       protected function newExternalLB( $cluster, $wiki = false ) {
+               global $wgExternalServers;
+               if ( !isset( $wgExternalServers[$cluster] ) ) {
+                       throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
+               }
+
+               return new LoadBalancer( array(
+                       'servers' => $wgExternalServers[$cluster],
+                       'loadMonitor' => $this->loadMonitorClass
+               ) );
+       }
+
+       /**
+        * @param string $cluster
+        * @param bool|string $wiki
+        * @return array
+        */
+       public function &getExternalLB( $cluster, $wiki = false ) {
+               if ( !isset( $this->extLBs[$cluster] ) ) {
+                       $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
+                       $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+                       $this->chronProt->initLB( $this->extLBs[$cluster] );
+               }
+
+               return $this->extLBs[$cluster];
+       }
+
+       /**
+        * Execute a function for each tracked load balancer
+        * The callback is called with the load balancer as the first parameter,
+        * and $params passed as the subsequent parameters.
+        *
+        * @param callable $callback
+        * @param array $params
+        */
+       public function forEachLB( $callback, array $params = array() ) {
+               if ( isset( $this->mainLB ) ) {
+                       call_user_func_array( $callback, array_merge( array( $this->mainLB ), $params ) );
+               }
+               foreach ( $this->extLBs as $lb ) {
+                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
+               }
+       }
+
+       public function shutdown() {
+               if ( $this->mainLB ) {
+                       $this->chronProt->shutdownLB( $this->mainLB );
+               }
+               foreach ( $this->extLBs as $extLB ) {
+                       $this->chronProt->shutdownLB( $extLB );
+               }
+               $this->chronProt->shutdown();
+               $this->commitMasterChanges();
+       }
+}
diff --git a/includes/db/loadbalancer/LBFactorySingle.php b/includes/db/loadbalancer/LBFactorySingle.php
new file mode 100644 (file)
index 0000000..a41dadf
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Simple generator of database connections that always returns the same object.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * An LBFactory class that always returns a single database object.
+ */
+class LBFactorySingle extends LBFactory {
+       /** @var LoadBalancerSingle */
+       private $lb;
+
+       /**
+        * @param array $conf An associative array with one member:
+        *  - connection: The DatabaseBase connection object
+        */
+       public function __construct( array $conf ) {
+               $this->lb = new LoadBalancerSingle( $conf );
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancerSingle
+        */
+       public function newMainLB( $wiki = false ) {
+               return $this->lb;
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancerSingle
+        */
+       public function getMainLB( $wiki = false ) {
+               return $this->lb;
+       }
+
+       /**
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancerSingle
+        */
+       protected function newExternalLB( $cluster, $wiki = false ) {
+               return $this->lb;
+       }
+
+       /**
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancerSingle
+        */
+       public function &getExternalLB( $cluster, $wiki = false ) {
+               return $this->lb;
+       }
+
+       /**
+        * @param string|callable $callback
+        * @param array $params
+        */
+       public function forEachLB( $callback, array $params = array() ) {
+               call_user_func_array( $callback, array_merge( array( $this->lb ), $params ) );
+       }
+}
+
+/**
+ * Helper class for LBFactorySingle.
+ */
+class LoadBalancerSingle extends LoadBalancer {
+       /** @var DatabaseBase */
+       private $db;
+
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params ) {
+               $this->db = $params['connection'];
+               parent::__construct( array( 'servers' => array( array(
+                       'type' => $this->db->getType(),
+                       'host' => $this->db->getServer(),
+                       'dbname' => $this->db->getDBname(),
+                       'load' => 1,
+               ) ) ) );
+       }
+
+       /**
+        *
+        * @param string $server
+        * @param bool $dbNameOverride
+        *
+        * @return DatabaseBase
+        */
+       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
+               return $this->db;
+       }
+}
diff --git a/includes/db/loadbalancer/LoadBalancer.php b/includes/db/loadbalancer/LoadBalancer.php
new file mode 100644 (file)
index 0000000..a0ef753
--- /dev/null
@@ -0,0 +1,1272 @@
+<?php
+/**
+ * Database load balancing.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Database load balancing object
+ *
+ * @todo document
+ * @ingroup Database
+ */
+class LoadBalancer {
+       /** @var array[] Map of (server index => server config array) */
+       private $mServers;
+       /** @var array[] Map of (local/foreignUsed/foreignFree => server index => DatabaseBase array) */
+       private $mConns;
+       /** @var array Map of (server index => weight) */
+       private $mLoads;
+       /** @var array[] Map of (group => server index => weight) */
+       private $mGroupLoads;
+       /** @var bool Whether to disregard slave lag as a factor in slave selection */
+       private $mAllowLagged;
+       /** @var integer Seconds to spend waiting on slave lag to resolve */
+       private $mWaitTimeout;
+
+       /** @var array LBFactory information */
+       private $mParentInfo;
+       /** @var string The LoadMonitor subclass name */
+       private $mLoadMonitorClass;
+       /** @var LoadMonitor */
+       private $mLoadMonitor;
+
+       /** @var bool|DatabaseBase Database connection that caused a problem */
+       private $mErrorConnection;
+       /** @var integer The generic (not query grouped) slave index (of $mServers) */
+       private $mReadIndex;
+       /** @var bool|DBMasterPos False if not set */
+       private $mWaitForPos;
+       /** @var bool Whether the generic reader fell back to a lagged slave */
+       private $mLaggedSlaveMode;
+       /** @var string The last DB selection or connection error */
+       private $mLastError = 'Unknown error';
+       /** @var integer Total connections opened */
+       private $connsOpened = 0;
+
+       /** @var integer Warn when this many connection are held */
+       const CONN_HELD_WARN_THRESHOLD = 10;
+
+       /**
+        * @param array $params Array with keys:
+        *   servers           Required. Array of server info structures.
+        *   loadMonitor       Name of a class used to fetch server lag and load.
+        * @throws MWException
+        */
+       public function __construct( array $params ) {
+               if ( !isset( $params['servers'] ) ) {
+                       throw new MWException( __CLASS__ . ': missing servers parameter' );
+               }
+               $this->mServers = $params['servers'];
+               $this->mWaitTimeout = 10;
+
+               $this->mReadIndex = -1;
+               $this->mWriteIndex = -1;
+               $this->mConns = array(
+                       'local' => array(),
+                       'foreignUsed' => array(),
+                       'foreignFree' => array() );
+               $this->mLoads = array();
+               $this->mWaitForPos = false;
+               $this->mLaggedSlaveMode = false;
+               $this->mErrorConnection = false;
+               $this->mAllowLagged = false;
+
+               if ( isset( $params['loadMonitor'] ) ) {
+                       $this->mLoadMonitorClass = $params['loadMonitor'];
+               } else {
+                       $master = reset( $params['servers'] );
+                       if ( isset( $master['type'] ) && $master['type'] === 'mysql' ) {
+                               $this->mLoadMonitorClass = 'LoadMonitorMySQL';
+                       } else {
+                               $this->mLoadMonitorClass = 'LoadMonitorNull';
+                       }
+               }
+
+               foreach ( $params['servers'] as $i => $server ) {
+                       $this->mLoads[$i] = $server['load'];
+                       if ( isset( $server['groupLoads'] ) ) {
+                               foreach ( $server['groupLoads'] as $group => $ratio ) {
+                                       if ( !isset( $this->mGroupLoads[$group] ) ) {
+                                               $this->mGroupLoads[$group] = array();
+                                       }
+                                       $this->mGroupLoads[$group][$i] = $ratio;
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Get a LoadMonitor instance
+        *
+        * @return LoadMonitor
+        */
+       private function getLoadMonitor() {
+               if ( !isset( $this->mLoadMonitor ) ) {
+                       $class = $this->mLoadMonitorClass;
+                       $this->mLoadMonitor = new $class( $this );
+               }
+
+               return $this->mLoadMonitor;
+       }
+
+       /**
+        * Get or set arbitrary data used by the parent object, usually an LBFactory
+        * @param mixed $x
+        * @return mixed
+        */
+       public function parentInfo( $x = null ) {
+               return wfSetVar( $this->mParentInfo, $x );
+       }
+
+       /**
+        * Given an array of non-normalised probabilities, this function will select
+        * an element and return the appropriate key
+        *
+        * @deprecated since 1.21, use ArrayUtils::pickRandom()
+        *
+        * @param array $weights
+        * @return bool|int|string
+        */
+       public function pickRandom( array $weights ) {
+               return ArrayUtils::pickRandom( $weights );
+       }
+
+       /**
+        * @param array $loads
+        * @param bool|string $wiki Wiki to get non-lagged for
+        * @param float $maxLag Restrict the maximum allowed lag to this many seconds
+        * @return bool|int|string
+        */
+       private function getRandomNonLagged( array $loads, $wiki = false, $maxLag = INF ) {
+               $lags = $this->getLagTimes( $wiki );
+
+               # Unset excessively lagged servers
+               foreach ( $lags as $i => $lag ) {
+                       if ( $i != 0 ) {
+                               $maxServerLag = $maxLag;
+                               if ( isset( $this->mServers[$i]['max lag'] ) ) {
+                                       $maxServerLag = min( $maxServerLag, $this->mServers[$i]['max lag'] );
+                               }
+                               if ( $lag === false ) {
+                                       wfDebugLog( 'replication', "Server #$i is not replicating" );
+                                       unset( $loads[$i] );
+                               } elseif ( $lag > $maxServerLag ) {
+                                       wfDebugLog( 'replication', "Server #$i is excessively lagged ($lag seconds)" );
+                                       unset( $loads[$i] );
+                               }
+                       }
+               }
+
+               # Find out if all the slaves with non-zero load are lagged
+               $sum = 0;
+               foreach ( $loads as $load ) {
+                       $sum += $load;
+               }
+               if ( $sum == 0 ) {
+                       # No appropriate DB servers except maybe the master and some slaves with zero load
+                       # Do NOT use the master
+                       # Instead, this function will return false, triggering read-only mode,
+                       # and a lagged slave will be used instead.
+                       return false;
+               }
+
+               if ( count( $loads ) == 0 ) {
+                       return false;
+               }
+
+               # wfDebugLog( 'connect', var_export( $loads, true ) );
+
+               # Return a random representative of the remainder
+               return ArrayUtils::pickRandom( $loads );
+       }
+
+       /**
+        * Get the index of the reader connection, which may be a slave
+        * This takes into account load ratios and lag times. It should
+        * always return a consistent index during a given invocation
+        *
+        * Side effect: opens connections to databases
+        * @param string|bool $group Query group, or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @throws MWException
+        * @return bool|int|string
+        */
+       public function getReaderIndex( $group = false, $wiki = false ) {
+               global $wgDBtype;
+
+               # @todo FIXME: For now, only go through all this for mysql databases
+               if ( $wgDBtype != 'mysql' ) {
+                       return $this->getWriterIndex();
+               }
+
+               if ( count( $this->mServers ) == 1 ) {
+                       # Skip the load balancing if there's only one server
+                       return 0;
+               } elseif ( $group === false && $this->mReadIndex >= 0 ) {
+                       # Shortcut if generic reader exists already
+                       return $this->mReadIndex;
+               }
+
+               # Find the relevant load array
+               if ( $group !== false ) {
+                       if ( isset( $this->mGroupLoads[$group] ) ) {
+                               $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" );
+
+                               return false;
+                       }
+               } else {
+                       $nonErrorLoads = $this->mLoads;
+               }
+
+               if ( !count( $nonErrorLoads ) ) {
+                       throw new MWException( "Empty server array given to LoadBalancer" );
+               }
+
+               # Scale the configured load ratios according to the dynamic load (if the load monitor supports it)
+               $this->getLoadMonitor()->scaleLoads( $nonErrorLoads, $group, $wiki );
+
+               $laggedSlaveMode = false;
+
+               # No server found yet
+               $i = false;
+               $conn = false;
+               # First try quickly looking through the available servers for a server that
+               # meets our criteria
+               $currentLoads = $nonErrorLoads;
+               while ( count( $currentLoads ) ) {
+                       if ( $this->mAllowLagged || $laggedSlaveMode ) {
+                               $i = ArrayUtils::pickRandom( $currentLoads );
+                       } else {
+                               $i = false;
+                               if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) {
+                                       # ChronologyProtecter causes mWaitForPos to be set via sessions.
+                                       # This triggers doWait() after connect, so it's especially good to
+                                       # avoid lagged servers so as to avoid just blocking in that method.
+                                       $ago = microtime( true ) - $this->mWaitForPos->asOfTime();
+                                       # Aim for <= 1 second of waiting (being too picky can backfire)
+                                       $i = $this->getRandomNonLagged( $currentLoads, $wiki, $ago + 1 );
+                               }
+                               if ( $i === false ) {
+                                       # Any server with less lag than it's 'max lag' param is preferable
+                                       $i = $this->getRandomNonLagged( $currentLoads, $wiki );
+                               }
+                               if ( $i === false && count( $currentLoads ) != 0 ) {
+                                       # All slaves lagged. Switch to read-only mode
+                                       wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode" );
+                                       $i = ArrayUtils::pickRandom( $currentLoads );
+                                       $laggedSlaveMode = true;
+                               }
+                       }
+
+                       if ( $i === false ) {
+                               # pickRandom() returned false
+                               # This is permanent and means the configuration or the load monitor
+                               # wants us to return false.
+                               wfDebugLog( 'connect', __METHOD__ . ": pickRandom() returned false" );
+
+                               return false;
+                       }
+
+                       $serverName = $this->getServerName( $i );
+                       wfDebugLog( 'connect', __METHOD__ . ": Using reader #$i: $serverName..." );
+
+                       $conn = $this->openConnection( $i, $wiki );
+                       if ( !$conn ) {
+                               wfDebugLog( 'connect', __METHOD__ . ": Failed connecting to $i/$wiki" );
+                               unset( $nonErrorLoads[$i] );
+                               unset( $currentLoads[$i] );
+                               $i = false;
+                               continue;
+                       }
+
+                       // Decrement reference counter, we are finished with this connection.
+                       // It will be incremented for the caller later.
+                       if ( $wiki !== false ) {
+                               $this->reuseConnection( $conn );
+                       }
+
+                       # Return this server
+                       break;
+               }
+
+               # If all servers were down, quit now
+               if ( !count( $nonErrorLoads ) ) {
+                       wfDebugLog( 'connect', "All servers down" );
+               }
+
+               if ( $i !== false ) {
+                       # Slave connection successful
+                       # Wait for the session master pos for a short time
+                       if ( $this->mWaitForPos && $i > 0 ) {
+                               if ( !$this->doWait( $i ) ) {
+                                       $this->mServers[$i]['slave pos'] = $conn->getSlavePos();
+                               }
+                       }
+                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
+                               $this->mReadIndex = $i;
+                               # Record if the generic reader index is in "lagged slave" mode
+                               if ( $laggedSlaveMode ) {
+                                       $this->mLaggedSlaveMode = true;
+                               }
+                       }
+                       $serverName = $this->getServerName( $i );
+                       wfDebug( __METHOD__ . ": using server $serverName for group '$group'\n" );
+               }
+
+               return $i;
+       }
+
+       /**
+        * Set the master wait position
+        * If a DB_SLAVE connection has been opened already, waits
+        * Otherwise sets a variable telling it to wait if such a connection is opened
+        * @param DBMasterPos $pos
+        */
+       public function waitFor( $pos ) {
+               $this->mWaitForPos = $pos;
+               $i = $this->mReadIndex;
+
+               if ( $i > 0 ) {
+                       if ( !$this->doWait( $i ) ) {
+                               $this->mServers[$i]['slave pos'] = $this->getAnyOpenConnection( $i )->getSlavePos();
+                               $this->mLaggedSlaveMode = true;
+                       }
+               }
+       }
+
+       /**
+        * Set the master wait position and wait for a "generic" slave to catch up to it
+        *
+        * This can be used a faster proxy for waitForAll()
+        *
+        * @param DBMasterPos $pos
+        * @param int $timeout Max seconds to wait; default is mWaitTimeout
+        * @return bool Success (able to connect and no timeouts reached)
+        * @since 1.26
+        */
+       public function waitForOne( $pos, $timeout = null ) {
+               $this->mWaitForPos = $pos;
+
+               $i = $this->mReadIndex;
+               if ( $i <= 0 ) {
+                       // Pick a generic slave if there isn't one yet
+                       $readLoads = $this->mLoads;
+                       unset( $readLoads[$this->getWriterIndex()] ); // slaves only
+                       $readLoads = array_filter( $readLoads ); // with non-zero load
+                       $i = ArrayUtils::pickRandom( $readLoads );
+               }
+
+               if ( $i > 0 ) {
+                       $ok = $this->doWait( $i, true, $timeout );
+               } else {
+                       $ok = true; // no applicable loads
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Set the master wait position and wait for ALL slaves to catch up to it
+        * @param DBMasterPos $pos
+        * @param int $timeout Max seconds to wait; default is mWaitTimeout
+        * @return bool Success (able to connect and no timeouts reached)
+        */
+       public function waitForAll( $pos, $timeout = null ) {
+               $this->mWaitForPos = $pos;
+               $serverCount = count( $this->mServers );
+
+               $ok = true;
+               for ( $i = 1; $i < $serverCount; $i++ ) {
+                       if ( $this->mLoads[$i] > 0 ) {
+                               $ok = $this->doWait( $i, true, $timeout ) && $ok;
+                       }
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Get any open connection to a given server index, local or foreign
+        * Returns false if there is no connection open
+        *
+        * @param int $i
+        * @return DatabaseBase|bool False on failure
+        */
+       public function getAnyOpenConnection( $i ) {
+               foreach ( $this->mConns as $conns ) {
+                       if ( !empty( $conns[$i] ) ) {
+                               return reset( $conns[$i] );
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Wait for a given slave to catch up to the master pos stored in $this
+        * @param int $index Server index
+        * @param bool $open Check the server even if a new connection has to be made
+        * @param int $timeout Max seconds to wait; default is mWaitTimeout
+        * @return bool
+        */
+       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
+               $conn = $this->getAnyOpenConnection( $index );
+               if ( !$conn ) {
+                       if ( !$open ) {
+                               wfDebug( __METHOD__ . ": no connection open\n" );
+
+                               return false;
+                       } else {
+                               $conn = $this->openConnection( $index, '' );
+                               if ( !$conn ) {
+                                       wfDebug( __METHOD__ . ": failed to open connection\n" );
+
+                                       return false;
+                               }
+                               // Avoid connection spam in waitForAll() when connections
+                               // are made just for the sake of doing this lag check.
+                               $close = true;
+                       }
+               }
+
+               wfDebug( __METHOD__ . ": Waiting for slave #$index 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 );
+                       $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
+                       wfDebug( "$msg\n" );
+                       wfDebugLog( 'DBPerformance', "$msg:\n" . wfBacktrace( true ) );
+                       $ok = false;
+               } else {
+                       wfDebug( __METHOD__ . ": Done\n" );
+                       $ok = true;
+               }
+
+               if ( $close ) {
+                       $this->closeConnection( $conn );
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Get a connection by index
+        * This is the main entry point for this class.
+        *
+        * @param int $i Server index
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        *
+        * @throws MWException
+        * @return DatabaseBase
+        */
+       public function getConnection( $i, $groups = array(), $wiki = false ) {
+               if ( $i === null || $i === false ) {
+                       throw new MWException( 'Attempt to call ' . __METHOD__ .
+                               ' with invalid server index' );
+               }
+
+               if ( $wiki === wfWikiID() ) {
+                       $wiki = false;
+               }
+
+               $groups = ( $groups === false || $groups === array() )
+                       ? array( false ) // check one "group": the generic pool
+                       : (array)$groups;
+
+               $masterOnly = ( $i == DB_MASTER || $i == $this->getWriterIndex() );
+               $oldConnsOpened = $this->connsOpened; // connections open now
+
+               if ( $i == DB_MASTER ) {
+                       $i = $this->getWriterIndex();
+               } else {
+                       # Try to find an available server in any the query groups (in order)
+                       foreach ( $groups as $group ) {
+                               $groupIndex = $this->getReaderIndex( $group, $wiki );
+                               if ( $groupIndex !== false ) {
+                                       $i = $groupIndex;
+                                       break;
+                               }
+                       }
+               }
+
+               # Operation-based index
+               if ( $i == DB_SLAVE ) {
+                       $this->mLastError = 'Unknown error'; // reset error string
+                       # Try the general server pool if $groups are unavailable.
+                       $i = in_array( false, $groups, true )
+                               ? false // don't bother with this if that is what was tried above
+                               : $this->getReaderIndex( false, $wiki );
+                       # Couldn't find a working server in getReaderIndex()?
+                       if ( $i === false ) {
+                               $this->mLastError = 'No working slave server: ' . $this->mLastError;
+
+                               return $this->reportConnectionError();
+                       }
+               }
+
+               # Now we have an explicit index into the servers array
+               $conn = $this->openConnection( $i, $wiki );
+               if ( !$conn ) {
+                       return $this->reportConnectionError();
+               }
+
+               # Profile any new connections that happen
+               if ( $this->connsOpened > $oldConnsOpened ) {
+                       $host = $conn->getServer();
+                       $dbname = $conn->getDBname();
+                       $trxProf = Profiler::instance()->getTransactionProfiler();
+                       $trxProf->recordConnection( $host, $dbname, $masterOnly );
+               }
+
+               return $conn;
+       }
+
+       /**
+        * Mark a foreign connection as being available for reuse under a different
+        * DB name or prefix. This mechanism is reference-counted, and must be called
+        * the same number of times as getConnection() to work.
+        *
+        * @param DatabaseBase $conn
+        * @throws MWException
+        */
+       public function reuseConnection( $conn ) {
+               $serverIndex = $conn->getLBInfo( 'serverIndex' );
+               $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 ) {
+                        *     $conn = $lb->getConnection( DB_SLAVE, array(), $db );
+                        *     ...
+                        *     $lb->reuseConnection( $conn );
+                        *   }
+                        * When a connection to the local DB is opened in this way, reuseConnection()
+                        * should be ignored
+                        */
+
+                       return;
+               }
+
+               $dbName = $conn->getDBname();
+               $prefix = $conn->tablePrefix();
+               if ( strval( $prefix ) !== '' ) {
+                       $wiki = "$dbName-$prefix";
+               } else {
+                       $wiki = $dbName;
+               }
+               if ( $this->mConns['foreignUsed'][$serverIndex][$wiki] !== $conn ) {
+                       throw new MWException( __METHOD__ . ": connection not found, has " .
+                               "the connection been freed already?" );
+               }
+               $conn->setLBInfo( 'foreignPoolRefCount', --$refCount );
+               if ( $refCount <= 0 ) {
+                       $this->mConns['foreignFree'][$serverIndex][$wiki] = $conn;
+                       unset( $this->mConns['foreignUsed'][$serverIndex][$wiki] );
+                       wfDebug( __METHOD__ . ": freed connection $serverIndex/$wiki\n" );
+               } else {
+                       wfDebug( __METHOD__ . ": reference count for $serverIndex/$wiki reduced to $refCount\n" );
+               }
+       }
+
+       /**
+        * Get a database connection handle reference
+        *
+        * The handle's methods wrap simply wrap those of a DatabaseBase handle
+        *
+        * @see LoadBalancer::getConnection() for parameter information
+        *
+        * @param int $db
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @return DBConnRef
+        */
+       public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
+               return new DBConnRef( $this, $this->getConnection( $db, $groups, $wiki ) );
+       }
+
+       /**
+        * Get a database connection handle reference without connecting yet
+        *
+        * The handle's methods wrap simply wrap those of a DatabaseBase handle
+        *
+        * @see LoadBalancer::getConnection() for parameter information
+        *
+        * @param int $db
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @return DBConnRef
+        */
+       public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
+               return new DBConnRef( $this, array( $db, $groups, $wiki ) );
+       }
+
+       /**
+        * Open a connection to the server given by the specified index
+        * Index must be an actual index into the array.
+        * If the server is already open, returns it.
+        *
+        * On error, returns false, and the connection which caused the
+        * error will be available via $this->mErrorConnection.
+        *
+        * @param int $i Server index
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @return DatabaseBase
+        *
+        * @access private
+        */
+       public function openConnection( $i, $wiki = false ) {
+               if ( $wiki !== false ) {
+                       $conn = $this->openForeignConnection( $i, $wiki );
+               } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
+                       $conn = $this->mConns['local'][$i][0];
+               } else {
+                       $server = $this->mServers[$i];
+                       $server['serverIndex'] = $i;
+                       $conn = $this->reallyOpenConnection( $server, false );
+                       $serverName = $this->getServerName( $i );
+                       if ( $conn->isOpen() ) {
+                               wfDebug( "Connected to database $i at $serverName\n" );
+                               $this->mConns['local'][$i][0] = $conn;
+                       } else {
+                               wfDebug( "Failed to connect to database $i at $serverName\n" );
+                               $this->mErrorConnection = $conn;
+                               $conn = false;
+                       }
+               }
+
+               if ( $conn && !$conn->isOpen() ) {
+                       // Connection was made but later unrecoverably lost for some reason.
+                       // Do not return a handle that will just throw exceptions on use,
+                       // but let the calling code (e.g. getReaderIndex) try another server.
+                       // See DatabaseMyslBase::ping() for how this can happen.
+                       $this->mErrorConnection = $conn;
+                       $conn = false;
+               }
+
+               return $conn;
+       }
+
+       /**
+        * Open a connection to a foreign DB, or return one if it is already open.
+        *
+        * Increments a reference count on the returned connection which locks the
+        * connection to the requested wiki. This reference count can be
+        * decremented by calling reuseConnection().
+        *
+        * If a connection is open to the appropriate server already, but with the wrong
+        * database, it will be switched to the right database and returned, as long as
+        * it has been freed first with reuseConnection().
+        *
+        * On error, returns false, and the connection which caused the
+        * error will be available via $this->mErrorConnection.
+        *
+        * @param int $i Server index
+        * @param string $wiki Wiki ID to open
+        * @return DatabaseBase
+        */
+       private function openForeignConnection( $i, $wiki ) {
+               list( $dbName, $prefix ) = wfSplitWikiID( $wiki );
+               if ( isset( $this->mConns['foreignUsed'][$i][$wiki] ) ) {
+                       // Reuse an already-used connection
+                       $conn = $this->mConns['foreignUsed'][$i][$wiki];
+                       wfDebug( __METHOD__ . ": reusing connection $i/$wiki\n" );
+               } elseif ( isset( $this->mConns['foreignFree'][$i][$wiki] ) ) {
+                       // Reuse a free connection for the same wiki
+                       $conn = $this->mConns['foreignFree'][$i][$wiki];
+                       unset( $this->mConns['foreignFree'][$i][$wiki] );
+                       $this->mConns['foreignUsed'][$i][$wiki] = $conn;
+                       wfDebug( __METHOD__ . ": reusing free connection $i/$wiki\n" );
+               } elseif ( !empty( $this->mConns['foreignFree'][$i] ) ) {
+                       // Reuse a connection from another wiki
+                       $conn = reset( $this->mConns['foreignFree'][$i] );
+                       $oldWiki = key( $this->mConns['foreignFree'][$i] );
+
+                       // The empty string as a DB name means "don't care".
+                       // DatabaseMysqlBase::open() already handle this on connection.
+                       if ( $dbName !== '' && !$conn->selectDB( $dbName ) ) {
+                               $this->mLastError = "Error selecting database $dbName on server " .
+                                       $conn->getServer() . " from client host " . wfHostname() . "\n";
+                               $this->mErrorConnection = $conn;
+                               $conn = false;
+                       } else {
+                               $conn->tablePrefix( $prefix );
+                               unset( $this->mConns['foreignFree'][$i][$oldWiki] );
+                               $this->mConns['foreignUsed'][$i][$wiki] = $conn;
+                               wfDebug( __METHOD__ . ": reusing free connection from $oldWiki for $wiki\n" );
+                       }
+               } else {
+                       // Open a new connection
+                       $server = $this->mServers[$i];
+                       $server['serverIndex'] = $i;
+                       $server['foreignPoolRefCount'] = 0;
+                       $server['foreign'] = true;
+                       $conn = $this->reallyOpenConnection( $server, $dbName );
+                       if ( !$conn->isOpen() ) {
+                               wfDebug( __METHOD__ . ": error opening connection for $i/$wiki\n" );
+                               $this->mErrorConnection = $conn;
+                               $conn = false;
+                       } else {
+                               $conn->tablePrefix( $prefix );
+                               $this->mConns['foreignUsed'][$i][$wiki] = $conn;
+                               wfDebug( __METHOD__ . ": opened new connection for $i/$wiki\n" );
+                       }
+               }
+
+               // Increment reference count
+               if ( $conn ) {
+                       $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
+                       $conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
+               }
+
+               return $conn;
+       }
+
+       /**
+        * Test if the specified index represents an open connection
+        *
+        * @param int $index Server index
+        * @access private
+        * @return bool
+        */
+       private function isOpen( $index ) {
+               if ( !is_integer( $index ) ) {
+                       return false;
+               }
+
+               return (bool)$this->getAnyOpenConnection( $index );
+       }
+
+       /**
+        * Really opens a connection. Uncached.
+        * Returns a Database object whether or not the connection was successful.
+        * @access private
+        *
+        * @param array $server
+        * @param bool $dbNameOverride
+        * @throws MWException
+        * @return DatabaseBase
+        */
+       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
+               if ( !is_array( $server ) ) {
+                       throw new MWException( 'You must update your load-balancing configuration. ' .
+                               'See DefaultSettings.php entry for $wgDBservers.' );
+               }
+
+               if ( $dbNameOverride !== false ) {
+                       $server['dbname'] = $dbNameOverride;
+               }
+
+               // Log when many connection are made on requests
+               if ( ++$this->connsOpened >= self::CONN_HELD_WARN_THRESHOLD ) {
+                       $masterAddr = $this->getServerName( 0 );
+                       wfDebugLog( 'DBPerformance', __METHOD__ . ": " .
+                               "{$this->connsOpened}+ connections made (master=$masterAddr)\n" .
+                               wfBacktrace( true ) );
+               }
+
+               # Create object
+               try {
+                       $db = DatabaseBase::factory( $server['type'], $server );
+               } catch ( DBConnectionError $e ) {
+                       // FIXME: This is probably the ugliest thing I have ever done to
+                       // PHP. I'm half-expecting it to segfault, just out of disgust. -- TS
+                       $db = $e->db;
+               }
+
+               $db->setLBInfo( $server );
+
+               return $db;
+       }
+
+       /**
+        * @throws DBConnectionError
+        * @return bool
+        */
+       private function reportConnectionError() {
+               $conn = $this->mErrorConnection; // The connection which caused the error
+               $context = array(
+                       'method' => __METHOD__,
+                       'last_error' => $this->mLastError,
+               );
+
+               if ( !is_object( $conn ) ) {
+                       // No last connection, probably due to all servers being too busy
+                       wfLogDBError(
+                               "LB failure with no last connection. Connection error: {last_error}",
+                               $context
+                       );
+
+                       // If all servers were busy, mLastError will contain something sensible
+                       throw new DBConnectionError( null, $this->mLastError );
+               } else {
+                       $context['db_server'] = $conn->getProperty( 'mServer' );
+                       wfLogDBError(
+                               "Connection error: {last_error} ({db_server})",
+                               $context
+                       );
+
+                       // throws DBConnectionError
+                       $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" );
+               }
+
+               return false; /* not reached */
+       }
+
+       /**
+        * @return int
+        * @since 1.26
+        */
+       public function getWriterIndex() {
+               return 0;
+       }
+
+       /**
+        * Returns true if the specified index is a valid server index
+        *
+        * @param string $i
+        * @return bool
+        */
+       public function haveIndex( $i ) {
+               return array_key_exists( $i, $this->mServers );
+       }
+
+       /**
+        * Returns true if the specified index is valid and has non-zero load
+        *
+        * @param string $i
+        * @return bool
+        */
+       public function isNonZeroLoad( $i ) {
+               return array_key_exists( $i, $this->mServers ) && $this->mLoads[$i] != 0;
+       }
+
+       /**
+        * Get the number of defined servers (not the number of open connections)
+        *
+        * @return int
+        */
+       public function getServerCount() {
+               return count( $this->mServers );
+       }
+
+       /**
+        * Get the host name or IP address of the server with the specified index
+        * Prefer a readable name if available.
+        * @param string $i
+        * @return string
+        */
+       public function getServerName( $i ) {
+               if ( isset( $this->mServers[$i]['hostName'] ) ) {
+                       $name = $this->mServers[$i]['hostName'];
+               } elseif ( isset( $this->mServers[$i]['host'] ) ) {
+                       $name = $this->mServers[$i]['host'];
+               } else {
+                       $name = '';
+               }
+
+               return ( $name != '' ) ? $name : 'localhost';
+       }
+
+       /**
+        * Return the server info structure for a given index, or false if the index is invalid.
+        * @param int $i
+        * @return array|bool
+        */
+       public function getServerInfo( $i ) {
+               if ( isset( $this->mServers[$i] ) ) {
+                       return $this->mServers[$i];
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Sets the server info structure for the given index. Entry at index $i
+        * is created if it doesn't exist
+        * @param int $i
+        * @param array $serverInfo
+        */
+       public function setServerInfo( $i, array $serverInfo ) {
+               $this->mServers[$i] = $serverInfo;
+       }
+
+       /**
+        * Get the current master position for chronology control purposes
+        * @return mixed
+        */
+       public function getMasterPos() {
+               # If this entire request was served from a slave without opening a connection to the
+               # master (however unlikely that may be), then we can fetch the position from the slave.
+               $masterConn = $this->getAnyOpenConnection( 0 );
+               if ( !$masterConn ) {
+                       $serverCount = count( $this->mServers );
+                       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();
+               }
+
+               return false;
+       }
+
+       /**
+        * Close all open connections
+        */
+       public function closeAll() {
+               foreach ( $this->mConns as $conns2 ) {
+                       foreach ( $conns2 as $conns3 ) {
+                               /** @var DatabaseBase $conn */
+                               foreach ( $conns3 as $conn ) {
+                                       $conn->close();
+                               }
+                       }
+               }
+               $this->mConns = array(
+                       'local' => array(),
+                       'foreignFree' => array(),
+                       'foreignUsed' => array(),
+               );
+               $this->connsOpened = 0;
+       }
+
+       /**
+        * Close a connection
+        * Using this function makes sure the LoadBalancer knows the connection is closed.
+        * If you use $conn->close() directly, the load balancer won't update its state.
+        * @param DatabaseBase $conn
+        */
+       public function closeConnection( $conn ) {
+               $done = false;
+               foreach ( $this->mConns as $i1 => $conns2 ) {
+                       foreach ( $conns2 as $i2 => $conns3 ) {
+                               foreach ( $conns3 as $i3 => $candidateConn ) {
+                                       if ( $conn === $candidateConn ) {
+                                               $conn->close();
+                                               unset( $this->mConns[$i1][$i2][$i3] );
+                                               --$this->connsOpened;
+                                               $done = true;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+               if ( !$done ) {
+                       $conn->close();
+               }
+       }
+
+       /**
+        * Commit transactions on all open connections
+        */
+       public function commitAll() {
+               foreach ( $this->mConns as $conns2 ) {
+                       foreach ( $conns2 as $conns3 ) {
+                               /** @var DatabaseBase[] $conns3 */
+                               foreach ( $conns3 as $conn ) {
+                                       if ( $conn->trxLevel() ) {
+                                               $conn->commit( __METHOD__, 'flush' );
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        *  Issue COMMIT only on master, only if queries were done on connection
+        */
+       public function commitMasterChanges() {
+               $masterIndex = $this->getWriterIndex();
+               foreach ( $this->mConns as $conns2 ) {
+                       if ( empty( $conns2[$masterIndex] ) ) {
+                               continue;
+                       }
+                       /** @var DatabaseBase $conn */
+                       foreach ( $conns2[$masterIndex] as $conn ) {
+                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
+                                       $conn->commit( __METHOD__, 'flush' );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Issue ROLLBACK only on master, only if queries were done on connection
+        * @since 1.23
+        */
+       public function rollbackMasterChanges() {
+               $failedServers = array();
+
+               $masterIndex = $this->getWriterIndex();
+               foreach ( $this->mConns as $conns2 ) {
+                       if ( empty( $conns2[$masterIndex] ) ) {
+                               continue;
+                       }
+                       /** @var DatabaseBase $conn */
+                       foreach ( $conns2[$masterIndex] as $conn ) {
+                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
+                                       try {
+                                               $conn->rollback( __METHOD__, 'flush' );
+                                       } catch ( DBError $e ) {
+                                               MWExceptionHandler::logException( $e );
+                                               $failedServers[] = $conn->getServer();
+                                       }
+                               }
+                       }
+               }
+
+               if ( $failedServers ) {
+                       throw new DBExpectedError( null, "Rollback failed on server(s) " .
+                               implode( ', ', array_unique( $failedServers ) ) );
+               }
+       }
+
+       /**
+        * @return bool Whether a master connection is already open
+        * @since 1.24
+        */
+       public function hasMasterConnection() {
+               return $this->isOpen( $this->getWriterIndex() );
+       }
+
+       /**
+        * Determine if there are pending changes in a transaction by this thread
+        * @since 1.23
+        * @return bool
+        */
+       public function hasMasterChanges() {
+               $masterIndex = $this->getWriterIndex();
+               foreach ( $this->mConns as $conns2 ) {
+                       if ( empty( $conns2[$masterIndex] ) ) {
+                               continue;
+                       }
+                       /** @var DatabaseBase $conn */
+                       foreach ( $conns2[$masterIndex] as $conn ) {
+                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
+                                       return true;
+                               }
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Get the timestamp of the latest write query done by this thread
+        * @since 1.25
+        * @return float|bool UNIX timestamp or false
+        */
+       public function lastMasterChangeTimestamp() {
+               $lastTime = false;
+               $masterIndex = $this->getWriterIndex();
+               foreach ( $this->mConns as $conns2 ) {
+                       if ( empty( $conns2[$masterIndex] ) ) {
+                               continue;
+                       }
+                       /** @var DatabaseBase $conn */
+                       foreach ( $conns2[$masterIndex] as $conn ) {
+                               $lastTime = max( $lastTime, $conn->lastDoneWrites() );
+                       }
+               }
+               return $lastTime;
+       }
+
+       /**
+        * Check if this load balancer object had any recent or still
+        * pending writes issued against it by this PHP thread
+        *
+        * @param float $age How many seconds ago is "recent" [defaults to mWaitTimeout]
+        * @return bool
+        * @since 1.25
+        */
+       public function hasOrMadeRecentMasterChanges( $age = null ) {
+               $age = ( $age === null ) ? $this->mWaitTimeout : $age;
+
+               return ( $this->hasMasterChanges()
+                       || $this->lastMasterChangeTimestamp() > microtime( true ) - $age );
+       }
+
+       /**
+        * @param mixed $value
+        * @return mixed
+        */
+       public function waitTimeout( $value = null ) {
+               return wfSetVar( $this->mWaitTimeout, $value );
+       }
+
+       /**
+        * @return bool Whether the generic connection for reads is highly "lagged"
+        */
+       public function getLaggedSlaveMode() {
+               # Get a generic reader connection
+               $this->getConnection( DB_SLAVE );
+
+               return $this->mLaggedSlaveMode;
+       }
+
+       /**
+        * Disables/enables lag checks
+        * @param null|bool $mode
+        * @return bool
+        */
+       public function allowLagged( $mode = null ) {
+               if ( $mode === null ) {
+                       return $this->mAllowLagged;
+               }
+               $this->mAllowLagged = $mode;
+
+               return $this->mAllowLagged;
+       }
+
+       /**
+        * @return bool
+        */
+       public function pingAll() {
+               $success = true;
+               foreach ( $this->mConns as $conns2 ) {
+                       foreach ( $conns2 as $conns3 ) {
+                               /** @var DatabaseBase[] $conns3 */
+                               foreach ( $conns3 as $conn ) {
+                                       if ( !$conn->ping() ) {
+                                               $success = false;
+                                       }
+                               }
+                       }
+               }
+
+               return $success;
+       }
+
+       /**
+        * Call a function with each open connection object
+        * @param callable $callback
+        * @param array $params
+        */
+       public function forEachOpenConnection( $callback, array $params = array() ) {
+               foreach ( $this->mConns as $conns2 ) {
+                       foreach ( $conns2 as $conns3 ) {
+                               foreach ( $conns3 as $conn ) {
+                                       $mergedParams = array_merge( array( $conn ), $params );
+                                       call_user_func_array( $callback, $mergedParams );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Get the hostname and lag time of the most-lagged slave
+        *
+        * This is useful for maintenance scripts that need to throttle their updates.
+        * May attempt to open connections to slaves on the default DB. If there is
+        * no lag, the maximum lag will be reported as -1.
+        *
+        * @param bool|string $wiki Wiki ID, or false for the default database
+        * @return array ( host, max lag, index of max lagged host )
+        */
+       public function getMaxLag( $wiki = false ) {
+               $maxLag = -1;
+               $host = '';
+               $maxIndex = 0;
+
+               if ( $this->getServerCount() <= 1 ) {
+                       return array( $host, $maxLag, $maxIndex ); // no replication = no lag
+               }
+
+               $lagTimes = $this->getLagTimes( $wiki );
+               foreach ( $lagTimes as $i => $lag ) {
+                       if ( $lag > $maxLag ) {
+                               $maxLag = $lag;
+                               $host = $this->mServers[$i]['host'];
+                               $maxIndex = $i;
+                       }
+               }
+
+               return array( $host, $maxLag, $maxIndex );
+       }
+
+       /**
+        * Get an estimate of replication lag (in seconds) for each server
+        *
+        * Results are cached for a short time in memcached/process cache
+        *
+        * Values may be "false" if replication is too broken to estimate
+        *
+        * @param string|bool $wiki
+        * @return int[] Map of (server index => float|int|bool)
+        */
+       public function getLagTimes( $wiki = false ) {
+               if ( $this->getServerCount() <= 1 ) {
+                       return array( 0 => 0 ); // no replication = no lag
+               }
+
+               # Send the request to the load monitor
+               return $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
+       }
+
+       /**
+        * Get the lag in seconds for a given connection, or zero if this load
+        * balancer does not have replication enabled.
+        *
+        * This should be used in preference to Database::getLag() in cases where
+        * replication may not be in use, since there is no way to determine if
+        * replication is in use at the connection level without running
+        * potentially restricted queries such as SHOW SLAVE STATUS. Using this
+        * function instead of Database::getLag() avoids a fatal error in this
+        * case on many installations.
+        *
+        * @param DatabaseBase $conn
+        * @return int
+        */
+       public function safeGetLag( $conn ) {
+               if ( $this->getServerCount() == 1 ) {
+                       return 0;
+               } else {
+                       return $conn->getLag();
+               }
+       }
+
+       /**
+        * Clear the cache for slag lag delay times
+        *
+        * This is only used for testing
+        */
+       public function clearLagTimeCache() {
+               $this->getLoadMonitor()->clearCaches();
+       }
+}
diff --git a/includes/db/loadbalancer/LoadMonitor.php b/includes/db/loadbalancer/LoadMonitor.php
new file mode 100644 (file)
index 0000000..438e4fc
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Database load monitoring.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * An interface for database load monitoring
+ *
+ * @ingroup Database
+ */
+interface LoadMonitor {
+       /**
+        * Construct a new LoadMonitor with a given LoadBalancer parent
+        *
+        * @param LoadBalancer $parent
+        */
+       public function __construct( $parent );
+
+       /**
+        * Perform pre-connection load ratio adjustment.
+        * @param array $loads
+        * @param string|bool $group The selected query group. Default: false
+        * @param string|bool $wiki Default: false
+        */
+       public function scaleLoads( &$loads, $group = false, $wiki = false );
+
+       /**
+        * Get an estimate of replication lag (in seconds) for each server
+        *
+        * Values may be "false" if replication is too broken to estimate
+        *
+        * @param array $serverIndexes
+        * @param string $wiki
+        *
+        * @return array Map of (server index => float|int|bool)
+        */
+       public function getLagTimes( $serverIndexes, $wiki );
+
+       /**
+        * Clear any process and persistent cache of lag times
+        * @since 1.26
+        */
+       public function clearCaches();
+}
+
+class LoadMonitorNull implements LoadMonitor {
+       public function __construct( $parent ) {
+       }
+
+       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
+       }
+
+       public function getLagTimes( $serverIndexes, $wiki ) {
+               return array_fill_keys( $serverIndexes, 0 );
+       }
+
+       public function clearCaches() {
+
+       }
+}
diff --git a/includes/db/loadbalancer/LoadMonitorMySQL.php b/includes/db/loadbalancer/LoadMonitorMySQL.php
new file mode 100644 (file)
index 0000000..39ced1b
--- /dev/null
@@ -0,0 +1,124 @@
+<?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 Database
+ */
+
+/**
+ * Basic MySQL load monitor with no external dependencies
+ * Uses memcached to cache the replication lag for a short time
+ *
+ * @ingroup Database
+ */
+class LoadMonitorMySQL implements LoadMonitor {
+       /** @var LoadBalancer */
+       public $parent;
+       /** @var BagOStuff */
+       protected $srvCache;
+       /** @var BagOStuff */
+       protected $mainCache;
+
+       public function __construct( $parent ) {
+               $this->parent = $parent;
+
+               $this->srvCache = ObjectCache::newAccelerator( 'hash' );
+               $this->mainCache = wfGetMainCache();
+       }
+
+       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
+       }
+
+       public function getLagTimes( $serverIndexes, $wiki ) {
+               if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
+                       # Single server only, just return zero without caching
+                       return array( 0 => 0 );
+               }
+
+               $key = $this->getLagTimeCacheKey();
+               # Randomize TTLs to reduce stampedes (4.0 - 5.0 sec)
+               $ttl = mt_rand( 4e6, 5e6 ) / 1e6;
+               # Keep keys around longer as fallbacks
+               $staleTTL = 60;
+
+               # (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" );
+                       return $value['lagTimes']; // cache hit
+               }
+               $staleValue = $value ?: false;
+
+               # (b) Check the shared cache and backfill APC
+               $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" );
+
+                       return $value['lagTimes']; // cache hit
+               }
+               $staleValue = $value ?: $staleValue;
+
+               # (c) Cache key missing or expired; regenerate and backfill
+               if ( $this->mainCache->lock( $key, 0, 10 ) ) {
+                       # Let this process alone update the cache value
+                       $cache = $this->mainCache;
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $unlocker = new ScopedCallback( function () use ( $cache, $key ) {
+                               $cache->unlock( $key );
+                       } );
+               } elseif ( $staleValue ) {
+                       # Could not acquire lock but an old cache exists, so use it
+                       return $staleValue['lagTimes'];
+               }
+
+               $lagTimes = array();
+               foreach ( $serverIndexes as $i ) {
+                       if ( $i == 0 ) { # Master
+                               $lagTimes[$i] = 0;
+                       } elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
+                               $lagTimes[$i] = $conn->getLag();
+                       } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
+                               $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,
+                               # which is slightly inefficient, but this only matters for the lag
+                               # time cache miss cache, which is far less common that cache hits.
+                               $this->parent->closeConnection( $conn );
+                       }
+               }
+
+               # Add a timestamp key so we know when it was cached
+               $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)" );
+
+               return $value['lagTimes'];
+       }
+
+       public function clearCaches() {
+               $key = $this->getLagTimeCacheKey();
+               $this->srvCache->delete( $key );
+               $this->mainCache->delete( $key );
+       }
+
+       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 ) );
+       }
+}
index 1249eba..841636c 100644 (file)
@@ -455,59 +455,21 @@ class MWDebug {
         * @return string HTML fragment
         */
        public static function getHTMLDebugLog() {
-               global $wgDebugTimestamps, $wgShowDebug;
+               global $wgShowDebug;
 
                if ( !$wgShowDebug ) {
                        return '';
                }
 
-               $curIdent = 0;
-               $ret = "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">\n<li>";
+               $ret = "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">\n";
 
                foreach ( self::$debug as $line ) {
-                       $pre = '';
-                       if ( $wgDebugTimestamps ) {
-                               $matches = array();
-                               if ( preg_match( '/^(\d+\.\d+ {1,3}\d+.\dM\s{2})/', $line, $matches ) ) {
-                                       $pre = $matches[1];
-                                       $line = substr( $line, strlen( $pre ) );
-                               }
-                       }
-                       $display = ltrim( $line );
-                       $ident = strlen( $line ) - strlen( $display );
-                       $diff = $ident - $curIdent;
-
-                       $display = $pre . $display;
-                       if ( $display == '' ) {
-                               $display = "\xc2\xa0";
-                       }
-
-                       if ( !$ident
-                               && $diff < 0
-                               && substr( $display, 0, 9 ) != 'Entering '
-                               && substr( $display, 0, 8 ) != 'Exiting '
-                       ) {
-                               $ident = $curIdent;
-                               $diff = 0;
-                               $display = '<span style="background:yellow;">' .
-                                       nl2br( htmlspecialchars( $display ) ) . '</span>';
-                       } else {
-                               $display = nl2br( htmlspecialchars( $display ) );
-                       }
-
-                       if ( $diff < 0 ) {
-                               $ret .= str_repeat( "</li></ul>\n", -$diff ) . "</li><li>\n";
-                       } elseif ( $diff == 0 ) {
-                               $ret .= "</li><li>\n";
-                       } else {
-                               $ret .= str_repeat( "<ul><li>\n", $diff );
-                       }
-                       $ret .= "<code>$display</code>\n";
+                       $display = nl2br( htmlspecialchars( trim( $line ) ) );
 
-                       $curIdent = $ident;
+                       $ret .= "<li><code>$display</code></li>\n";
                }
 
-               $ret .= str_repeat( '</li></ul>', $curIdent ) . "</li>\n</ul>\n";
+               $ret .= '</ul>' . "\n";
 
                return $ret;
        }
index 0f4c648..bb3c7e1 100644 (file)
@@ -357,7 +357,7 @@ class LegacyLogger extends AbstractLogger {
                }
 
                if ( is_scalar( $item ) ) {
-                       return (string) $item;
+                       return (string)$item;
                }
 
                if ( is_array( $item ) ) {
@@ -376,7 +376,7 @@ class LegacyLogger extends AbstractLogger {
 
                if ( is_object( $item ) ) {
                        if ( method_exists( $item, '__toString' ) ) {
-                               return (string) $item;
+                               return (string)$item;
                        }
 
                        return '[Object ' . get_class( $item ) . ']';
index 3ebd0b1..d53ccde 100644 (file)
@@ -37,11 +37,10 @@ class BufferHandler extends BaseBufferHandler {
         * {@inheritDoc}
         */
        public function handle( array $record ) {
-               if (!$this->initialized) {
+               if ( !$this->initialized ) {
                        DeferredUpdates::addCallableUpdate( array( $this, 'close' ) );
                        $this->initialized = true;
                }
                return parent::handle( $record );
        }
 }
-
index 59d7764..4e8e65b 100644 (file)
@@ -76,7 +76,9 @@ class KafkaHandler extends AbstractProcessingHandler {
         * @param int $level The minimum logging level at which this handler will be triggered
         * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
         */
-       public function __construct( Produce $produce, array $options, $level = Logger::DEBUG, $bubble = true ) {
+       public function __construct(
+               Produce $produce, array $options, $level = Logger::DEBUG, $bubble = true
+       ) {
                parent::__construct( $level, $bubble );
                $this->produce = $produce;
                $this->options = array_merge( self::$defaultOptions, $options );
@@ -92,7 +94,9 @@ class KafkaHandler extends AbstractProcessingHandler {
         * @param bool $bubble Whether the messages that are handled can bubble the stack or not
         * @return KafkaHandler
         */
-       public static function factory( $kafkaServers, array $options = array(), $level = Logger::DEBUG, $bubble = true ) {
+       public static function factory(
+               $kafkaServers, array $options = array(), $level = Logger::DEBUG, $bubble = true
+       ) {
                $metadata = new MetaDataFromKafka( $kafkaServers );
                $produce = new Produce( $metadata );
                if ( isset( $options['logExceptions'] ) && is_string( $options['logExceptions'] ) ) {
@@ -133,7 +137,7 @@ class KafkaHandler extends AbstractProcessingHandler {
                                }
                        }
                        if ( $messages ) {
-                               $this->addMessages($channel, $messages);
+                               $this->addMessages( $channel, $messages );
                        }
                }
 
index ed12c60..4a61b2a 100644 (file)
  *       subclasses can override the beginTransaction() and commitTransaction() methods.
  */
 abstract class DataUpdate implements DeferrableUpdate {
-       /**
-        * Constructor
-        */
        public function __construct() {
-               # noop
+               // noop
        }
 
        /**
@@ -42,7 +39,7 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This default implementation does nothing.
         */
        public function beginTransaction() {
-               //noop
+               // noop
        }
 
        /**
@@ -50,7 +47,7 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This default implementation does nothing.
         */
        public function commitTransaction() {
-               //noop
+               // noop
        }
 
        /**
@@ -58,7 +55,7 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This default implementation does nothing.
         */
        public function rollbackTransaction() {
-               //noop
+               // noop
        }
 
        /**
@@ -73,22 +70,23 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This allows for limited transactional logic across multiple backends for storing
         * secondary data.
         *
-        * @param array $updates A list of DataUpdate instances
+        * @param DataUpdate[] $updates A list of DataUpdate instances
+        * @param string $mode Use "enqueue" to use the job queue when possible [Default: run]
         * @throws Exception|null
         */
-       public static function runUpdates( $updates ) {
-               if ( empty( $updates ) ) {
-                       return; # nothing to do
+       public static function runUpdates( array $updates, $mode = 'run' ) {
+               if ( $mode === 'enqueue' ) {
+                       // When possible, push updates as jobs instead of calling doUpdate()
+                       $updates = self::enqueueUpdates( $updates );
+               }
+
+               if ( !count( $updates ) ) {
+                       return; // nothing to do
                }
 
                $open_transactions = array();
                $exception = null;
 
-               /**
-                * @var $update DataUpdate
-                * @var $trans DataUpdate
-                */
-
                try {
                        // begin transactions
                        foreach ( $updates as $update ) {
@@ -122,4 +120,42 @@ abstract class DataUpdate implements DeferrableUpdate {
                        throw $exception; // rethrow after cleanup
                }
        }
+
+       /**
+        * Enqueue jobs for every DataUpdate that support enqueueUpdate()
+        * and return the remaining DataUpdate objects (those that do not)
+        *
+        * @param DataUpdate[] $updates A list of DataUpdate instances
+        * @return DataUpdate[]
+        * @since 1.26
+        */
+       protected static function enqueueUpdates( array $updates ) {
+               $remaining = array();
+
+               foreach ( $updates as $update ) {
+                       if ( $update instanceof EnqueueableDataUpdate ) {
+                               $spec = $update->getAsJobSpecification();
+                               JobQueueGroup::singleton( $spec['wiki'] )->push( $spec['job'] );
+                       } else {
+                               $remaining[] = $update;
+                       }
+               }
+
+               return $remaining;
+       }
+}
+
+/**
+ * Interface that marks a DataUpdate as enqueuable via the JobQueue
+ *
+ * Such updates must be representable using IJobSpecification, so that
+ * they can be serialized into jobs and enqueued for later execution
+ *
+ * @since 1.26
+ */
+interface EnqueueableDataUpdate {
+       /**
+        * @return array (wiki => wiki ID, job => IJobSpecification)
+        */
+       public function getAsJobSpecification();
 }
index cd0266f..7d02a7a 100644 (file)
@@ -44,10 +44,10 @@ interface DeferrableUpdate {
  * @since 1.19
  */
 class DeferredUpdates {
-       /**
-        * @var array Updates to be deferred until the end of the request.
-        */
+       /** @var array 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;
 
        /**
         * Add an update to the deferred list
@@ -57,6 +57,9 @@ class DeferredUpdates {
                global $wgCommandLineMode;
 
                array_push( self::$updates, $update );
+               if ( self::$forceDeferral ) {
+                       return;
+               }
 
                // CLI scripts may forget to periodically flush these updates,
                // so try to handle that rather than OOMing and losing them.
@@ -129,4 +132,13 @@ class DeferredUpdates {
        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.26
+        */
+       public static function forceDeferral( $value ) {
+               self::$forceDeferral = $value;
+       }
 }
diff --git a/includes/deferred/LinksDeletionUpdate.php b/includes/deferred/LinksDeletionUpdate.php
new file mode 100644 (file)
index 0000000..d784840
--- /dev/null
@@ -0,0 +1,117 @@
+<?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
+ */
+/**
+ * Update object handling the cleanup of links tables after a page was deleted.
+ **/
+class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
+       /** @var WikiPage */
+       protected $page;
+       /** @var integer */
+       protected $pageId;
+
+       /**
+        * @param WikiPage $page Page we are updating
+        * @param integer|null $pageId ID of the page we are updating [optional]
+        * @throws MWException
+        */
+       function __construct( WikiPage $page, $pageId = null ) {
+               parent::__construct( false ); // no implicit transaction
+
+               $this->page = $page;
+               if ( $page->exists() ) {
+                       $this->pageId = $page->getId();
+               } elseif ( $pageId ) {
+                       $this->pageId = $pageId;
+               } else {
+                       throw new MWException( "Page ID not known, perhaps the page doesn't exist?" );
+               }
+       }
+
+       public function doUpdate() {
+               # Page may already be deleted, so don't just getId()
+               $id = $this->pageId;
+
+               # Delete restrictions for it
+               $this->mDb->delete( 'page_restrictions', array( 'pr_page' => $id ), __METHOD__ );
+
+               # Fix category table counts
+               $cats = $this->mDb->selectFieldValues(
+                       'categorylinks',
+                       'cl_to',
+                       array( 'cl_from' => $id ),
+                       __METHOD__
+               );
+               $this->page->updateCategoryCounts( array(), $cats );
+
+               # If using cascading deletes, we can skip some explicit deletes
+               if ( !$this->mDb->cascadingDeletes() ) {
+                       # Delete outgoing links
+                       $this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'categorylinks', array( 'cl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'templatelinks', array( 'tl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'externallinks', array( 'el_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'langlinks', array( 'll_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'iwlinks', array( 'iwl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'page_props', array( 'pp_page' => $id ), __METHOD__ );
+               }
+
+               # If using cleanup triggers, we can skip some manual deletes
+               if ( !$this->mDb->cleanupTriggers() ) {
+                       $title = $this->page->getTitle();
+                       # Find recentchanges entries to clean up...
+                       $rcIdsForTitle = $this->mDb->selectFieldValues( 'recentchanges',
+                               'rc_id',
+                               array(
+                                       'rc_type != ' . RC_LOG,
+                                       'rc_namespace' => $title->getNamespace(),
+                                       'rc_title' => $title->getDBkey()
+                               ),
+                               __METHOD__
+                       );
+                       $rcIdsForPage = $this->mDb->selectFieldValues( 'recentchanges',
+                               'rc_id',
+                               array( 'rc_type != ' . RC_LOG, 'rc_cur_id' => $id ),
+                               __METHOD__
+                       );
+
+                       # T98706: delete PK to avoid lock contention with RC delete log insertions
+                       $rcIds = array_merge( $rcIdsForTitle, $rcIdsForPage );
+                       if ( $rcIds ) {
+                               $this->mDb->delete( 'recentchanges', array( 'rc_id' => $rcIds ), __METHOD__ );
+                       }
+               }
+       }
+
+       public function getAsJobSpecification() {
+               return array(
+                       'wiki' => $this->mDb->getWikiID(),
+                       'job'  => new JobSpecification(
+                               'deleteLinks',
+                               array( 'pageId' => $this->page->getId() ),
+                               array( 'removeDuplicates' => true ),
+                               $this->page->getTitle()
+                       )
+               );
+       }
+}
index e9ec7ff..be5aff3 100644 (file)
@@ -935,99 +935,3 @@ class LinksUpdate extends SqlDataUpdate {
                }
        }
 }
-
-/**
- * Update object handling the cleanup of links tables after a page was deleted.
- **/
-class LinksDeletionUpdate extends SqlDataUpdate {
-       /** @var WikiPage The WikiPage that was deleted */
-       protected $mPage;
-
-       /**
-        * Constructor
-        *
-        * @param WikiPage $page Page we are updating
-        * @throws MWException
-        */
-       function __construct( WikiPage $page ) {
-               parent::__construct( false ); // no implicit transaction
-
-               $this->mPage = $page;
-
-               if ( !$page->exists() ) {
-                       throw new MWException( "Page ID not known, perhaps the page doesn't exist?" );
-               }
-       }
-
-       /**
-        * Do some database updates after deletion
-        */
-       public function doUpdate() {
-               $title = $this->mPage->getTitle();
-               $id = $this->mPage->getId();
-
-               # Delete restrictions for it
-               $this->mDb->delete( 'page_restrictions', array( 'pr_page' => $id ), __METHOD__ );
-
-               # Fix category table counts
-               $cats = array();
-               $res = $this->mDb->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ );
-
-               foreach ( $res as $row ) {
-                       $cats[] = $row->cl_to;
-               }
-
-               $this->mPage->updateCategoryCounts( array(), $cats );
-
-               # If using cascading deletes, we can skip some explicit deletes
-               if ( !$this->mDb->cascadingDeletes() ) {
-                       # Delete outgoing links
-                       $this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'categorylinks', array( 'cl_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'templatelinks', array( 'tl_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'externallinks', array( 'el_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'langlinks', array( 'll_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'iwlinks', array( 'iwl_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'page_props', array( 'pp_page' => $id ), __METHOD__ );
-               }
-
-               # If using cleanup triggers, we can skip some manual deletes
-               if ( !$this->mDb->cleanupTriggers() ) {
-                       # Find recentchanges entries to clean up...
-                       $rcIdsForTitle = $this->mDb->selectFieldValues( 'recentchanges',
-                               'rc_id',
-                               array(
-                                       'rc_type != ' . RC_LOG,
-                                       'rc_namespace' => $title->getNamespace(),
-                                       'rc_title' => $title->getDBkey()
-                               ),
-                               __METHOD__
-                       );
-                       $rcIdsForPage = $this->mDb->selectFieldValues( 'recentchanges',
-                               'rc_id',
-                               array( 'rc_type != ' . RC_LOG, 'rc_cur_id' => $id ),
-                               __METHOD__
-                       );
-
-                       # T98706: delete PK to avoid lock contention with RC delete log insertions
-                       $rcIds = array_merge( $rcIdsForTitle, $rcIdsForPage );
-                       if ( $rcIds ) {
-                               $this->mDb->delete( 'recentchanges', array( 'rc_id' => $rcIds ), __METHOD__ );
-                       }
-               }
-       }
-
-       /**
-        * Update all the appropriate counts in the category table.
-        * @param array $added Associative array of category name => sort key
-        * @param array $deleted Associative array of category name => sort key
-        */
-       function updateCategoryCounts( $added, $deleted ) {
-               $a = WikiPage::factory( $this->mTitle );
-               $a->updateCategoryCounts(
-                       array_keys( $added ), array_keys( $deleted )
-               );
-       }
-}
index ba14f09..6ed1d00 100644 (file)
@@ -148,21 +148,22 @@ class SearchUpdate implements DeferrableUpdate {
                # Strip all remaining non-search characters
                $text = preg_replace( "/[^{$lc}]+/", " ", $text );
 
-               # Handle 's, s'
-               #
-               #   $text = preg_replace( "/([{$lc}]+)'s /", "\\1 \\1's ", $text );
-               #   $text = preg_replace( "/([{$lc}]+)s' /", "\\1s ", $text );
-               #
-               # These tail-anchored regexps are insanely slow. The worst case comes
-               # when Japanese or Chinese text (ie, no word spacing) is written on
-               # a wiki configured for Western UTF-8 mode. The Unicode characters are
-               # expanded to hex codes and the "words" are very long paragraph-length
-               # monstrosities. On a large page the above regexps may take over 20
-               # seconds *each* on a 1GHz-level processor.
-               #
-               # Following are reversed versions which are consistently fast
-               # (about 3 milliseconds on 1GHz-level processor).
-               #
+               /**
+                * Handle 's, s'
+                *
+                *   $text = preg_replace( "/([{$lc}]+)'s /", "\\1 \\1's ", $text );
+                *   $text = preg_replace( "/([{$lc}]+)s' /", "\\1s ", $text );
+                *
+                * These tail-anchored regexps are insanely slow. The worst case comes
+                * when Japanese or Chinese text (ie, no word spacing) is written on
+                * a wiki configured for Western UTF-8 mode. The Unicode characters are
+                * expanded to hex codes and the "words" are very long paragraph-length
+                * monstrosities. On a large page the above regexps may take over 20
+                * seconds *each* on a 1GHz-level processor.
+                *
+                * Following are reversed versions which are consistently fast
+                * (about 3 milliseconds on 1GHz-level processor).
+                */
                $text = strrev( preg_replace( "/ s'([{$lc}]+)/", " s'\\1 \\1", strrev( $text ) ) );
                $text = strrev( preg_replace( "/ 's([{$lc}]+)/", " s\\1", strrev( $text ) ) );
 
index ae75a75..d135a80 100644 (file)
@@ -125,7 +125,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
        }
 
        /**
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @return bool|mixed
         */
        public static function cacheUpdate( $dbw ) {
index 49164e3..0455690 100644 (file)
@@ -93,7 +93,7 @@ abstract class SqlDataUpdate extends DataUpdate {
         * Abort the database transaction started via beginTransaction (if any).
         */
        public function abortTransaction() {
-               if ( $this->mHasTransaction ) { //XXX: actually... maybe always?
+               if ( $this->mHasTransaction ) { // XXX: actually... maybe always?
                        $this->mDb->rollback( get_class( $this ) . '::abortTransaction' );
                        $this->mHasTransaction = false;
                }
index 950a264..e148f56 100644 (file)
@@ -54,7 +54,7 @@ class SquidUpdate {
        /**
         * Create a SquidUpdate from an array of Title objects, or a TitleArray object
         *
-        * @param array $titles
+        * @param Traversable|array $titles
         * @param array $urlArr
         * @return SquidUpdate
         */
index c138eec..6544078 100644 (file)
@@ -487,8 +487,7 @@ class DifferenceEngine extends ContextSource {
                                                'rc_this_oldid' => $this->mNewid,
                                                'rc_patrolled' => 0
                                        ),
-                                       __METHOD__,
-                                       array( 'USE INDEX' => 'rc_timestamp' )
+                                       __METHOD__
                                );
 
                                if ( $change && !$change->getPerformer()->equals( $user ) ) {
index 83e04a5..4737f08 100644 (file)
@@ -62,8 +62,14 @@ class TableDiffFormatter extends DiffFormatter {
        protected function blockHeader( $xbeg, $xlen, $ybeg, $ylen ) {
                // '<!--LINE \d+ -->' get replaced by a localised line number
                // in DifferenceEngine::localiseLineNumbers
-               $r = '<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l' . $xbeg . '" ><!--LINE ' . $xbeg . "--></td>\n" .
-                       '<td colspan="2" class="diff-lineno"><!--LINE ' . $ybeg . "--></td></tr>\n";
+               $r = '<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l' .
+                       $xbeg .
+                       '" ><!--LINE ' .
+                       $xbeg .
+                       "--></td>\n" .
+                       '<td colspan="2" class="diff-lineno"><!--LINE ' .
+                       $ybeg .
+                       "--></td></tr>\n";
 
                return $r;
        }
index d25f1a8..4e50070 100644 (file)
@@ -485,6 +485,14 @@ TXT;
                return "[$id] $url   $type from line $line of $file: $message";
        }
 
+       public static function getPublicLogMessage( Exception $e ) {
+               $logId = self::getLogId( $e );
+               $type = get_class( $e );
+               return '[' . $logId . '] '
+                       . gmdate( 'Y-m-d H:i:s' ) . ': '
+                       . 'Fatal exception of type ' . $type;
+       }
+
        /**
         * Get a PSR-3 log event context from an Exception.
         *
index 952bf63..cc70960 100644 (file)
@@ -156,7 +156,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get the 'blobs' table name for this database
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return string Table name ('blobs' by default)
         */
        function getTable( $db ) {
index 9bb1582..59b2fd6 100644 (file)
@@ -63,9 +63,6 @@ class FileBackendGroup {
        protected function initFromGlobals() {
                global $wgLocalFileRepo, $wgForeignFileRepos, $wgFileBackends;
 
-               // Register explicitly defined backends
-               $this->register( $wgFileBackends );
-
                $autoBackends = array();
                // Automatically create b/c backends for file repos...
                $repos = array_merge( $wgForeignFileRepos, array( $wgLocalFileRepo ) );
@@ -105,8 +102,16 @@ class FileBackendGroup {
                        );
                }
 
-               // Register implicitly defined backends
-               $this->register( $autoBackends );
+               $backends = array_merge( $autoBackends, $wgFileBackends );
+
+               // Apply $wgReadOnly to all backends if not already read-only
+               foreach ( $backends as &$backend ) {
+                       $backend['readOnly'] = !empty( $backend['readOnly'] )
+                               ? $backend['readOnly']
+                               : wfConfiguredReadOnlyReason();
+               }
+
+               $this->register( $backends );
        }
 
        /**
index 1603d44..3841f2e 100644 (file)
@@ -52,10 +52,12 @@ class FileBackendMultiWrite extends FileBackend {
 
        /** @var int Bitfield */
        protected $syncChecks = 0;
-
        /** @var string|bool */
        protected $autoResync = false;
 
+       /** @var bool */
+       protected $asyncWrites = false;
+
        /* Possible internal backend consistency checks */
        const CHECK_SIZE = 1;
        const CHECK_TIME = 2;
@@ -85,6 +87,9 @@ class FileBackendMultiWrite extends FileBackend {
         *                      Use "conservative" to limit resyncing to copying newer master
         *                      backend files over older (or non-existing) clone backend files.
         *                      Cases that cannot be handled will result in operation abortion.
+        *   - replication    : Set to 'async' to defer file operations on the non-master backends.
+        *                      This will apply such updates post-send for web requests. Note that
+        *                      any checks from "syncChecks" are still synchronous.
         *
         * @param array $config
         * @throws FileBackendError
@@ -97,6 +102,7 @@ class FileBackendMultiWrite extends FileBackend {
                $this->autoResync = isset( $config['autoResync'] )
                        ? $config['autoResync']
                        : false;
+               $this->asyncWrites = isset( $config['replication'] ) && $config['replication'] === 'async';
                // Construct backends here rather than via registration
                // to keep these backends hidden from outside the proxy.
                $namesUsed = array();
@@ -147,6 +153,7 @@ class FileBackendMultiWrite extends FileBackend {
                $mbe = $this->backends[$this->masterIndex]; // convenience
 
                // Try to lock those files for the scope of this function...
+               $scopeLock = null;
                if ( empty( $opts['nonLocking'] ) ) {
                        // Try to lock those files for the scope of this function...
                        /** @noinspection PhpUnusedLocalVariableInspection */
@@ -187,8 +194,19 @@ class FileBackendMultiWrite extends FileBackend {
                // If $ops only had one operation, this might avoid backend sync inconsistencies.
                if ( $masterStatus->isOK() && $masterStatus->successCount > 0 ) {
                        foreach ( $this->backends as $index => $backend ) {
-                               if ( $index !== $this->masterIndex ) { // not done already
-                                       $realOps = $this->substOpBatchPaths( $ops, $backend );
+                               if ( $index === $this->masterIndex ) {
+                                       continue; // done already
+                               }
+
+                               $realOps = $this->substOpBatchPaths( $ops, $backend );
+                               if ( $this->asyncWrites ) {
+                                       // Bind $scopeLock to the callback to preserve locks
+                                       DeferredUpdates::addCallableUpdate(
+                                               function() use ( $backend, $realOps, $opts, $scopeLock ) {
+                                                       $backend->doOperations( $realOps, $opts );
+                                               }
+                                       );
+                               } else {
                                        $status->merge( $backend->doOperations( $realOps, $opts ) );
                                }
                        }
@@ -457,8 +475,18 @@ class FileBackendMultiWrite extends FileBackend {
                $status->merge( $masterStatus );
                // Propagate the operations to the clone backends...
                foreach ( $this->backends as $index => $backend ) {
-                       if ( $index !== $this->masterIndex ) { // not done already
-                               $realOps = $this->substOpBatchPaths( $ops, $backend );
+                       if ( $index === $this->masterIndex ) {
+                               continue; // done already
+                       }
+
+                       $realOps = $this->substOpBatchPaths( $ops, $backend );
+                       if ( $this->asyncWrites ) {
+                               DeferredUpdates::addCallableUpdate(
+                                       function() use ( $backend, $realOps ) {
+                                               $backend->doQuickOperations( $realOps );
+                                       }
+                               );
+                       } else {
                                $status->merge( $backend->doQuickOperations( $realOps ) );
                        }
                }
@@ -473,40 +501,48 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        protected function doPrepare( array $params ) {
-               $status = Status::newGood();
-               foreach ( $this->backends as $index => $backend ) {
-                       $realParams = $this->substOpPaths( $params, $backend );
-                       $status->merge( $backend->doPrepare( $realParams ) );
-               }
-
-               return $status;
+               return $this->doDirectoryOp( 'prepare', $params );
        }
 
        protected function doSecure( array $params ) {
-               $status = Status::newGood();
-               foreach ( $this->backends as $index => $backend ) {
-                       $realParams = $this->substOpPaths( $params, $backend );
-                       $status->merge( $backend->doSecure( $realParams ) );
-               }
-
-               return $status;
+               return $this->doDirectoryOp( 'secure', $params );
        }
 
        protected function doPublish( array $params ) {
-               $status = Status::newGood();
-               foreach ( $this->backends as $index => $backend ) {
-                       $realParams = $this->substOpPaths( $params, $backend );
-                       $status->merge( $backend->doPublish( $realParams ) );
-               }
-
-               return $status;
+               return $this->doDirectoryOp( 'publish', $params );
        }
 
        protected function doClean( array $params ) {
+               return $this->doDirectoryOp( 'clean', $params );
+       }
+
+       /**
+        * @param string $method One of (doPrepare,doSecure,doPublish,doClean)
+        * @param array $params Method arguments
+        * @return Status
+        */
+       protected function doDirectoryOp( $method, array $params ) {
                $status = Status::newGood();
+
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $masterStatus = $this->backends[$this->masterIndex]->$method( $realParams );
+               $status->merge( $masterStatus );
+
                foreach ( $this->backends as $index => $backend ) {
+                       if ( $index === $this->masterIndex ) {
+                               continue; // already done
+                       }
+
                        $realParams = $this->substOpPaths( $params, $backend );
-                       $status->merge( $backend->doClean( $realParams ) );
+                       if ( $this->asyncWrites ) {
+                               DeferredUpdates::addCallableUpdate(
+                                       function() use ( $backend, $method, $realParams ) {
+                                               $backend->$method( $realParams );
+                                       }
+                               );
+                       } else {
+                               $status->merge( $backend->$method( $realParams ) );
+                       }
                }
 
                return $status;
index 7370c5c..c0ae3b6 100644 (file)
@@ -52,6 +52,9 @@ class FileRepo {
        /** @var bool */
        protected $hasSha1Storage = false;
 
+       /** @var bool */
+       protected $supportsSha1URLs = false;
+
        /** @var FileBackend */
        protected $backend;
 
@@ -200,6 +203,8 @@ class FileRepo {
                                $this->zones[$zone]['urlsByExt'] = array();
                        }
                }
+
+               $this->supportsSha1URLs = !empty( $info['supportsSha1URLs'] );
        }
 
        /**
@@ -753,7 +758,6 @@ class FileRepo {
                }
                if ( !is_null( $this->articleUrl ) ) {
                        # "http://example.com/wiki/$1"
-                       #
                        # We use "Image:" as the canonical namespace for
                        # compatibility across all MediaWiki versions.
                        return str_replace( '$1',
@@ -761,7 +765,6 @@ class FileRepo {
                }
                if ( !is_null( $this->scriptDirUrl ) ) {
                        # "http://example.com/w"
-                       #
                        # We use "Image:" as the canonical namespace for
                        # compatibility across all MediaWiki versions,
                        # and just sort of hope index.php is right. ;)
@@ -1896,6 +1899,14 @@ class FileRepo {
        public function hasSha1Storage() {
                return $this->hasSha1Storage;
        }
+
+       /**
+        * Returns whether or not repo supports having originals SHA-1s in the thumb URLs
+        * @return boolean
+        */
+       public function supportsSha1URLs() {
+               return $this->supportsSha1URLs;
+       }
 }
 
 /**
index 6a2c064..389f081 100644 (file)
@@ -29,9 +29,6 @@
  * @ingroup FileRepo
  */
 class LocalRepo extends FileRepo {
-       /** @var bool */
-       protected $hasSha1Storage = false;
-
        /** @var array */
        protected $fileFactory = array( 'LocalFile', 'newFromTitle' );
 
@@ -192,8 +189,6 @@ class LocalRepo extends FileRepo {
         * @return bool|Title
         */
        function checkRedirect( Title $title ) {
-               $cache = ObjectCache::getMainWANInstance();
-
                $title = File::normalizeTitle( $title, 'exception' );
 
                $memcKey = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
@@ -203,63 +198,44 @@ class LocalRepo extends FileRepo {
                } else {
                        $expiry = 86400; // has invalidation, 1 day
                }
-               $cachedValue = $cache->get( $memcKey );
-               if ( $cachedValue === ' ' || $cachedValue === '' ) {
-                       // Does not exist
-                       return false;
-               } elseif ( strval( $cachedValue ) !== '' && $cachedValue !== ' PURGED' ) {
-                       return Title::newFromText( $cachedValue, NS_FILE );
-               } // else $cachedValue is false or null: cache miss
-
-               $id = $this->getArticleID( $title );
-               if ( !$id ) {
-                       $cache->set( $memcKey, " ", $expiry );
-
-                       return false;
-               }
-               $dbr = $this->getSlaveDB();
-               $row = $dbr->selectRow(
-                       'redirect',
-                       array( 'rd_title', 'rd_namespace' ),
-                       array( 'rd_from' => $id ),
-                       __METHOD__
-               );
 
-               if ( $row && $row->rd_namespace == NS_FILE ) {
-                       $targetTitle = Title::makeTitle( $row->rd_namespace, $row->rd_title );
-                       $cache->set( $memcKey, $targetTitle->getDBkey(), $expiry );
-
-                       return $targetTitle;
-               } else {
-                       $cache->set( $memcKey, '', $expiry );
+               $that = $this;
+               $redirDbKey = ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       $memcKey,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $that, $title ) {
+                               $dbr = $that->getSlaveDB(); // possibly remote DB
+
+                               $setOpts += DatabaseBase::getCacheSetOptions( $dbr );
+
+                               if ( $title instanceof Title ) {
+                                       $row = $dbr->selectRow(
+                                               array( 'page', 'redirect' ),
+                                               array( 'rd_namespace', 'rd_title' ),
+                                               array(
+                                                       'page_namespace' => $title->getNamespace(),
+                                                       'page_title' => $title->getDBkey(),
+                                                       'rd_from = page_id'
+                                               ),
+                                               __METHOD__
+                                       );
+                               } else {
+                                       $row = false;
+                               }
 
-                       return false;
-               }
-       }
+                               return ( $row && $row->rd_namespace == NS_FILE )
+                                       ? Title::makeTitle( $row->rd_namespace, $row->rd_title )->getDBkey()
+                                       : ''; // negative cache
+                       },
+                       $expiry
+               );
 
-       /**
-        * Function link Title::getArticleID().
-        * We can't say Title object, what database it should use, so we duplicate that function here.
-        *
-        * @param Title $title
-        * @return bool|int|mixed
-        */
-       protected function getArticleID( $title ) {
-               if ( !$title instanceof Title ) {
-                       return 0;
+               // @note: also checks " " for b/c
+               if ( $redirDbKey !== ' ' && strval( $redirDbKey ) !== '' ) {
+                       // Page is a redirect to another file
+                       return Title::newFromText( $redirDbKey, NS_FILE );
                }
-               $dbr = $this->getSlaveDB();
-               $id = $dbr->selectField(
-                       'page', // Table
-                       'page_id', //Field
-                       array( //Conditions
-                               'page_namespace' => $title->getNamespace(),
-                               'page_title' => $title->getDBkey(),
-                       ),
-                       __METHOD__ //Function name
-               );
 
-               return $id;
+               return false; // no redirect
        }
 
        public function findFiles( array $items, $flags = 0 ) {
@@ -424,7 +400,7 @@ class LocalRepo extends FileRepo {
         */
        function findBySha1s( array $hashes ) {
                if ( !count( $hashes ) ) {
-                       return array(); //empty parameter
+                       return array(); // empty parameter
                }
 
                $dbr = $this->getSlaveDB();
@@ -521,15 +497,11 @@ class LocalRepo extends FileRepo {
         * @return void
         */
        function invalidateImageRedirect( Title $title ) {
-               $cache = ObjectCache::getMainWANInstance();
-
-               $memcKey = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
-               if ( $memcKey ) {
-                       // Set a temporary value for the cache key, to ensure
-                       // that this value stays purged long enough so that
-                       // it isn't refreshed with a stale value due to a
-                       // lagged slave.
-                       $cache->delete( $memcKey, 12 );
+               $key = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
+               if ( $key ) {
+                       $this->getMasterDB()->onTransactionPreCommitOrIdle( function() use ( $key ) {
+                               ObjectCache::getMainWANInstance()->delete( $key );
+                       } );
                }
        }
 
index 050c429..c89dca1 100644 (file)
@@ -304,7 +304,7 @@ class RepoGroup {
                foreach ( $this->foreignRepos as $repo ) {
                        $result = array_merge_recursive( $result, $repo->findBySha1s( $hashes ) );
                }
-               //sort the merged (and presorted) sublist of each hash
+               // sort the merged (and presorted) sublist of each hash
                foreach ( $result as $hash => $files ) {
                        usort( $result[$hash], 'File::compare' );
                }
index f40d216..43d1eb5 100644 (file)
@@ -383,7 +383,7 @@ abstract class File implements IDBAccessObject {
                                wfDebug( __METHOD__ . ': supposed to render ' . $this->getName() .
                                        ' (' . $this->getMimeType() . "), but can't!\n" );
 
-                               return $this->getURL(); #hm... return NULL?
+                               return $this->getURL(); # hm... return NULL?
                        }
                } else {
                        return $this->getURL();
@@ -574,7 +574,7 @@ abstract class File implements IDBAccessObject {
         * In files that support multiple language, what is the default language
         * to use if none specified.
         *
-        * @return string Lang code, or null if filetype doesn't support multiple languages.
+        * @return string|null Lang code, or null if filetype doesn't support multiple languages.
         * @since 1.23
         */
        public function getDefaultRenderLanguage() {
@@ -806,17 +806,17 @@ abstract class File implements IDBAccessObject {
 
                $type = $this->getMediaType();
                $mime = $this->getMimeType();
-               #wfDebug( "LocalFile::isSafeFile: type= $type, mime= $mime\n" );
+               # wfDebug( "LocalFile::isSafeFile: type= $type, mime= $mime\n" );
 
                if ( !$type || $type === MEDIATYPE_UNKNOWN ) {
-                       return false; #unknown type, not trusted
+                       return false; # unknown type, not trusted
                }
                if ( in_array( $type, $wgTrustedMediaFormats ) ) {
                        return true;
                }
 
                if ( $mime === "unknown/unknown" ) {
-                       return false; #unknown type, not trusted
+                       return false; # unknown type, not trusted
                }
                if ( in_array( $mime, $wgTrustedMediaFormats ) ) {
                        return true;
@@ -839,8 +839,8 @@ abstract class File implements IDBAccessObject {
         * @return bool
         */
        function isTrustedFile() {
-               #this could be implemented to check a flag in the database,
-               #look for signatures, etc
+               # this could be implemented to check a flag in the database,
+               # look for signatures, etc
                return false;
        }
 
@@ -922,7 +922,7 @@ abstract class File implements IDBAccessObject {
         *
         * @param array $params Handler-specific parameters
         * @param int $flags Bitfield that supports THUMB_* constants
-        * @return string
+        * @return string|null
         */
        public function thumbName( $params, $flags = 0 ) {
                $name = ( $this->repo && !( $flags & self::THUMB_FULL_NAME ) )
@@ -937,7 +937,7 @@ abstract class File implements IDBAccessObject {
         *
         * @param string $name
         * @param array $params Parameters which will be passed to MediaHandler::makeParamString
-        * @return string
+        * @return string|null
         */
        public function generateThumbName( $name, $params ) {
                if ( !$this->getHandler() ) {
@@ -946,9 +946,16 @@ abstract class File implements IDBAccessObject {
                $extension = $this->getExtension();
                list( $thumbExt, ) = $this->getHandler()->getThumbType(
                        $extension, $this->getMimeType(), $params );
-               $thumbName = $this->getHandler()->makeParamString( $params ) . '-' . $name;
-               if ( $thumbExt != $extension ) {
-                       $thumbName .= ".$thumbExt";
+               $thumbName = $this->getHandler()->makeParamString( $params );
+
+               if ( $this->repo->supportsSha1URLs() ) {
+                       $thumbName .= '-' . $this->getSha1() . '.' . $thumbExt;
+               } else {
+                       $thumbName .= '-' . $name;
+
+                       if ( $thumbExt != $extension ) {
+                               $thumbName .= ".$thumbExt";
+                       }
                }
 
                return $thumbName;
@@ -1437,7 +1444,7 @@ abstract class File implements IDBAccessObject {
         * @param string $end Only revisions newer than $end will be returned
         * @param bool $inc Include the endpoints of the time range
         *
-        * @return array
+        * @return File[]
         */
        function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
                return array();
index d2c37e6..d5179cb 100644 (file)
@@ -308,8 +308,9 @@ class LocalFile extends File {
                }
 
                // Cache presence for 1 week and negatives for 1 day
-               $cache = ObjectCache::getMainWANInstance();
-               $cache->set( $key, $cacheVal, $this->fileExists ? 86400 * 7 : 86400 );
+               $ttl = $this->fileExists ? 86400 * 7 : 86400;
+               $opts = DatabaseBase::getCacheSetOptions( $this->repo->getSlaveDB() );
+               ObjectCache::getMainWANInstance()->set( $key, $cacheVal, $ttl, $opts );
        }
 
        /**
@@ -321,7 +322,9 @@ class LocalFile extends File {
                        return;
                }
 
-               ObjectCache::getMainWANInstance()->delete( $key );
+               $this->repo->getMasterDB()->onTransactionPreCommitOrIdle( function() use ( $key ) {
+                       ObjectCache::getMainWANInstance()->delete( $key );
+               } );
        }
 
        /**
@@ -430,7 +433,7 @@ class LocalFile extends File {
        }
 
        /**
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param string $fname
         * @return array|bool
         */
@@ -456,7 +459,7 @@ class LocalFile extends File {
        }
 
        /**
-        * @param array $row Row
+        * @param array|object $row
         * @param string $prefix
         * @throws MWException
         * @return array
@@ -983,7 +986,7 @@ class LocalFile extends File {
         * @param int $start Optional: Timestamp, start from
         * @param int $end Optional: Timestamp, end at
         * @param bool $inc
-        * @return array
+        * @return OldLocalFile[]
         */
        function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
                $dbr = $this->repo->getSlaveDB();
@@ -2212,7 +2215,6 @@ class LocalFileDeleteBatch {
 
                // Lock the filearchive rows so that the files don't get deleted by a cleanup operation
                // We acquire this lock by running the inserts now, before the file operations.
-               //
                // This potentially has poor lock contention characteristics -- an alternative
                // scheme would be to insert stub filearchive entries with no fa_name and commit
                // them in a separate transaction, then run the file ops, then update the fa_name fields.
index 0df6f84..0934f6a 100644 (file)
@@ -46,6 +46,7 @@ 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 );
index 56a23ad..5a1006a 100644 (file)
@@ -15,8 +15,9 @@ class HTMLButtonField extends HTMLFormField {
 
        public function __construct( $info ) {
                $info['nodata'] = true;
-               if ( isset( $info['flags'] ) )
+               if ( isset( $info['flags'] ) ) {
                        $this->mFlags = $info['flags'];
+               }
                parent::__construct( $info );
        }
 
@@ -28,7 +29,7 @@ class HTMLButtonField extends HTMLFormField {
                ) {
                        $prefix = 'mw-ui-';
                        // add mw-ui-button separately, so the descriptor doesn't need to set it
-                       $flags .= ' ' . $prefix.'button';
+                       $flags .= ' ' . $prefix . 'button';
                }
                foreach ( $this->mFlags as $flag ) {
                        $flags .= ' ' . $prefix . $flag;
index 9666c4e..b226854 100644 (file)
@@ -56,7 +56,10 @@ class HTMLCheckField extends HTMLFormField {
                $attr['id'] = $this->mID;
                $attr['name'] = $this->mName;
 
-               $attr += $this->getAttributes( array( 'disabled', 'tabindex' ), array( 'tabindex' => 'tabIndex' ) );
+               $attr += $this->getAttributes(
+                       array( 'disabled', 'tabindex' ),
+                       array( 'tabindex' => 'tabIndex' )
+               );
 
                if ( $this->mClass !== '' ) {
                        $attr['classes'] = array( $this->mClass );
index 08fa0a9..e51620f 100644 (file)
@@ -537,6 +537,12 @@ class HTMLForm extends ContextSource {
         *       params) or strings (message keys)
         */
        function trySubmit() {
+               $valid = true;
+               $hoistedErrors = array();
+               $hoistedErrors[] = isset( $this->mValidationErrorMessage )
+                       ? $this->mValidationErrorMessage
+                       : array( 'htmlform-invalid-input' );
+
                $this->mWasSubmitted = true;
 
                # Check for cancelled submission
@@ -558,15 +564,20 @@ class HTMLForm extends ContextSource {
                        if ( $field->isHidden( $this->mFieldData ) ) {
                                continue;
                        }
-                       if ( $field->validate(
-                                       $this->mFieldData[$fieldname],
-                                       $this->mFieldData )
-                               !== true
-                       ) {
-                               return isset( $this->mValidationErrorMessage )
-                                       ? $this->mValidationErrorMessage
-                                       : array( 'htmlform-invalid-input' );
+                       $res = $field->validate( $this->mFieldData[$fieldname], $this->mFieldData );
+                       if ( $res !== true ) {
+                               $valid = false;
+                               if ( $res !== false && !$field->canDisplayErrors() ) {
+                                       $hoistedErrors[] = array( 'rawmessage', $res );
+                               }
+                       }
+               }
+
+               if ( !$valid ) {
+                       if ( count( $hoistedErrors ) === 1 ) {
+                               $hoistedErrors = $hoistedErrors[0];
                        }
+                       return $hoistedErrors;
                }
 
                $callback = $this->mSubmitCallback;
@@ -948,7 +959,11 @@ class HTMLForm extends ContextSource {
                        $html = Xml::fieldset( $legend, $html );
                }
 
-               return Html::rawElement( 'form', $this->getFormAttributes() + array( 'class' => 'visualClear' ), $html );
+               return Html::rawElement(
+                       'form',
+                       $this->getFormAttributes() + array( 'class' => 'visualClear' ),
+                       $html
+               );
        }
 
        /**
index 13756e3..20d7250 100644 (file)
@@ -55,6 +55,15 @@ abstract class HTMLFormField {
                return false;
        }
 
+       /**
+        * True if this field type is able to display errors; false if validation errors need to be
+        * displayed in the main HTMLForm error area.
+        * @return bool
+        */
+       public function canDisplayErrors() {
+               return true;
+       }
+
        /**
         * Get a translated interface message
         *
@@ -916,7 +925,8 @@ abstract class HTMLFormField {
         * Returns the given attributes from the parameters
         *
         * @param array $list List of attributes to get
-        * @param array $mappings Optional - Key/value map of attribute names to use instead of the ones passed in
+        * @param array $mappings Optional - Key/value map of attribute names to use
+        *   instead of the ones passed in.
         * @return array Attributes
         */
        public function getAttributes( array $list, array $mappings = null ) {
index ffde915..e4695f7 100644 (file)
@@ -55,4 +55,8 @@ class HTMLHiddenField extends HTMLFormField {
        public function getInputHTML( $value ) {
                return '';
        }
+
+       public function canDisplayErrors() {
+               return false;
+       }
 }
index a225c67..ade4cf7 100644 (file)
@@ -55,7 +55,9 @@ class HTMLTitleTextField extends HTMLTextField {
                }
 
                $text = $title->getPrefixedText();
-               if ( $this->mParams['namespace'] !== false && !$title->inNamespace( $this->mParams['namespace'] ) ) {
+               if ( $this->mParams['namespace'] !== false &&
+                       !$title->inNamespace( $this->mParams['namespace'] )
+               ) {
                        return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text )->parse();
                }
 
index 84d40a1..60f02a1 100644 (file)
@@ -39,7 +39,9 @@ class OOUIHTMLForm extends HTMLForm {
         */
        protected $displayFormat = 'ooui';
 
-       public static function loadInputFromParameters( $fieldname, $descriptor, HTMLForm $parent = null ) {
+       public static function loadInputFromParameters( $fieldname, $descriptor,
+               HTMLForm $parent = null
+       ) {
                $field = parent::loadInputFromParameters( $fieldname, $descriptor, $parent );
                $field->setShowEmptyLabel( false );
                return $field;
@@ -133,7 +135,7 @@ class OOUIHTMLForm extends HTMLForm {
        function getErrors( $err ) {
                if ( !$err ) {
                        $errors = array();
-               } else if ( $err instanceof Status ) {
+               } elseif ( $err instanceof Status ) {
                        if ( $err->isOK() ) {
                                $errors = array();
                        } else {
index 3788379..124a3d5 100644 (file)
@@ -42,7 +42,9 @@ class VFormHTMLForm extends HTMLForm {
                return true;
        }
 
-       public static function loadInputFromParameters( $fieldname, $descriptor, HTMLForm $parent = null ) {
+       public static function loadInputFromParameters( $fieldname, $descriptor,
+               HTMLForm $parent = null
+       ) {
                $field = parent::loadInputFromParameters( $fieldname, $descriptor, $parent );
                $field->setShowEmptyLabel( false );
                return $field;
index 7070790..57084cb 100644 (file)
@@ -455,6 +455,7 @@ abstract class DatabaseUpdater {
                        flush();
                        if ( $ret !== false ) {
                                $updatesDone[] = $origParams;
+                               wfWaitForSlaves();
                        } else {
                                $updatesSkipped[] = array( $func, $params, $origParams );
                        }
index 662469b..064bd6d 100644 (file)
@@ -370,12 +370,14 @@ abstract class Installer {
                $GLOBALS['wgMemc'] = new EmptyBagOStuff;
                ObjectCache::clear();
                $emptyCache = array( 'class' => 'EmptyBagOStuff' );
+               // disable (problematic) object cache types explicitly, preserving all other (working) ones
+               // bug T113843
                $GLOBALS['wgObjectCaches'] = array(
                        CACHE_NONE => $emptyCache,
                        CACHE_DB => $emptyCache,
                        CACHE_ANYTHING => $emptyCache,
                        CACHE_MEMCACHED => $emptyCache,
-               );
+               ) + $GLOBALS['wgObjectCaches'];
 
                // Load the installer's i18n.
                $wgMessagesDirs['MediawikiInstaller'] = __DIR__ . '/i18n';
@@ -534,13 +536,15 @@ abstract class Installer {
                // then some poorly-formed extensions try to call their own classes
                // after immediately registering them. We really need to get extension
                // registration out of the global scope and into a real format.
-               // @see https://bugzilla.wikimedia.org/67440
+               // @see https://phabricator.wikimedia.org/T69440
                global $wgAutoloadClasses;
                $wgAutoloadClasses = array();
 
+               // @codingStandardsIgnoreStart
                // LocalSettings.php should not call functions, except wfLoadSkin/wfLoadExtensions
                // Define the required globals here, to ensure, the functions can do it work correctly.
                global $wgExtensionDirectory, $wgStyleDirectory;
+               // @codingStandardsIgnoreEnd
 
                MediaWiki\suppressWarnings();
                $_lsExists = file_exists( "$IP/LocalSettings.php" );
@@ -1477,7 +1481,7 @@ abstract class Installer {
                 * want here is $wgHooks['LoadExtensionSchemaUpdates']. This won't work
                 * if the extension has hidden hook registration in $wgExtensionFunctions,
                 * but we're not opening that can of worms
-                * @see https://bugzilla.wikimedia.org/show_bug.cgi?id=26857
+                * @see https://phabricator.wikimedia.org/T28857
                 */
                global $wgAutoloadClasses;
                $wgAutoloadClasses = array();
@@ -1746,7 +1750,7 @@ abstract class Installer {
                                User::newFromName( 'MediaWiki default' )
                        );
                } catch ( Exception $e ) {
-                       //using raw, because $wgShowExceptionDetails can not be set yet
+                       // using raw, because $wgShowExceptionDetails can not be set yet
                        $status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
                }
 
index cb40f88..c10e81a 100644 (file)
@@ -83,7 +83,12 @@ class PostgresInstaller extends DatabaseInstaller {
 
        function submitConnectForm() {
                // Get variables from the request
-               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBport', 'wgDBname', 'wgDBmwschema' ) );
+               $newValues = $this->setVarsFromRequest( array(
+                       'wgDBserver',
+                       'wgDBport',
+                       'wgDBname',
+                       'wgDBmwschema'
+               ) );
 
                // Validate them
                $status = Status::newGood();
index e1063b0..7414d92 100644 (file)
@@ -250,7 +250,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ),
                        array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ),
                        array( 'addPgIndex', 'watchlist', 'wl_user', '(wl_user)' ),
-                       array( 'addPgIndex', 'watchlist', 'wl_user_notificationtimestamp', '(wl_user, wl_notificationtimestamp)' ),
+                       array( 'addPgIndex', 'watchlist', 'wl_user_notificationtimestamp',
+                               '(wl_user, wl_notificationtimestamp)' ),
                        array( 'addPgIndex', 'logging', 'logging_user_type_time',
                                '(log_user, log_type, log_timestamp)' ),
                        array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ),
@@ -691,8 +692,8 @@ END;
        }
 
        protected function changeFieldPurgeTable( $table, $field, $newtype, $default ) {
-               ## For a cache table, empty it if the field needs to be changed, because the old contents
-               ## may be corrupted.  If the column is already the desired type, refrain from purging.
+               # # For a cache table, empty it if the field needs to be changed, because the old contents
+               # # may be corrupted.  If the column is already the desired type, refrain from purging.
                $fi = $this->db->fieldInfo( $table, $field );
                if ( is_null( $fi ) ) {
                        $this->output( "...ERROR: expected column $table.$field to exist\n" );
@@ -955,6 +956,7 @@ END;
                        $this->output( "...bug 66650 already fixed or not applicable.\n" );
                        return true;
                };
-               $this->applyPatch( 'patch-textsearch_bug66650.sql', false, "Rebuilding text search for bug 66650" );
+               $this->applyPatch( 'patch-textsearch_bug66650.sql', false,
+                       'Rebuilding text search for bug 66650' );
        }
 }
index 2693be0..0de1fd7 100644 (file)
@@ -132,7 +132,8 @@ class SqliteUpdater extends DatabaseUpdater {
                        // 1.24
                        array( 'addField', 'page_props', 'pp_sortkey', 'patch-pp_sortkey.sql' ),
                        array( 'dropField', 'recentchanges', 'rc_cur_time', 'patch-drop-rc_cur_time.sql' ),
-                       array( 'addIndex', 'watchlist', 'wl_user_notificationtimestamp', 'patch-watchlist-user-notificationtimestamp-index.sql' ),
+                       array( 'addIndex', 'watchlist', 'wl_user_notificationtimestamp',
+                               'patch-watchlist-user-notificationtimestamp-index.sql' ),
                        array( 'addField', 'page', 'page_lang', 'patch-page-page_lang.sql' ),
                        array( 'addField', 'pagelinks', 'pl_from_namespace', 'patch-pl_from_namespace.sql' ),
                        array( 'addField', 'templatelinks', 'tl_from_namespace', 'patch-tl_from_namespace.sql' ),
index 74904f1..c2243b9 100644 (file)
@@ -960,7 +960,8 @@ class WebInstaller extends Installer {
         *      var:             The variable to be configured (required)
         *      label:           The message name for the label (required)
         *      itemLabelPrefix: The message name prefix for the item labels (required)
-        *      itemLabels:      List of message names to use for the item labels instead of itemLabelPrefix, keyed by values
+        *      itemLabels:      List of message names to use for the item labels instead
+        *                       of itemLabelPrefix, keyed by values
         *      values:          List of allowed values (required)
         *      itemAttribs:     Array of attribute arrays, outer key is the value name (optional)
         *      commonAttribs:   Attribute array applied to all items
index 0ccdb11..211bad1 100644 (file)
@@ -170,7 +170,8 @@ class WebInstallerOutput {
                        $styles = array_merge( $styles, ResourceLoader::makeCombinedStyles(
                                $module->readStyleFiles(
                                        $module->getStyleFiles( $rlContext ),
-                                       $module->getFlip( $rlContext )
+                                       $module->getFlip( $rlContext ),
+                                       $rlContext
                        ) ) );
                }
 
index 7e34f96..9f6f22c 100644 (file)
        "config-install-interwiki-exists": "<strong>Advertencia:</strong> la tabla de interwikis parece ya contener entradas.\nSe omitirá la lista predeterminada.",
        "config-install-stats": "Iniciando las estadísticas",
        "config-install-keys": "Generando claves secretas",
-       "config-insecure-keys": "<strong>Advertencia:</strong> {{PLURAL:$2|una clave de seguridad generada|las claves de seguridad generadas}} ($1) durante la instalación no  {{PLURAL:$2|es totalmente segura|son totalmente seguras}}. Considera {{PLURAL:$2| cambiarla|cambiarlas}} manualmente.",
+       "config-insecure-keys": "<strong>Advertencia:</strong> {{PLURAL:$2|una clave de seguridad generada|las claves de seguridad generadas}} ($1) durante la instalación no {{PLURAL:$2|es totalmente segura|son totalmente seguras}}. Considera {{PLURAL:$2|cambiarla|cambiarlas}} manualmente.",
        "config-install-updates": "Evitar ejecutar actualizaciones innecesarias",
        "config-install-updates-failed": "<strong>Error:</strong> falló la inserción de claves de actualización en las tablas con el siguiente error: $1",
        "config-install-sysop": "Creando la cuenta de usuario del administrador",
index be3da58..28c2087 100644 (file)
@@ -6,5 +6,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki ä nu installiirtj.'''",
-       "mainpagedocfooter": "Se vores engelskspråĝede [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentåsje tilpasnenge'm åf æ brugergrænseflade] og [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide æ brugervejlednenge] før åplysnenger åpsætnenge'm og anvendelse."
+       "mainpagedocfooter": "Sie [//meta.wikimedia.org/wiki/Help:Contents brugewejliednengen] for oplysnenge om brugi å wikiprogramme.\n\n== Å kom i gång ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listen öwe opsättnengsmulihede]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki oft stellen spöyrgsmol]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postlist ångoenje utdjielse å MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Öwesätt MediaWiki te det spraw]"
 }
index 573172d..31547ad 100644 (file)
        "config-profile-no-anon": "계정 만들기 필요",
        "config-profile-fishbowl": "승인된 편집자만",
        "config-profile-private": "비공개 위키",
-       "config-profile-help": "ì\9c\84í\82¤ë\8a\94 ê°\80ë\8a¥í\95\9c ë§\8eì\9d\80 ì\82¬ë\9e\8cë\93¤ì\9d´ í\8e¸ì§\91í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\95  ë\95\8c ê°\80ì\9e¥ ë\9b°ì\96´ë\82\9c ì\97­í\95 ì\9d\84 í\95©ë\8b\88ë\8b¤.\n미ë\94\94ì\96´ì\9c\84í\82¤ì\97\90ì\84\9cë\8a\94 ìµ\9cê·¼ ë°\94ë\80\9cì\9d\84 ê²\80í\86 í\95\98기 ì\89½ê³ , ë¯¸ì\88\99í\95\98ê±°ë\82\98 ì\95\85ì\9d\98ì \81ì\9d¸ ì\82¬ì\9a©ì\9e\90ì\9d\98 ì\96´ë\96 한 손실을 되돌리는 것이 쉽습니다.\n\n그러나 많은 사람이 미디어위키가 다양한 역할을 수행하는 데 유용하다는 것을 알고 있지만, 때로는 모든 사람에게 위키 방식의 장점을 설득하기 쉽지 않을 지도 모릅니다.\n그래서 선택할 수 있습니다.\n\n<strong>{{int:config-profile-wiki}}/<strong> 모델은 로그인하지 않고도 누구나 편집할 수 있습니다.\n<strong>{{int:config-profile-no-anon}}</strong>인 위키에서는 편집자에게 추가적인 책임을 부여하지만, 부담 없는 기여를 저해할 수도 있습니다.\n\n<strong>{{int:config-profile-fishbowl}}</strong> 시나리오에서는 승인된 사용자만 편집할 수 있지만, 일반 사용자도 문서(문서 역사 포함)는 볼 수 있습니다.\n<strong>{{int:config-profile-private}}</strong>는 승인된 사용자만 문서를 볼 수 있으며, 승인된 사용자 그룹이 편집할 수 있습니다.\n\n더 복잡한 사용자 권한 설정은 설치한 후 사용할 수 있으며 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 관련 설명서 항목]을 참조하세요.",
+       "config-profile-help": "ì\9c\84í\82¤ë\8a\94 ê°\80ë\8a¥í\95\9c ë§\8eì\9d\80 ì\82¬ë\9e\8cë\93¤ì\9d´ í\8e¸ì§\91í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\95  ë\95\8c ê°\80ì\9e¥ ë\9b°ì\96´ë\82\9c ì\97­í\95 ì\9d\84 í\95©ë\8b\88ë\8b¤.\n미ë\94\94ì\96´ì\9c\84í\82¤ì\97\90ì\84\9cë\8a\94 ìµ\9cê·¼ ë°\94ë\80\9cì\9d\84 ê²\80í\86 í\95\98기 ì\89½ê³ , ë¯¸ì\88\99í\95\98ê±°ë\82\98 ì\95\85ì\9d\98ì \81ì\9d¸ ì\82¬ì\9a©ì\9e\90ì\97\90 ì\9d\98한 손실을 되돌리는 것이 쉽습니다.\n\n그러나 많은 사람이 미디어위키가 다양한 역할을 수행하는 데 유용하다는 것을 알고 있지만, 때로는 모든 사람에게 위키 방식의 장점을 설득하기 쉽지 않을 지도 모릅니다.\n그래서 선택할 수 있습니다.\n\n<strong>{{int:config-profile-wiki}}/<strong> 모델은 로그인하지 않고도 누구나 편집할 수 있습니다.\n<strong>{{int:config-profile-no-anon}}</strong>인 위키에서는 편집자에게 추가적인 책임을 부여하지만, 부담 없는 기여를 저해할 수도 있습니다.\n\n<strong>{{int:config-profile-fishbowl}}</strong> 시나리오에서는 승인된 사용자만 편집할 수 있지만, 일반 사용자도 문서(문서 역사 포함)는 볼 수 있습니다.\n<strong>{{int:config-profile-private}}</strong>는 승인된 사용자만 문서를 볼 수 있으며, 승인된 사용자 그룹이 편집할 수 있습니다.\n\n더 복잡한 사용자 권한 설정은 설치한 후 사용할 수 있으며 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 관련 설명서 항목]을 참조하세요.",
        "config-license": "저작권 및 라이선스:",
        "config-license-none": "라이선스 바닥글 없음",
        "config-license-cc-by-sa": "크리에이티브 커먼즈 저작자표시-동일조건변경허락",
index bffdf05..0c11be0 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 Handbooch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde moß.\n\nLuur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De weße wells wi de Wiki-Soffwähr jebruch un bedehnt wääde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\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 Donn MediaWiki op Ding Schprohch aanpaße]"
+       "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!"
 }
index f7e4e67..41f4adf 100644 (file)
@@ -2,14 +2,16 @@
        "@metadata": {
                "authors": [
                        "Eitvys200",
-                       "Mantak111"
+                       "Mantak111",
+                       "Zygimantus"
                ]
        },
        "config-desc": "MediaWiki diegimas",
        "config-title": "MediaWiki $1 diegimas",
        "config-information": "Informacija",
        "config-localsettings-key": "Naujinimo raktas:",
-       "config-localsettings-badkey": "Raktą, kurį pateikėte yra neteisingas.",
+       "config-localsettings-badkey": "Raktas, kurį pateikėte, yra neteisingas.",
+       "config-session-error": "Klaida pradedant seansą: $1",
        "config-your-language": "Jūsų kalba:",
        "config-wiki-language": "Viki kalba:",
        "config-back": "← Atgal",
        "config-page-install": "Įdiegti",
        "config-page-complete": "Baigta!",
        "config-page-restart": "Iš naujo paleiskite diegimą",
-       "config-page-readme": "Perskaityk manę",
+       "config-page-readme": "Skaityti daugiau",
+       "config-page-releasenotes": "Leidimo pastabos",
        "config-page-copying": "Kopijuojama",
        "config-page-upgradedoc": "Atnaujinama",
-       "config-page-existingwiki": "Esamas wiki",
+       "config-page-existingwiki": "Esamas viki",
        "config-restart": "Taip, paleiskite jį iš naujo",
        "config-env-php": "PHP $1 yra įdiegtas.",
-       "config-env-php-toolow": "PHP $1 įdiegta.\nTačiau, MediaWiki reikia PHP $2 ar naujesnės.",
+       "config-diff3-bad": "GNU diff3 nerastas.",
        "config-db-type": "Duomenų bazės tipas:",
        "config-db-host": "Duomenų bazės serveris:",
        "config-db-name": "Duomenų bazės pavadinimas:",
        "config-mssql-windowsauth": "Windows autentifikavimas",
        "config-site-name": "Viki pavadinimas:",
        "config-site-name-blank": "Įveskite svetainės pavadinimą.",
-       "config-project-namespace": "Projekto pavadinimas:",
+       "config-project-namespace": "Projekto vardų sritis:",
        "config-ns-generic": "Projektas",
        "config-ns-site-name": "Toks pat kaip viki pavadinimas: $1",
-       "config-ns-other-default": "ManoWiki",
+       "config-ns-other-default": "ManoViki",
        "config-admin-box": "Administratoriaus paskyra",
-       "config-admin-name": "Jūsų vardas:",
+       "config-admin-name": "Jūsų naudotojo vardas:",
        "config-admin-password": "Slaptažodis:",
        "config-admin-password-confirm": "Slaptažodis dar kartą:",
        "config-admin-name-blank": "Įveskite administratoriaus vartotojo vardą.",
@@ -67,9 +70,9 @@
        "config-optional-continue": "Paklausti daugiau klausimų.",
        "config-optional-skip": "Man jau nuobodu, tiesiog įdiekite viki.",
        "config-profile": "Vartotojo teisių paskyra:",
-       "config-profile-wiki": "Tradicinė viki",
+       "config-profile-wiki": "Atidaryti viki",
        "config-profile-private": "Privati viki",
-       "config-license-pd": "Viešas Domenas",
+       "config-license-pd": "Viešas domenas",
        "config-email-settings": "El. pašto nustatymai",
        "config-upload-enable": "Įgalinti failų įkėlimus",
        "config-logo": "Logotipo URL:",
@@ -81,7 +84,7 @@
        "config-install-tables": "Kuriamos lentelės",
        "config-install-stats": "Inicijuojamos statistikos",
        "config-install-keys": "Generuojami slapti raktai",
-       "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 wiki]'''.",
+       "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",
        "mainpagetext": "'''MediaWiki sėkmingai įdiegta.'''",
index 03ea59c..235ff29 100644 (file)
@@ -1,4 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Taresi"
+               ]
+       },
+       "config-project-namespace": "Tlatequipanōlli ītōcātlacāuh:",
        "mainpagetext": "'''MediaHuiqui cualli ōmotlahtlāli.'''"
 }
index fd0ab3e..b66bed0 100644 (file)
        "config-license-help": "Nu cuofeno 'e wiki pubbrece lassano 'e cuntribbute lloro cu na [http://freedomdefined.org/Definition licienza libbera]. Chesto aiutasse a crià nu senso 'e pruprietà spartuta dint'a communità e ncuraggiasse a cuntribbuiì a nu tèrmene luongo. Nun è generalmente necessario pe' nu wiki privato o aziendale.\n\nSi vulite ausà testi 'a Wikipedia, o vulite ca Wikipedia se pozza miette 'n grado d'accettà teste cupiate d' 'o wiki vuosto, avissev'a scegiere <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nApprimma Wikipedia aveva ausato 'a GNU Free Documentation License. 'A GFDL è una licienza valida, ma è di difficile comprensiona e complica 'o riutilizzo 'e cuntenute.",
        "config-email-settings": "Mpustaziune email",
        "config-enable-email": "Premmette mmasciate elettroniche r'asciuta",
+       "config-enable-email-help": "Si vulite ca 'o sistema 'e mmasciate mail funziunasse, [http://www.php.net/manual/en/mail.configuration.php 'e mpustaziune PHP] s'avesser'a ffà bbuone.\nSi nun vulite 'a funziona mmasciata e-mail, allora stutate chiste llàn.",
        "config-email-user": "Premmette email utente-utente",
        "config-email-user-help": "Cunzente a ll'utente 'e mannà uno a ll'ato le mail si 'e teneno appicciate dint' 'e preferenze lloro.",
        "config-email-usertalk": "Premmette notifiche p' 'e paggene 'e chiacchiera utente",
        "config-email-usertalk-help": "Premmette ll'utente 'e ricevere notifiche p' 'e cagnamiente r' 'e paggene 'e chiacchiera lloro, si l'avessero appicciato dint' 'e preferenze lloro.",
        "config-email-watchlist": "Appiccia notifica 'osservati speciale",
+       "config-email-watchlist-help": "Premmettesse ll'utente 'e se piglià notifiche ncopp' 'e paggene cuntrullate lloro si tenessero appicciate chisto in'a le mpustaziune.",
        "config-email-auth": "Appiccia autenticaziona via email",
+       "config-email-auth-help": "Si st'opzione è appicciata, ll'utente avesser'a cunfermà 'o cunto e-mail ausanno nu cullegamento ca se mannasse a chiste quanno facessero 'a mpustaziona o pure quanno facessero 'o cagnamiento.\nSurtanto 'e mail autenticate putesser piglià mail 'a ll'at'utente o cagnà email 'e notifica.\nMpustà st'opzione è <strong>raccumannato</strong p' 'e wiki pubbreche pecché se putesse ausà o se fà abbuso d' 'e funziune mail.",
        "config-email-sender": "Innerizo email e ritorno:",
+       "config-email-sender-help": "Nzèrta l'indirizzo email ca s'avess'ausà comme indirizzo 'e turnata p' 'a posta asciuta.\nChest'è l'indirizzo addò veneno l'errure.\nNu cuofeno 'e server posta vulessero minimo na parte d' 'o nomme dumminio valido.",
        "config-upload-settings": "Immaggene e upload",
        "config-upload-enable": "Premmette 'a carreca 'e file",
+       "config-upload-help": "'E careche 'e file putessero esporre 'e server vuoste a rischie 'e sicurezza. Pe n'avé cchiù nfurmaziune, liggite  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security 'a seziona 'e sicurezza] int' 'o manuale.\n\nPe' puté appiccià 'a funziona carreca, cagnate 'o modo dint' 'a cartella 'e ll'<code>immaggene</code> sott' ' a cartella rareca MediaWiki accussì facenno ca 'o web server putesse scrivere a into.\nAllora appicciate st'opzione.",
        "config-upload-deleted": "Cartella p' 'e file scancellate:",
        "config-upload-deleted-help": "Sciglite na cartella addò s'astipassero 'e file scancellate.\nIdealmente a sta cartella nun s'avess'a trasì r' 'a web",
        "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-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-install-pg-schema-not-exist": "'O schema PostgreSQL nun esiste.",
        "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-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-user-create-failed": "Crianno utente \"$1\" guastaje: $2",
+       "config-install-user-grant-failed": "A ce dà 'e premmesse a ll'utente \"$1\" scassaje: $2",
+       "config-install-user-missing": "L'utente indicato \"$1\" nun esiste.",
+       "config-install-user-missing-create": "L'utente indicato \"$1\" nun esiste.\nSciglite 'a casella \"crìa utenza\" ccà abbascio si 'a vulite crià.",
+       "config-install-tables": "Crianno tabbelle",
+       "config-install-tables-exist": "'''Attenziò:''' pare ch' 'e tabbelle 'e MediaWiki esisteno già.\nZumpo 'a creazione.",
+       "config-install-tables-failed": "<strong>Error:</strong>: 'A criazione d' 'a tabbella nun ngarraje, scassaje accussì: $1",
+       "config-install-interwiki": "Ghienchere 'a tabbella predefinita interwiki",
+       "config-install-interwiki-list": "Nun se pò lieggere 'o file <code>interwiki.list</code>.",
+       "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-install-updates": "Mpiccià ll'agghiurnamiente ca nun fossero necessarie",
index 75f73d3..7f76504 100644 (file)
@@ -2,10 +2,13 @@
        "@metadata": {
                "authors": [
                        "Aalam",
-                       "Babanwalia"
+                       "Babanwalia",
+                       "ਪ੍ਰਚਾਰਕ"
                ]
        },
+       "config-desc": "ਮੀਡੀਅਾਵਿਕੀ ਲੲੀ ਸਥਾਪਿਤਕਰਤਾ",
        "config-information": "ਜਾਣਕਾਰੀ",
+       "config-localsettings-badkey": "ਤੁਹਾਡੇ ਦੁਅਾਰਾ ਦਿਤੀ ਗੲੀ ਚਾਬੀ ਗਲਤ ਹੈ",
        "config-your-language": "ਤੁਹਾਡੀ ਭਾਸ਼ਾ:",
        "config-your-language-help": "ਜੜਾਈ ਦੀ ਕਾਰਵਾਈ ਵੇਲੇ ਵਰਤਣ ਵਾਸਤੇ ਕੋਈ ਭਾਸ਼ਾ ਚੁਣੋ।",
        "config-wiki-language": "ਵਿਕੀ ਦੀ ਭਾਸ਼ਾ:",
@@ -27,6 +30,8 @@
        "config-page-upgradedoc": "ਮਿਆਰ-ਉਚਾਈ",
        "config-page-existingwiki": "ਮੌਜੂਦਾ ਵਿਕੀ",
        "config-restart": "ਹਾਂਜੀ, ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ",
+       "config-env-good": "ਵਾਤਾਵਰਨ ਪਰਖਿਅਾ ਗਿਅਾ ਹੈ।\nਤੁਸੀਂ ਮੀਡੀਆਵਿਕੀ ਸਥਾਪਿਤ ਕਰ ਸਕਦੇ ਹੋ",
+       "config-env-bad": "ਵਾਤਾਵਰਨ ਪਰਖਿਅਾ ਗਿਅਾ ਹੈ।\nਤੁਸੀਂ ਮੀਡੀਆਵਿਕੀ ਸਥਾਪਿਤ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹੋ",
        "config-env-php": "PHP $1 ਜੜਿਆ ਗਿਆ।",
        "config-env-hhvm": "HHVM $1 ਜੜਿਆ ਗਿਆ।",
        "config-db-wiki-settings": "ਇਸ ਵਿਕੀ ਦੀ ਪਛਾਣ ਕਰਾਉ",
index 8f2a0fd..7bcb58f 100644 (file)
        "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": "جي ان يو ډيف3 و نه موندل شو.",
+       "config-using-server": "د پالنگر نوم \"<nowiki>$1</nowiki>\" کارېږي.",
+       "config-using-uri": "د پالنگر URL \"<nowiki>$1$2</nowiki>\" کارېږي.",
        "config-db-type": "د توکبنسټ ډول:",
        "config-db-host": "د توکبنسټ کوربه:",
        "config-db-host-oracle": "د توکبنسټ TNS:",
        "config-db-wiki-settings": "دا ويکي پېژندل",
        "config-db-name": "د توکبنسټ نوم:",
+       "config-db-name-oracle": "د اومتوکبنسټ طرحه:",
        "config-db-username": "د توکبنسټ کارن-نوم:",
        "config-db-password": "د توکبنسټ پټنوم:",
        "config-charset-mysql5-binary": "مای اس کيو ال 4.1/5.0 دوييز",
        "config-profile": "د کارن رښتو پېژنليک:",
        "config-profile-wiki": "پرانيستې ويکي",
        "config-profile-private": "شخصي ويکي",
+       "config-license": "منښتليک او د خپرولو رښته:",
+       "config-license-none": "بې پايڅوړه منښتليک",
        "config-license-pd": "ټولگړی شپول",
        "config-email-settings": "د برېښليک امستنې",
        "config-email-user": "کارن تر کارن برېښليک چارنول",
+       "config-upload-enable": "دوتنې پورته کېدنې چارنول",
+       "config-logo": "د نښې يو آر ال:",
        "config-extensions": "شاتاړي",
        "config-skins": "پوښۍ",
        "config-skins-use-as-default": "همدا پوښۍ په تلواليزه توگه کارول",
index 27dddd3..948b6dd 100644 (file)
@@ -66,7 +66,7 @@
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "<strong>Aviso</strong>: A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].",
        "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [//www.site.icu-project.org/projeto ICU].\nVocê deve [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
-       "config-no-db": "Não foi possível localizar um driver de banco de dados apropriado! Você precisa instalar um driver de banco de dados para PHP. O banco de dados seguinte {{PLURAL: $ 2 | | tipo é tipos são}} suportado: $ 1. Se você compilou o PHP mesmo, reconfigurá-lo com um cliente de banco de dados ativada, por exemplo, usando <code> ./ configure --with-mysqli </ code>. Se você instalou o PHP a partir de um pacote Debian ou Ubuntu, então você também precisa instalar, por exemplo, o <code> php5-mysql </ code> pacote.",
+       "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de banco de dados: $1.\n\nSe compilou o PHP você mesmo, reconfigure-o com um cliente de banco de dados ativado, por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então também precisa instalar, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-register-globals-error": "<strong>Erro: a opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.\nA mesma deve ser desativada para continuar a instalação.</strong>\nVeja [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obter ajuda com isto.",
@@ -75,7 +75,7 @@
        "config-magic-quotes-sybase": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!</strong>\nEsta opção corrompe os dados de entrada de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
        "config-mbstring": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!</strong>\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
        "config-safe-mode": "<strong>Aviso:</strong> O [http://www.php.net/features.safe-mode safe mode] do PHP está ativado.\nEste modo pode causar problemas, especialmente no upload de arquivos e no suporte a <code>math</code>.",
-       "config-xml-bad": "Módulo XML do PHP está faltando. MediaWiki requer funções deste módulo e não vai funcionar nesta configuração. Pode ser necessário instalar o pacote RPM php-xml.",
+       "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nPode precisar de instalar o pacote RPM chamado php-xml.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "<strong>Erro fatal:</strong> O módulo PCRE do PHP parece ser compilado sem suporte a PCRE_UTF8.\nO MediaWiki requer suporte a UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
index fa3512e..c4ccec6 100644 (file)
@@ -29,7 +29,7 @@
        "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-localsettings-incomplete": "Похоже, что существующий файл <code>LocalSettings.php</code> неполон.\nНе установлена переменная $1.\nПожалуйста, измените <code>LocalSettings.php</code> так, чтобы значение этой переменной было задано, затем нажмите «{{int:Config-continue}}».",
        "config-localsettings-connection-error": "Произошла ошибка при подключении к базе данных с помощью настроек, указанных в <code>LocalSettings.php</code> или <code>AdminSettings.php</code>. Пожалуйста, исправьте эти настройки и повторите попытку.\n\n$1",
        "config-session-error": "Ошибка при запуске сессии: $1",
        "config-session-expired": "Ваша сессия истекла.\nСессии настроены на длительность $1.\nВы её можете увеличить, изменив <code>session.gc_maxlifetime</code> в php.ini.\nПерезапустите процесс установки.",
@@ -58,7 +58,7 @@
        "config-help-restart": "Вы хотите удалить все сохранённые данные, которые вы ввели, и запустить процесс установки заново?",
        "config-restart": "Да, начать заново",
        "config-welcome": "=== Проверка окружения ===\nБудут проведены базовые проверки с целью определить, подходит ли данная система для установки MediaWiki.\nНе забудьте включить эту информацию, если вам потребуется помощь для завершения установки.",
-       "config-copyright": "=== Авторские права и условия ===\n\n$1\n\nMediaWiki является свободным программным обеспечением, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но '''без каких-либо гарантий''', даже без подразумеваемых гарантий '''коммерческой ценности''' или '''пригодности для определённой цели'''. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить <doclink href=Copying>копию GNU General Public License</doclink> вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html прочтите её онлайн].",
+       "config-copyright": "=== Авторские права и условия ===\n\n$1\n\nMediaWiki — свободное программное обеспечение, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но <strong>без каких-либо гарантий</strong>, даже без подразумеваемых гарантий <strong>коммерческой ценности</strong> или <strong>пригодности для определённой цели</strong>. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить <doclink href=Copying>копию GNU General Public License</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 Сайт MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ru Справка для пользователей]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/ru Справка для администраторов]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ru FAQ]\n----\n* <doclink href=Readme>Readme-файл</doclink>\n* <doclink href=ReleaseNotes>Информация о выпуске</doclink>\n* <doclink href=Copying>Лицензия</doclink>\n* <doclink href=UpgradeDoc>Обновление</doclink>",
        "config-env-good": "Проверка внешней среды была успешно проведена.\nВы можете установить MediaWiki.",
        "config-env-bad": "Была проведена проверка внешней среды.\nВы не можете установить MediaWiki.",
        "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Это не имя пользователя MediaWiki, это имя пользователя для базы данных.",
        "config-db-install-password": "Введите пароль, который будет использоваться для подключения к базе данных в процессе установки.\nЭто не пароль пользователя MediaWiki, это пароль для базы данных.",
        "config-db-install-help": "Введите имя пользователя и пароль, которые будут использоваться для подключения к базе данных во время процесса установки.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "''' Внимание.''' Вы выбрали механизм MyISAM для хранения данных MySQL. Он не рекомендуется к использованию по следующим причинам:\n* он слабо поддерживает параллелизм из-за табличных блокировок;\n* более склонен к потере данных, по сравнению с другими механизмами;\n* код MediaWiki не всегда учитывает особенности MyISAM должным образом.\n\nЕсли ваша MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.\nЕсли ваша MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
-       "config-mysql-only-myisam-dep": "'''Предупреждение:''' MyISAM является единственной доступной системой хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования с MediaWiki, потому что:\n * он слабо поддерживает параллелизм из-за блокировки таблиц\n * она больше других систем подвержена повреждению\n * кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
+       "config-mysql-only-myisam-dep": "<strong>Предупреждение:</strong> MyISAM — единственная доступная система хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования совместно с MediaWiki, потому что:\n* слабо поддерживает параллелизм из-за блокировки таблиц\n* больше других систем подвержена повреждению\n* кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
        "config-mysql-engine-help": "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.\n\n'''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
        "config-mysql-charset": "Кодировка базы данных:",
        "config-mysql-binary": "Двоичный",
        "config-install-pg-plpgsql": "Проверка языка PL/pgSQL",
        "config-pg-no-plpgsql": "Вам необходимо установить поддержку языка PL/pgSQL для базы данных $1",
        "config-pg-no-create-privs": "Учётная запись, указанная для установки, не обладает достаточными привилегиями для создания учётной записи.",
-       "config-pg-not-in-role": "УказаннаÑ\8f Ñ\83Ñ\87Ñ\91Ñ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82.\nУказаннаÑ\8f Ð´Ð»Ñ\8f Ñ\83Ñ\81Ñ\82ановки Ñ\83Ñ\87Ñ\91Ñ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\8e Ñ\81Ñ\83пеÑ\80полÑ\8cзоваÑ\82елÑ\8f, Ð¸ Ð½Ðµ Ð¾Ñ\82ноÑ\81иÑ\82Ñ\81Ñ\8f Ðº Ñ\80оли Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f, Ð¿Ð¾Ñ\8dÑ\82омÑ\83 Ð½Ðµ Ð¿Ð¾Ð»Ñ\83Ñ\87аеÑ\82Ñ\81Ñ\8f Ñ\81оздаÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82Ñ\8b, Ð¿Ñ\80инадлежаÑ\89ие Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8e.\n\nMediaWiki Ð² Ð½Ð°Ñ\81Ñ\82оÑ\8fÑ\89ее Ð²Ñ\80емÑ\8f Ñ\82Ñ\80ебÑ\83еÑ\82, Ñ\87Ñ\82обÑ\8b Ð²Ð»Ð°Ð´ÐµÐ»Ñ\8cÑ\86ем Ñ\82аблиÑ\86 Ð±Ñ\8bл Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8c. Ð\9fожалÑ\83йÑ\81Ñ\82а, Ñ\83кажиÑ\82е Ð´Ñ\80Ñ\83гое Ð¸Ð¼Ñ\8f Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и Ð´Ð»Ñ\8f Ð²ÐµÐ±, или нажмите кнопку «назад» и укажите пользователя с достаточными для установки правами.",
+       "config-pg-not-in-role": "УказаннаÑ\8f Ñ\83Ñ\87Ñ\91Ñ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82.\nÐ\92Ñ\8bбÑ\80аннаÑ\8f Ð²Ð°Ð¼Ð¸ Ð´Ð»Ñ\8f Ñ\83Ñ\81Ñ\82ановки Ñ\83Ñ\87Ñ\91Ñ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\8e Ñ\81Ñ\83пеÑ\80полÑ\8cзоваÑ\82елÑ\8f Ð¸ Ð½Ðµ Ð¾Ñ\82ноÑ\81иÑ\82Ñ\81Ñ\8f Ðº Ñ\80оли Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f; Ð¿Ð¾Ñ\8dÑ\82омÑ\83 Ð½Ðµ Ð¿Ð¾Ð»Ñ\83Ñ\87аеÑ\82Ñ\81Ñ\8f Ñ\81оздаÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82Ñ\8b, Ð¿Ñ\80инадлежаÑ\89ие Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8e.\n\nMediaWiki Ð² Ð½Ð°Ñ\81Ñ\82оÑ\8fÑ\89ее Ð²Ñ\80емÑ\8f Ñ\82Ñ\80ебÑ\83еÑ\82, Ñ\87Ñ\82обÑ\8b Ð²Ð»Ð°Ð´ÐµÐ»Ñ\8cÑ\86ем Ñ\82аблиÑ\86 Ð±Ñ\8bл Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8c. Ð\9fожалÑ\83йÑ\81Ñ\82а, Ñ\83кажиÑ\82е Ð´Ñ\80Ñ\83гое Ð¸Ð¼Ñ\8f Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и Ð´Ð»Ñ\8f Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f, или нажмите кнопку «назад» и укажите пользователя с достаточными для установки правами.",
        "config-install-user": "Создание базы данных пользователей",
        "config-install-user-alreadyexists": "Участник «$1» уже существует",
        "config-install-user-create-failed": "Не получилось создать участника «$1»: $2",
index da33b30..c7c1b3d 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "AmaryllisGardener",
                        "John Reid",
-                       "Seb35"
+                       "Seb35",
+                       "Macofe"
                ]
        },
        "config-desc": "The installer fer MediaWiki",
        "config-db-install-account": "Uiser accoont fer installâtion",
        "config-db-username": "Database uisername:",
        "config-db-password": "Database passwaird:",
-       "config-db-password-empty": "Please enter ae passwaird fer the new database uiser: $1.\nWhile it micht be possible tae mak uisers wi naw passwairds, it's naw secure.",
-       "config-db-username-empty": "Ye maun enter ae value fer \"{{int:config-db-username}}\".",
        "config-db-install-username": "Enter the uisername that will be uised tae connect til the database durin the installâtion process.\nThis isna the uisername o the MediaWiki accont; this is the uisername fr yer database.",
        "config-db-install-password": "Enter the passwaird that will be uised tae connect til the database durin the installâtion process.\nThis isna the passwaird fer the MediaWiki accoont; this is the passwaird fer yer database.",
        "config-db-install-help": "Enter the uisername an passwaird that will be uised tae connect til the database durin the installâtion process.",
        "config-upgrade-done": "Upgrade compleate.\n\nYe can nou [$1 stert uising yer wiki].\n\nGif ye wish tae regenerate yer <code>LocalSettings.php</code> file, clap the button ablow.\nThis <strong> isna recommended</strong> onless ye'r haein problems wi yer wiki.",
        "config-upgrade-done-no-regenerate": "Upgrade compleate.\n\nYe can nou [$1 stert uising yer wiki].",
        "config-regenerate": "Regênerate LocalSettings.php →",
-       "config-show-table-status": "<code>SHAW BUIRD STATUS</code> speirin failed!",
+       "config-show-table-status": "<code>SHOW TABLE STATUS</code> speirin failed!",
        "config-unknown-collation": "<strong>Warnishment:</strong> Database is uisin onrecognized collation.",
        "config-db-web-account": "Database accoont fer wab access",
        "config-db-web-help": "Select the uisername n passwaird that the wab server will uise tae connect til the database server, durin ordinair operation o the wiki.",
index 7f0ad67..a6f0745 100644 (file)
@@ -1,22 +1,23 @@
 {
        "@metadata": {
                "authors": [
-                       "Ammartivari"
+                       "Ammartivari",
+                       "Kosovastar"
                ]
        },
        "config-desc": "Instaluesi për MediaWiki",
        "config-title": "Instalimi MediaWiki $1",
-       "config-information": "Të dhëna",
-       "config-your-language": "Gjuha juaj:",
+       "config-information": "Informacion",
+       "config-your-language": "Gjuha juaj:",
        "config-your-language-help": "Zgjidhni një gjuhë për ta përdorur gjatë procesit të instalimit.",
-       "config-wiki-language": "Gjuha wiki:",
-       "config-wiki-language-help": "Zgjidhni gjuhën në të cilën wiki do të jetë kryesisht e shkruar.",
+       "config-wiki-language": "Gjuha e wikit:",
+       "config-wiki-language-help": "Zgjidhni gjuhën e cila do të mbizotërojë në shkrimin e wiki-t.",
        "config-back": "← Prapa",
        "config-continue": "Para →",
        "config-page-language": "Gjuha",
-       "config-page-welcome": "Mirë se vini në MediaWiki!",
-       "config-page-dbconnect": "Lidhuni me bazën e të dhënave",
-       "config-page-dbsettings": "Cilësimet e bazës së të dhënave",
+       "config-page-welcome": "Mirësevini në MediaWiki!",
+       "config-page-dbconnect": "Lidhu me bazën e të dhënave",
+       "config-page-dbsettings": "Parametrat e bazës së të dhënave",
        "config-page-name": "Emri",
        "config-page-options": "Opcionet",
        "config-page-install": "Instalo",
        "config-admin-box": "Llogari administruesi",
        "config-admin-name-blank": "Shkruani nofkën e një administruesi.",
        "config-admin-password-blank": "Shkruani një fjalëkalim për llogarinë e administruesit.",
-       "config-admin-email": "Email adresa:",
+       "config-admin-email": "Adresa e emailit:",
        "config-license-pd": "Domeni publik",
-       "config-logo": "URL-ja i logos:",
+       "config-logo": "URL e logos:",
        "config-install-tables": "Duke krijuar tabela",
+       "config-install-stats": "Nisja e statistikave",
        "config-help": "ndihmë",
        "mainpagetext": "'''MediaWiki software u instalua me sukses.'''",
        "mainpagedocfooter": "Për më shumë informata rreth përdorimit të softwerit wiki , ju lutem shikoni [//meta.wikimedia.org/wiki/Help:Contents dokumentacionin përkatës].\n\n== Sa për fillim==\n* [//www.mediawiki.org/wiki/Help:Configuration_settings Parazgjedhjet e MediaWiki-t]\n* [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWiki-t]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]"
index 1d4867d..bfd5ce6 100644 (file)
@@ -6,13 +6,17 @@
                ]
        },
        "config-title": "MediaWiki $1 пуктон",
+       "config-information": "Информация",
        "config-your-language": "Тӥляд кылды:",
        "config-back": "← Берлань",
        "config-continue": "Азьлань →",
        "config-page-language": "Кыл",
+       "config-page-name": "Ним",
        "config-page-options": "Настройкаос",
        "config-page-complete": "Быдэстэмын!",
        "config-page-readme": "Лыдӟы монэ",
        "config-page-copying": "Лицензия",
+       "config-page-upgradedoc": "Выльдытон",
+       "config-diff3-bad": "GNU diff3 шедьтэмын ӧвӧл.",
        "mainpagetext": "'''MediaWiki движок азинлыко пуктэмын.'''"
 }
index d6f88a7..1079be0 100644 (file)
        "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視清單有關的通知。",
        "config-email-auth": "開啟電子郵件身份認證",
        "config-email-auth-help": "若開啟此選項,使用者不論設定或者更改電子郵件地址,都必須透過收信的方式確認沒有問題。\n只有驗證過的電子郵件地址可以收到來自其他使用者或修改通知的信件。\n公開的 Wiki 會 <strong>建議</strong> 設定此選項,以防使用者濫用電子郵件功能。",
-       "config-email-sender": "電子郵件回覆址:",
+       "config-email-sender": "電子郵件回覆址:",
        "config-email-sender-help": "請輸入要用來做為外寄郵件的電子郵件回覆地址。\n該郵件地址會收到被拒收的信件。\n許多郵件伺服器會要求使用有效的網域名稱。",
        "config-upload-settings": "圖片和檔案上傳",
        "config-upload-enable": "開啟檔案上傳",
index 33e5066..89aeaae 100644 (file)
@@ -209,49 +209,35 @@ class Interwiki {
                        return Interwiki::loadFromArray( $iwData );
                }
 
-               $cache = ObjectCache::getMainWANInstance();
-
-               if ( !$iwData ) {
-                       $key = wfMemcKey( 'interwiki', $prefix );
-                       $iwData = $cache->get( $key );
-                       if ( $iwData === '!NONEXISTENT' ) {
-                               // negative cache hit
-                               return false;
-                       }
-               }
-
-               // is_array is hack for old keys
-               if ( $iwData && is_array( $iwData ) ) {
+               if ( is_array( $iwData ) ) {
                        $iw = Interwiki::loadFromArray( $iwData );
                        if ( $iw ) {
-                               return $iw;
+                               return $iw; // handled by hook
                        }
                }
 
-               $db = wfGetDB( DB_SLAVE );
+               $iwData = ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       wfMemcKey( 'interwiki', $prefix ),
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $prefix ) {
+                               $dbr = wfGetDB( DB_SLAVE );
 
-               $row = $db->fetchRow( $db->select(
-                       'interwiki',
-                       self::selectFields(),
-                       array( 'iw_prefix' => $prefix ),
-                       __METHOD__
-               ) );
-
-               $iw = Interwiki::loadFromArray( $row );
-               if ( $iw ) {
-                       $mc = array(
-                               'iw_url' => $iw->mURL,
-                               'iw_api' => $iw->mAPI,
-                               'iw_local' => $iw->mLocal,
-                               'iw_trans' => $iw->mTrans
-                       );
-                       $cache->set( $key, $mc, $wgInterwikiExpiry );
+                               $setOpts += DatabaseBase::getCacheSetOptions( $dbr );
 
-                       return $iw;
-               }
+                               $row = $dbr->selectRow(
+                                       'interwiki',
+                                       Interwiki::selectFields(),
+                                       array( 'iw_prefix' => $prefix ),
+                                       __METHOD__
+                               );
 
-               // negative cache hit
-               $cache->set( $key, '!NONEXISTENT', $wgInterwikiExpiry );
+                               return $row ? (array)$row : '!NONEXISTENT';
+                       },
+                       $wgInterwikiExpiry
+               );
+
+               if ( is_array( $iwData ) ) {
+                       return Interwiki::loadFromArray( $iwData ) ?: false;
+               }
 
                return false;
        }
diff --git a/includes/jobqueue/jobs/DeleteLinksJob.php b/includes/jobqueue/jobs/DeleteLinksJob.php
new file mode 100644 (file)
index 0000000..b24109b
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Job to update link tables for 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 JobQueue
+ */
+
+/**
+ * Job to prune link tables for pages that were deleted
+ *
+ * Only DataUpdate classes should construct these jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.26
+ */
+class DeleteLinksJob extends Job {
+       function __construct( Title $title, array $params ) {
+               parent::__construct( 'deleteLinks', $title, $params );
+               $this->removeDuplicates = true;
+       }
+
+       function run() {
+               if ( is_null( $this->title ) ) {
+                       $this->setLastError( "deleteLinks: Invalid title" );
+                       return false;
+               }
+
+               $pageId = $this->params['pageId'];
+               if ( WikiPage::newFromID( $pageId, WikiPage::READ_LATEST ) ) {
+                       // The page was restored somehow or something went wrong
+                       $this->setLastError( "deleteLinks: Page #$pageId exists" );
+                       return false;
+               }
+
+               $page = WikiPage::factory( $this->title ); // title when deleted
+               $update = new LinksDeletionUpdate( $page, $pageId );
+               DataUpdate::runUpdates( array( $update ) );
+
+               return true;
+       }
+}
index a9010c2..ef9fec0 100644 (file)
@@ -85,8 +85,6 @@ class HTMLCacheUpdateJob extends Job {
                        return;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
-
                // The page_touched field will need to be bumped for these pages.
                // Only bump it to the present time if no "rootJobTimestamp" was known.
                // If it is known, it can be used instead, which avoids invalidating output
@@ -100,9 +98,12 @@ class HTMLCacheUpdateJob extends Job {
                        $touchTimestamp = wfTimestampNow();
                }
 
+               $dbw = wfGetDB( DB_MASTER );
                // Update page_touched (skipping pages already touched since the root job).
                // Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
                foreach ( array_chunk( $pageIds, $wgUpdateRowsPerQuery ) as $batch ) {
+                       $dbw->commit( __METHOD__, 'flush' );
+
                        $dbw->update( 'page',
                                array( 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
                                array( 'page_id' => $batch,
index 935d2fb..4ba1d4c 100644 (file)
@@ -47,13 +47,13 @@ class RefreshLinksJob extends Job {
                }
                // 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)
+               //              (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)
+               //              (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)
+               //              (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
index f558c48..0abc0e3 100644 (file)
@@ -59,14 +59,16 @@ class ThumbnailRenderJob extends Job {
                                if ( $status === 200 || $status === 301 || $status === 302 || $status === 400 ) {
                                        return true;
                                } elseif ( $status ) {
-                                       $this->setLastError( __METHOD__ . ': incorrect HTTP status ' . $status . ' when hitting ' . $thumbUrl );
+                                       $this->setLastError( __METHOD__ . ': incorrect HTTP status ' .
+                                               $status . ' when hitting ' . $thumbUrl );
                                        return false;
                                } else {
                                        $this->setLastError( __METHOD__ . ': HTTP request failure' );
                                        return false;
                                }
                        } else {
-                               $this->setLastError( __METHOD__ . ': unknown thumbnail render method ' . $wgUploadThumbnailRenderMethod );
+                               $this->setLastError( __METHOD__ . ': unknown thumbnail render method ' .
+                                       $wgUploadThumbnailRenderMethod );
                                return false;
                        }
                } else {
index 100d2a4..a0020da 100644 (file)
@@ -57,7 +57,9 @@ class BufferingStatsdDataFactory extends StatsdDataFactory {
                return str_replace( array( '._', '_.' ), '.', $key );
        }
 
-       public function produceStatsdData( $key, $value = 1, $metric = StatsdDataInterface::STATSD_METRIC_COUNT ) {
+       public function produceStatsdData(
+               $key, $value = 1, $metric = StatsdDataInterface::STATSD_METRIC_COUNT
+       ) {
                $entity = $this->produceStatsdDataEntity();
                if ( $key !== null ) {
                        $key = self::normalizeMetricKey( "{$this->prefix}.{$key}" );
index 5a8c4c7..6ca0fed 100644 (file)
@@ -180,6 +180,25 @@ class CSSMin {
                return false;
        }
 
+       /**
+        * Serialize a string (escape and quote) for use as a CSS string value.
+        * http://www.w3.org/TR/2013/WD-cssom-20131205/#serialize-a-string
+        *
+        * @param string $value
+        * @return string
+        * @throws Exception
+        */
+       public static function serializeStringValue( $value ) {
+               if ( strstr( $value, "\0" ) ) {
+                       throw new Exception( "Invalid character in CSS string" );
+               }
+               $value = strtr( $value, array( '\\' => '\\\\', '"' => '\\"' ) );
+               $value = preg_replace_callback( '/[\x01-\x1f\x7f-\x9f]/', function ( $match ) {
+                       return '\\' . base_convert( ord( $match[0] ), 10, 16 ) . ' ';
+               }, $value );
+               return '"' . $value . '"';
+       }
+
        /**
         * @param $file string
         * @return bool|string
@@ -285,7 +304,17 @@ class CSSMin {
                                // Check for global @embed comment and remove it. Allow other comments to be present
                                // before @embed (they have been replaced with placeholders at this point).
                                $embedAll = false;
-                               $rule = preg_replace( '/^((?:\s+|' . CSSMin::PLACEHOLDER . '(\d+)x)*)' . CSSMin::EMBED_REGEX . '\s*/', '$1', $rule, 1, $embedAll );
+                               $rule = preg_replace(
+                                       '/^((?:\s+|' .
+                                               CSSMin::PLACEHOLDER .
+                                               '(\d+)x)*)' .
+                                               CSSMin::EMBED_REGEX .
+                                               '\s*/',
+                                       '$1',
+                                       $rule,
+                                       1,
+                                       $embedAll
+                               );
 
                                // Build two versions of current rule: with remapped URLs
                                // and with embedded data: URIs (where possible).
index 442298a..3d7dee7 100644 (file)
@@ -102,7 +102,10 @@ class HttpStatus {
                }
 
                if ( $version === null ) {
-                       $version = isset( $_SERVER['SERVER_PROTOCOL'] ) && $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.0' ? '1.0' : '1.1';
+                       $version = isset( $_SERVER['SERVER_PROTOCOL'] ) &&
+                               $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.0' ?
+                                       '1.0' :
+                                       '1.1';
                }
 
                header( "HTTP/$version $code $message" );
index 6af3ed5..49966cf 100644 (file)
@@ -55,6 +55,8 @@ class MultiHttpClient {
        protected $maxConnsPerHost = 50;
        /** @var string|null proxy */
        protected $proxy;
+       /** @var string */
+       protected $userAgent = 'MW-MultiHttpClient';
 
        /**
         * @param array $options
@@ -63,6 +65,7 @@ class MultiHttpClient {
         *   - proxy           : HTTP proxy to use
         *   - usePipelining   : whether to use HTTP pipelining if possible (for all hosts)
         *   - maxConnsPerHost : maximum number of concurrent connections (per host)
+        *   - userAgent       : The User-Agent header value to send
         * @throws Exception
         */
        public function __construct( array $options ) {
@@ -73,7 +76,7 @@ class MultiHttpClient {
                        }
                }
                static $opts = array(
-                       'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost', 'proxy'
+                       'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost', 'proxy', 'userAgent'
                );
                foreach ( $opts as $key ) {
                        if ( isset( $options[$key] ) ) {
@@ -343,6 +346,10 @@ class MultiHttpClient {
                        $req['headers']['content-length'] = 0;
                }
 
+               if ( !isset( $req['headers']['user-agent'] ) ) {
+                       $req['headers']['user-agent'] = $this->userAgent;
+               }
+
                $headers = array();
                foreach ( $req['headers'] as $name => $value ) {
                        if ( strpos( $name, ': ' ) ) {
index b6faa37..ea50a85 100644 (file)
@@ -112,7 +112,7 @@ class ReplacementArray {
         */
        public function replace( $subject ) {
                if (
-                       function_exists( 'fss_prep_replace' )  &&
+                       function_exists( 'fss_prep_replace' ) &&
                        version_compare( PHP_VERSION, '5.5.0' ) < 0
                ) {
                        if ( $this->fss === false ) {
index f7afdb5..a8477c9 100644 (file)
@@ -80,7 +80,7 @@ class SamplingStatsdClient extends StatsdClient {
                if ( $this->getReducePacket() ) {
                        $data = $this->reduceCount( $data );
                }
-               //failures in any of this should be silently ignored if ..
+               // failures in any of this should be silently ignored if ..
                $written = 0;
                try {
                        $fp = $this->getSender()->open();
index ddbe8ea..647d938 100644 (file)
@@ -62,6 +62,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
 
        /** Bitfield constants for get()/getMulti() */
        const READ_LATEST = 1; // use latest data for replicated stores
+       const READ_VERIFIED = 2; // promise that caller can tell when keys are stale
 
        public function __construct( array $params = array() ) {
                if ( isset( $params['logger'] ) ) {
@@ -87,16 +88,51 @@ abstract class BagOStuff implements LoggerAwareInterface {
        }
 
        /**
-        * Get an item with the given key. Returns false if it does not exist.
+        * Get an item with the given key, regenerating and setting it if not found
+        *
+        * If the callback returns false, then nothing is stored.
+        *
+        * @param string $key
+        * @param int $ttl Time-to-live (seconds)
+        * @param callable $callback Callback that derives the new value
+        * @return mixed The cached value if found or the result of $callback otherwise
+        * @since 1.27
+        */
+       final public function getWithSetCallback( $key, $ttl, $callback ) {
+               $value = $this->get( $key );
+
+               if ( $value === false ) {
+                       if ( !is_callable( $callback ) ) {
+                               throw new InvalidArgumentException( "Invalid cache miss callback provided." );
+                       }
+                       $value = call_user_func( $callback );
+                       if ( $value !== false ) {
+                               $this->set( $key, $value, $ttl );
+                       }
+               }
+
+               return $value;
+       }
+
+       /**
+        * Get an item with the given key
+        *
+        * If the key includes a determistic input hash (e.g. the key can only have
+        * the correct value) or complete staleness checks are handled by the caller
+        * (e.g. nothing relies on the TTL), then the READ_VERIFIED flag should be set.
+        * This lets tiered backends know they can safely upgrade a cached value to
+        * higher tiers using standard TTLs.
+        *
         * @param string $key
         * @param mixed $casToken [optional]
-        * @param integer $flags Bitfield; supports READ_LATEST [optional]
-        * @return mixed Returns false on failure
+        * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional]
+        * @return mixed Returns false on failure and if the item does not exist
         */
        abstract public function get( $key, &$casToken = null, $flags = 0 );
 
        /**
-        * Set an item.
+        * Set an item
+        *
         * @param string $key
         * @param mixed $value
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
@@ -105,7 +141,8 @@ abstract class BagOStuff implements LoggerAwareInterface {
        abstract public function set( $key, $value, $exptime = 0 );
 
        /**
-        * Delete an item.
+        * Delete an item
+        *
         * @param string $key
         * @return bool True if the item was deleted or not found, false on failure
         */
index 130caeb..b1d3ec2 100644 (file)
 /**
  * Multi-datacenter aware caching interface
  *
- * All operations go to the local cache, except the delete()
- * and touchCheckKey(), which broadcast to all clusters.
+ * All operations go to the local datacenter cache, except for delete(),
+ * touchCheckKey(), and resetCheckKey(), which broadcast to all datacenters.
+ *
  * This class is intended for caching data from primary stores.
  * If the get() method does not return a value, then the caller
  * should query the new value and backfill the cache using set().
- * When the source data changes, the delete() method should be called.
- * Since delete() is expensive, it should be avoided. One can do so if:
+ * When the source data changes, a purge method should be called.
+ * Since purges are expensive, they should be avoided. One can do so if:
  *   - a) The object cached is immutable; or
  *   - b) Validity is checked against the source after get(); or
  *   - c) Using a modest TTL is reasonably correct and performant
- * Consider using getWithSetCallback() instead of the get()/set() cycle.
+ * The simplest purge method is delete().
  *
  * Instances of this class must be configured to point to a valid
  * PubSub endpoint, and there must be listeners on the cache servers
  * that subscribe to the endpoint and update the caches.
  *
  * Broadcasted operations like delete() and touchCheckKey() are done
- * synchronously in the local cluster, but are relayed asynchronously.
+ * synchronously in the local datacenter, but are relayed asynchronously.
  * This means that callers in other datacenters will see older values
- * for however many milliseconds the datacenters are apart. As with
+ * for however many milliseconds the datacenters are apart. As with
  * any cache, this should not be relied on for cases where reads are
  * used to determine writes to source (e.g. non-cache) data stores.
  *
@@ -57,7 +58,7 @@
  * @since 1.26
  */
 class WANObjectCache {
-       /** @var BagOStuff The local cluster cache */
+       /** @var BagOStuff The local datacenter cache */
        protected $cache;
        /** @var string Cache pool name */
        protected $pool;
@@ -67,21 +68,32 @@ class WANObjectCache {
        /** @var int */
        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;
        /** Seconds to tombstone keys on delete() */
-       const HOLDOFF_TTL = 10;
+       const HOLDOFF_TTL = 14; // MAX_COMMIT_DELAY + MAX_REPLICA_LAG + MAX_SNAPSHOT_LAG + 1
+
        /** Seconds to keep dependency purge keys around */
        const CHECK_KEY_TTL = 31536000; // 1 year
        /** Seconds to keep lock keys around */
        const LOCK_TTL = 5;
        /** Default remaining TTL at which to consider pre-emptive regeneration */
        const LOW_TTL = 10;
-       /** Default TTL for temporarily caching tombstoned keys */
-       const TEMP_TTL = 5;
+       /** Default time-since-expiry on a miss that makes a key "hot" */
+       const LOCK_TSE = 1;
 
        /** Idiom for set()/getWithSetCallback() TTL */
        const TTL_NONE = 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;
 
        /** Cache format version number */
        const VERSION = 1;
@@ -150,7 +162,17 @@ class WANObjectCache {
         *   - c) When the source data that "check" keys represent changes,
         *        the touchCheckKey() method is called on them
         *
-        * For keys that are hot/expensive, consider using getWithSetCallback() instead.
+        * Source data entities might exists in a DB that uses snapshot isolation
+        * (e.g. the default REPEATABLE-READ in innoDB). Even for mutable data, that
+        * isolation can largely be maintained by doing the following:
+        *   - a) Calling delete() on entity change *and* creation, before DB commit
+        *   - b) Keeping transaction duration shorter than delete() hold-off TTL
+        *
+        * However, pre-snapshot values might still be seen if an update was made
+        * in a remote datacenter but the purge from delete() didn't relay yet.
+        *
+        * Consider using getWithSetCallback() instead of get()/set() cycles.
+        * That method has cache slam avoiding features for hot/expensive keys.
         *
         * @param string $key Cache key
         * @param mixed $curTTL Approximate TTL left on the key if present [returned]
@@ -239,13 +261,62 @@ class WANObjectCache {
         * the changes do not replicate to the other WAN sites. In that case, delete()
         * should be used instead. This method is intended for use on cache misses.
         *
+        * If the data was read from a snapshot-isolated transactions (e.g. the default
+        * REPEATABLE-READ in innoDB), use 'since' to avoid the following race condition:
+        *   - a) T1 starts
+        *   - b) T2 updates a row, calls delete(), and commits
+        *   - c) The HOLDOFF_TTL passes, expiring the delete() tombstone
+        *   - d) T1 reads the row and calls set() due to a cache miss
+        *   - e) Stale value is stuck in cache
+        *
+        * Example usage:
+        * @code
+        *     $dbr = wfGetDB( DB_SLAVE );
+        *     $setOpts = DatabaseBase::getCacheSetOptions( $dbr );
+        *     // Fetch the row from the DB
+        *     $row = $dbr->selectRow( ... );
+        *     $key = wfMemcKey( 'building', $buildingId );
+        *     $cache->set( $key, $row, 86400, $setOpts );
+        * @endcode
+        *
         * @param string $key Cache key
         * @param mixed $value
         * @param integer $ttl Seconds to live [0=forever]
+        * @param array $opts Options map:
+        *   - lag     : Seconds of slave lag. Typically, this is either the slave lag
+        *               before the data was read or, if applicable, the slave lag before
+        *               the snapshot-isolated transaction the data was read from started.
+        *               [Default: 0 seconds]
+        *   - since   : UNIX timestamp of the data in $value. Typically, this is either
+        *               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.
+        *               [Default: WANObjectCache::TSE_NONE]
         * @return bool Success
         */
-       final public function set( $key, $value, $ttl = 0 ) {
-               $key = self::VALUE_KEY_PREFIX . $key;
+       final public function set( $key, $value, $ttl = 0, array $opts = array() ) {
+               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
+               $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;
+               }
+
+               if ( $age > self::MAX_SNAPSHOT_LAG ) {
+                       if ( $lockTSE >= 0 ) {
+                               $tempTTL = max( 1, (int)$lockTSE ); // set() expects seconds
+                               $this->cache->set( self::STASH_KEY_PREFIX . $key, $value, $tempTTL );
+                       }
+
+                       return true; // no-op the write for being unsafe
+               }
+
                $wrapped = $this->wrap( $value, $ttl );
 
                $func = function ( $cache, $key, $cWrapped ) use ( $wrapped ) {
@@ -254,26 +325,51 @@ class WANObjectCache {
                                : $wrapped;
                };
 
-               return $this->cache->merge( $key, $func, $ttl, 1 );
+               return $this->cache->merge( self::VALUE_KEY_PREFIX . $key, $func, $ttl, 1 );
        }
 
        /**
-        * Purge a key from all clusters
+        * Purge a key from all datacenters
         *
         * This should only be called when the underlying data (being cached)
         * changes in a significant way. This deletes the key and starts a hold-off
         * period where the key cannot be written to for a few seconds (HOLDOFF_TTL).
         * This is done to avoid the following race condition:
-        *   a) Some DB data changes and delete() is called on a corresponding key
-        *   b) A request refills the key with a stale value from a lagged DB
-        *   c) The stale value is stuck there until the key is expired/evicted
+        *   a) Some DB data changes and delete() is called on a corresponding key
+        *   b) A request refills the key with a stale value from a lagged DB
+        *   c) The stale value is stuck there until the key is expired/evicted
         *
         * This is implemented by storing a special "tombstone" value at the cache
         * key that this class recognizes; get() calls will return false for the key
         * and any set() calls will refuse to replace tombstone values at the key.
         * For this to always avoid writing stale values, the following must hold:
-        *   a) Replication lag is bounded to being less than HOLDOFF_TTL; or
-        *   b) If lag is higher, the DB will have gone into read-only mode already
+        *   - a) Replication lag is bounded to being less than HOLDOFF_TTL; or
+        *   - b) If lag is higher, the DB will have gone into read-only mode already
+        *
+        * When using potentially long-running ACID transactions, a good pattern is
+        * to use a pre-commit hook to issue the delete. This means that immediately
+        * after commit, callers will see the tombstone in cache in the local datacenter
+        * and in the others upon relay. It also avoids the following race condition:
+        *   - a) T1 begins, changes a row, and calls delete()
+        *   - b) The HOLDOFF_TTL passes, expiring the delete() tombstone
+        *   - c) T2 starts, reads the row and calls set() due to a cache miss
+        *   - d) T1 finally commits
+        *   - e) Stale value is stuck in cache
+        *
+        * Example usage:
+        * @code
+        *     $dbw->begin(); // start of request
+        *     ... <execute some stuff> ...
+        *     // Update the row in the DB
+        *     $dbw->update( ... );
+        *     $key = wfMemcKey( 'homes', $homeId );
+        *     // Purge the corresponding cache entry just before committing
+        *     $dbw->onTransactionPreCommitOrIdle( function() use ( $cache, $key ) {
+        *         $cache->delete( $key );
+        *     } );
+        *     ... <execute some stuff> ...
+        *     $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
@@ -288,9 +384,9 @@ class WANObjectCache {
                $key = self::VALUE_KEY_PREFIX . $key;
                // Avoid indefinite key salting for sanity
                $ttl = max( $ttl, 1 );
-               // Update the local cluster immediately
+               // Update the local datacenter immediately
                $ok = $this->cache->set( $key, self::PURGE_VAL_PREFIX . microtime( true ), $ttl );
-               // Publish the purge to all clusters
+               // Publish the purge to all datacenters
                return $this->relayPurge( $key, $ttl ) && $ok;
        }
 
@@ -328,7 +424,7 @@ class WANObjectCache {
        }
 
        /**
-        * Purge a "check" key from all clusters, invalidating keys that use it
+        * Purge a "check" key from all datacenters, invalidating keys that use it
         *
         * This should only be called when the underlying data (being cached)
         * changes in a significant way, and it is impractical to call delete()
@@ -356,23 +452,24 @@ class WANObjectCache {
         */
        final public function touchCheckKey( $key ) {
                $key = self::TIME_KEY_PREFIX . $key;
-               // Update the local cluster immediately
+               // Update the local datacenter immediately
                $ok = $this->cache->set( $key,
                        self::PURGE_VAL_PREFIX . microtime( true ), self::CHECK_KEY_TTL );
-               // Publish the purge to all clusters
+               // Publish the purge to all datacenters
                return $this->relayPurge( $key, self::CHECK_KEY_TTL ) && $ok;
        }
 
        /**
-        * Delete a "check" key from all clusters, invalidating keys that use it
+        * Delete a "check" key from all datacenters, invalidating keys that use it
         *
         * This is similar to touchCheckKey() in that keys using it via
         * getWithSetCallback() will be invalidated. The differences are:
-        *   a) The timestamp will be deleted from all caches and lazily
-        *      re-initialized when accessed (rather than set everywhere)
-        *   b) Thus, dependent keys will be known to be invalid, but not
-        *      for how long (they are treated as "just" purged), which
-        *      effects any lockTSE logic in getWithSetCallback()
+        *   - a) The timestamp will be deleted from all caches and lazily
+        *        re-initialized when accessed (rather than set everywhere)
+        *   - b) Thus, dependent keys will be known to be invalid, but not
+        *        for how long (they are treated as "just" purged), which
+        *        effects any lockTSE logic in getWithSetCallback()
+        *
         * The advantage is that this does not place high TTL keys on every cache
         * server, making it better for code that will cache many different keys
         * and either does not use lockTSE or uses a low enough TTL anyway.
@@ -390,70 +487,135 @@ class WANObjectCache {
         */
        final public function resetCheckKey( $key ) {
                $key = self::TIME_KEY_PREFIX . $key;
-               // Update the local cluster immediately
+               // Update the local datacenter immediately
                $ok = $this->cache->delete( $key );
-               // Publish the purge to all clusters
+               // Publish the purge to all datacenters
                return $this->relayDelete( $key ) && $ok;
        }
 
        /**
         * Method to fetch/regenerate cache keys
         *
-        * On cache miss, the key will be set to the callback result,
-        * unless the callback returns false. The arguments supplied are:
-        *     (current value or false, &$ttl)
+        * On cache miss, the key will be set to the callback result via set()
+        * unless the callback returns false. The arguments supplied to it are:
+        *     (current value or false, &$ttl, &$setOpts)
         * The callback function returns the new value given the current
         * value (false if not present). Preemptive re-caching and $checkKeys
         * can result in a non-false current value. The TTL of the new value
         * can be set dynamically by altering $ttl in the callback (by reference).
+        * The $setOpts array can be altered and is given to set() when called;
+        * it is recommended to set the 'since' field to avoid race conditions.
         *
         * Usually, callbacks ignore the current value, but it can be used
         * to maintain "most recent X" values that come from time or sequence
         * based source data, provided that the "as of" id/time is tracked.
         *
-        * Usage of $checkKeys is similar to get()/getMulti(). However,
+        * Usage of $checkKeys is similar to get() and getMulti(). However,
         * rather than the caller having to inspect a "current time left"
         * variable (e.g. $curTTL, $curTTLs), a cache regeneration will be
         * triggered using the callback.
         *
         * The simplest way to avoid stampedes for hot keys is to use
         * the 'lockTSE' option in $opts. If cache purges are needed, also:
-        *   a) Pass $key into $checkKeys
-        *   b) Use touchCheckKey( $key ) instead of delete( $key )
-        * Following this pattern lets the old cache be used until a
-        * single thread updates it as needed. Also consider tweaking
-        * the 'lowTTL' parameter.
+        *   - a) Pass $key into $checkKeys
+        *   - b) Use touchCheckKey( $key ) instead of delete( $key )
         *
-        * Example usage:
+        * Example usage (typical key):
         * @code
-        *     $key = wfMemcKey( 'cat-recent-actions', $catId );
-        *     // Function that derives the new key value given the old value
-        *     $callback = function( $cValue, &$ttl ) { ... };
-        *     // Get the key value from cache or from source on cache miss;
-        *     // try to only let one cluster thread manage doing cache updates
-        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
-        *     $value = $cache->getWithSetCallback( $key, $callback, 60, array(), $opts );
+        *     $catInfo = $cache->getWithSetCallback(
+        *         // Key to store the cached value under
+        *         wfMemcKey( 'cat-attributes', $catId ),
+        *         // Function that derives the new key value
+        *         function ( $oldValue, &$ttl, array &$setOpts ) {
+        *             $dbr = wfGetDB( DB_SLAVE );
+        *             // Account for any snapshot/slave lag
+        *             $setOpts += DatabaseBase::getCacheSetOptions( $dbr );
+        *
+        *             return $dbr->selectRow( ... );
+        *        },
+        *        // Time-to-live (seconds)
+        *        60
+        *     );
         * @endcode
         *
-        * Example usage:
+        * Example usage (key that is expensive and hot):
         * @code
-        *     $key = wfMemcKey( 'cat-state', $catId );
-        *     // The "check" keys that represent things the value depends on;
-        *     // Calling touchCheckKey() on them invalidates "cat-state"
-        *     $checkKeys = array(
-        *         wfMemcKey( 'water-bowls', $houseId ),
-        *         wfMemcKey( 'food-bowls', $houseId ),
-        *         wfMemcKey( 'people-present', $houseId )
+        *     $catConfig = $cache->getWithSetCallback(
+        *         // Key to store the cached value under
+        *         wfMemcKey( 'site-cat-config' ),
+        *         // Function that derives the new key value
+        *         function ( $oldValue, &$ttl, array &$setOpts ) {
+        *             $dbr = wfGetDB( DB_SLAVE );
+        *             // Account for any snapshot/slave lag
+        *             $setOpts += DatabaseBase::getCacheSetOptions( $dbr );
+        *
+        *             return CatConfig::newFromRow( $dbr->selectRow( ... ) );
+        *        },
+        *        // Time-to-live (seconds)
+        *        86400,
+        *        // Calling touchCheckKey() on this key invalidates the cache
+        *        wfMemcKey( 'site-cat-config' ),
+        *        // Try to only let one datacenter thread manage cache updates at a time
+        *        array( 'lockTSE' => 30 )
+        *     );
+        * @endcode
+        *
+        * Example usage (key with dynamic dependencies):
+        * @code
+        *     $catState = $cache->getWithSetCallback(
+        *         // Key to store the cached value under
+        *         wfMemcKey( 'cat-state', $cat->getId() ),
+        *         // Function that derives the new key value
+        *         function ( $oldValue, &$ttl, array &$setOpts ) {
+        *             // Determine new value from the DB
+        *             $dbr = wfGetDB( DB_SLAVE );
+        *             // Account for any snapshot/slave lag
+        *             $setOpts += DatabaseBase::getCacheSetOptions( $dbr );
+        *
+        *             return CatState::newFromResults( $dbr->select( ... ) );
+        *        },
+        *        // Time-to-live (seconds)
+        *        900,
+        *        // The "check" keys that represent things the value depends on;
+        *        // Calling touchCheckKey() on any of them invalidates the cache
+        *        array(
+        *             wfMemcKey( 'sustenance-bowls', $cat->getRoomId() ),
+        *             wfMemcKey( 'people-present', $cat->getHouseId() ),
+        *             wfMemcKey( 'cat-laws', $cat->getCityId() ),
+        *         )
+        *     );
+        * @endcode
+        *
+        * Example usage (hot key holding most recent 100 events):
+        * @code
+        *     $lastCatActions = $cache->getWithSetCallback(
+        *         // Key to store the cached value under
+        *         wfMemcKey( 'cat-last-actions', 100 ),
+        *         // Function that derives the new key value
+        *         function ( $oldValue, &$ttl, array &$setOpts ) {
+        *             $dbr = wfGetDB( DB_SLAVE );
+        *             // Account for any snapshot/slave lag
+        *             $setOpts += DatabaseBase::getCacheSetOptions( $dbr );
+        *
+        *             // Start off with the last cached list
+        *             $list = $oldValue ?: array();
+        *             // Fetch the last 100 relevant rows in descending order;
+        *             // only fetch rows newer than $list[0] to reduce scanning
+        *             $rows = iterator_to_array( $dbr->select( ... ) );
+        *             // Merge them and get the new "last 100" rows
+        *             return array_slice( array_merge( $new, $list ), 0, 100 );
+        *        },
+        *        // Time-to-live (seconds)
+        *        10,
+        *        // No "check" keys
+        *        array(),
+        *        // Try to only let one datacenter thread manage cache updates at a time
+        *        array( 'lockTSE' => 30 )
         *     );
-        *     // Function that derives the new key value
-        *     $callback = function() { ... };
-        *     // Get the key value from cache or from source on cache miss;
-        *     // try to only let one cluster thread manage doing cache updates
-        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
-        *     $value = $cache->getWithSetCallback( $key, $callback, 60, $checkKeys, $opts );
         * @endcode
         *
         * @see WANObjectCache::get()
+        * @see WANObjectCache::set()
         *
         * @param string $key Cache key
         * @param callable $callback Value generation function
@@ -465,6 +627,7 @@ class WANObjectCache {
         *   - lowTTL  : consider pre-emptive updates when the current TTL (sec)
         *               of the key is less than this. It becomes more likely
         *               over time, becoming a certainty once the key is expired.
+        *               [Default: WANObjectCache::LOW_TTL seconds]
         *   - lockTSE : if the key is tombstoned or expired (by $checkKeys) less
         *               than this many seconds ago, then try to have a single
         *               thread handle cache regeneration at any given time.
@@ -472,17 +635,16 @@ class WANObjectCache {
         *               If, on miss, the time since expiration is low, the assumption
         *               is that the key is hot and that a stampede is worth avoiding.
         *               Setting this above WANObjectCache::HOLDOFF_TTL makes no difference.
-        *   - tempTTL : TTL of the temp key used to cache values while a key is tombstoned.
-        *               This avoids excessive regeneration of hot keys on delete() but may
-        *               result in stale values.
+        *               The higher this is set, the higher the worst-case staleness can be.
+        *               Use WANObjectCache::TSE_NONE to disable this logic.
+        *               [Default: WANObjectCache::TSE_NONE]
         * @return mixed Value to use for the key
         */
        final public function getWithSetCallback(
                $key, $callback, $ttl, array $checkKeys = array(), array $opts = array()
        ) {
                $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
-               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : -1;
-               $tempTTL = isset( $opts['tempTTL'] ) ? $opts['tempTTL'] : self::TEMP_TTL;
+               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
 
                // Get the current key value
                $curTTL = null;
@@ -498,26 +660,29 @@ class WANObjectCache {
                $isTombstone = ( $curTTL !== null && $value === false );
                // Assume a key is hot if requested soon after invalidation
                $isHot = ( $curTTL !== null && $curTTL <= 0 && abs( $curTTL ) <= $lockTSE );
+               // Decide whether a single thread should handle regenerations.
+               // This avoids stampedes when $checkKeys are bumped and when preemptive
+               // renegerations take too long. It also reduces regenerations while $key
+               // is tombstoned. This balances cache freshness with avoiding DB load.
+               $useMutex = ( $isHot || ( $isTombstone && $lockTSE > 0 ) );
 
                $lockAcquired = false;
-               if ( $isHot ) {
-                       // Acquire a cluster-local non-blocking lock
+               if ( $useMutex ) {
+                       // Acquire a datacenter-local non-blocking lock
                        if ( $this->cache->lock( $key, 0, self::LOCK_TTL ) ) {
                                // Lock acquired; this thread should update the key
                                $lockAcquired = true;
                        } elseif ( $value !== false ) {
                                // If it cannot be acquired; then the stale value can be used
                                return $value;
-                       }
-               }
-
-               if ( !$lockAcquired && ( $isTombstone || $isHot ) ) {
-                       // Use the stash value for tombstoned keys to reduce regeneration load.
-                       // For hot keys, either another thread has the lock or the lock failed;
-                       // use the stash value from the last thread that regenerated it.
-                       $value = $this->cache->get( self::STASH_KEY_PREFIX . $key );
-                       if ( $value !== false ) {
-                               return $value;
+                       } else {
+                               // Use the stash value for tombstoned keys to reduce regeneration load.
+                               // For hot keys, either another thread has the lock or the lock failed;
+                               // use the stash value from the last thread that regenerated it.
+                               $value = $this->cache->get( self::STASH_KEY_PREFIX . $key );
+                               if ( $value !== false ) {
+                                       return $value;
+                               }
                        }
                }
 
@@ -526,10 +691,12 @@ class WANObjectCache {
                }
 
                // Generate the new value from the callback...
-               $value = call_user_func_array( $callback, array( $cValue, &$ttl ) );
+               $setOpts = array();
+               $value = call_user_func_array( $callback, array( $cValue, &$ttl, &$setOpts ) );
                // When delete() is called, writes are write-holed by the tombstone,
                // so use a special stash key to pass the new value around threads.
-               if ( $value !== false && ( $isHot || $isTombstone ) && $ttl >= 0 ) {
+               if ( $useMutex && $value !== false && $ttl >= 0 ) {
+                       $tempTTL = max( 1, (int)$lockTSE ); // set() expects seconds
                        $this->cache->set( self::STASH_KEY_PREFIX . $key, $value, $tempTTL );
                }
 
@@ -539,7 +706,8 @@ class WANObjectCache {
 
                if ( $value !== false && $ttl >= 0 ) {
                        // Update the cache; this will fail if the key is tombstoned
-                       $this->set( $key, $value, $ttl );
+                       $setOpts['lockTSE'] = $lockTSE;
+                       $this->set( $key, $value, $ttl, $setOpts );
                }
 
                return $value;
index b3c219d..11637d0 100644 (file)
@@ -41,4 +41,3 @@ class HashtableReplacer extends Replacer {
                return $this->table[$matches[$this->index]];
        }
 }
-
index 43dfab3..5be4aea 100644 (file)
@@ -31,10 +31,10 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
         *   * body: array( 'html' => ... )
         *   * $title and $revision are optional
         *  POST /local/v3/transform/wikitext/to/html/{$title}{/$revision}
-        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'bodyOnly' => true/false )
+        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body_only' => true/false )
         *   * $title is optional
         *   * $revision is optional
-     *
+        *
         * There are also deprecated "v1" requests; see onParsoid1Request
         * for details.
         * @param array $params Key/value map
@@ -202,7 +202,7 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
                                        throw new Exception( "You must set a 'wikitext' body key for this request" );
                                }
                                if ( isset( $req['body']['body'] ) ) {
-                                       $req['body']['bodyOnly'] = $req['body']['body'];
+                                       $req['body']['body_only'] = $req['body']['body'];
                                        unset( $req['body']['body'] );
                                }
                        } else {
index 3a7bc58..81442ad 100644 (file)
@@ -29,7 +29,7 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
         *  POST /local/v1/transform/html/to/wikitext{/title}{/revision}
         *   * body: array( 'html' => ... )
         *  POST /local/v1/transform/wikitext/to/html{/title}{/revision}
-        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'bodyOnly' => true/false )
+        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body_only' => true/false )
         *
         * @param array $params Key/value map
         *   - url            : RESTBase server URL
@@ -193,7 +193,7 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
                                        throw new Exception( "You must set a 'wikitext' body key for this request" );
                                }
                                if ( isset( $req['body']['body'] ) ) {
-                                       $req['body']['bodyOnly'] = $req['body']['body'];
+                                       $req['body']['body_only'] = $req['body']['body'];
                                        unset( $req['body']['body'] );
                                }
                        } else {
@@ -225,7 +225,7 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
         *   * body: array( 'html' => ... )
         *   * $title and $revision are optional
         *  POST /local/v3/transform/wikitext/to/html/{$title}{/$revision}
-        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'bodyOnly' => true/false )
+        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body_only' => true/false )
         *   * $title is optional
         *   * $revision is optional
         */
index 07ef24b..72fcc3a 100644 (file)
@@ -125,7 +125,7 @@ class BlockLogFormatter extends LogFormatter {
        public static function formatBlockFlags( $flags, $lang ) {
                $flags = trim( $flags );
                if ( $flags === '' ) {
-                       return ''; //nothing to do
+                       return ''; // nothing to do
                }
                $flags = explode( ',', $flags );
                $flagsCount = count( $flags );
index 1b56584..4c0bd8e 100644 (file)
@@ -646,7 +646,7 @@ class LogEventsList extends ContextSource {
        /**
         * SQL clause to skip forbidden log types for this user
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param string $audience Public/user
         * @param User $user User to check, or null to use $wgUser
         * @return string|bool String on success, false on failure.
index f31a42a..1d31088 100644 (file)
@@ -263,7 +263,7 @@ class LogFormatter {
                                switch ( $entry->getSubtype() ) {
                                        case 'protect':
                                                $text = wfMessage( 'protectedarticle' )
-                                                       ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
+                                                       ->rawParams( $target . ' ' . $parameters['4::description'] )->inContentLanguage()->escaped();
                                                break;
                                        case 'unprotect':
                                                $text = wfMessage( 'unprotectedarticle' )
@@ -271,7 +271,7 @@ class LogFormatter {
                                                break;
                                        case 'modify':
                                                $text = wfMessage( 'modifiedarticleprotection' )
-                                                       ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
+                                                       ->rawParams( $target . ' ' . $parameters['4::description'] )->inContentLanguage()->escaped();
                                                break;
                                        case 'move_prot':
                                                $text = wfMessage( 'movedarticleprotection' )
@@ -932,32 +932,6 @@ class LegacyLogFormatter extends LogFormatter {
                $type = $this->entry->getType();
                $subtype = $this->entry->getSubtype();
 
-               if ( $type == 'protect'
-                       && ( $subtype == 'protect' || $subtype == 'modify' || $subtype == 'unprotect' )
-               ) {
-                       $links = array(
-                               Linker::link( $title,
-                                       $this->msg( 'hist' )->escaped(),
-                                       array(),
-                                       array(
-                                               'action' => 'history',
-                                               'offset' => $this->entry->getTimestamp()
-                                       )
-                               )
-                       );
-                       if ( $this->context->getUser()->isAllowed( 'protect' ) ) {
-                               $links[] = Linker::linkKnown(
-                                       $title,
-                                       $this->msg( 'protect_change' )->escaped(),
-                                       array(),
-                                       array( 'action' => 'protect' )
-                               );
-                       }
-
-                       return $this->msg( 'parentheses' )->rawParams(
-                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
-               }
-
                // Do nothing. The implementation is handled by the hook modifiying the
                // passed-by-ref parameters. This also changes the default value so that
                // getComment() and getActionLinks() do not call them indefinitely.
index 82e5808..2e28917 100644 (file)
@@ -285,30 +285,10 @@ class LogPage {
                                        $rv = wfMessage( $wgLogActions[$key] )->rawParams( $titleLink )
                                                ->inLanguage( $langObj )->escaped();
                                } else {
-                                       $details = '';
                                        array_unshift( $params, $titleLink );
 
-                                       // Page protections
-                                       if ( $type == 'protect' && count( $params ) == 3 ) {
-                                               // Restrictions and expiries
-                                               if ( $skin ) {
-                                                       $details .= $wgLang->getDirMark() . htmlspecialchars( " {$params[1]}" );
-                                               } else {
-                                                       $details .= " {$params[1]}";
-                                               }
-
-                                               // Cascading flag...
-                                               if ( $params[2] ) {
-                                                       $text = wfMessage( 'protect-summary-cascade' )
-                                                               ->inLanguage( $langObj )->text();
-                                                       $details .= ' ';
-                                                       $details .= wfMessage( 'brackets', $text )->inLanguage( $langObj )->text();
-
-                                               }
-                                       }
-
                                        $rv = wfMessage( $wgLogActions[$key] )->rawParams( $params )
-                                                       ->inLanguage( $langObj )->escaped() . $details;
+                                                       ->inLanguage( $langObj )->escaped();
                                }
                        }
                } else {
index 598a45f..3583599 100644 (file)
@@ -218,17 +218,19 @@ class LogPager extends ReverseChronologicalPager {
                        }
                }
 
-               # Using the (log_namespace, log_title, log_timestamp) index with a
-               # range scan (LIKE) on the first two parts, instead of simple equality,
-               # makes it unusable for sorting.  Sorted retrieval using another index
-               # would be possible, but then we might have to scan arbitrarily many
-               # nodes of that index. Therefore, we need to avoid this if $wgMiserMode
-               # is on.
-               #
-               # This is not a problem with simple title matches, because then we can
-               # use the page_time index.  That should have no more than a few hundred
-               # log entries for even the busiest pages, so it can be safely scanned
-               # in full to satisfy an impossible condition on user or similar.
+               /**
+                * Using the (log_namespace, log_title, log_timestamp) index with a
+                * range scan (LIKE) on the first two parts, instead of simple equality,
+                * makes it unusable for sorting.  Sorted retrieval using another index
+                * would be possible, but then we might have to scan arbitrarily many
+                * nodes of that index. Therefore, we need to avoid this if $wgMiserMode
+                * is on.
+                *
+                * This is not a problem with simple title matches, because then we can
+                * use the page_time index.  That should have no more than a few hundred
+                * log entries for even the busiest pages, so it can be safely scanned
+                * in full to satisfy an impossible condition on user or similar.
+                */
                $this->mConds['log_namespace'] = $ns;
                if ( $doUserRightsLogLike ) {
                        $params = array( $name . $wgUserrightsInterwikiDelimiter );
index c870d51..b7068a0 100644 (file)
@@ -59,7 +59,7 @@ class NewUsersLogFormatter extends LogFormatter {
        public function getPreloadTitles() {
                $subtype = $this->entry->getSubtype();
                if ( $subtype === 'create2' || $subtype === 'byemail' ) {
-                       //add the user talk to LinkBatch for the userLink
+                       // add the user talk to LinkBatch for the userLink
                        return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
                }
 
index 5327e07..bd04f15 100644 (file)
@@ -37,11 +37,38 @@ class ProtectLogFormatter extends LogFormatter {
                return array();
        }
 
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->extractParameters();
+               if ( isset( $params[4] ) && $params[4] ) {
+                       // Messages: logentry-protect-protect-cascade, logentry-protect-modify-cascade
+                       $key .= '-cascade';
+               }
+
+               return $key;
+       }
+
        protected function getMessageParameters() {
                $params = parent::getMessageParameters();
 
                $subtype = $this->entry->getSubtype();
-               if ( $subtype === 'move_prot' ) {
+               if ( $subtype === 'protect' || $subtype === 'modify' ) {
+                       $rawParams = $this->entry->getParameters();
+                       if ( isset( $rawParams['details'] ) ) {
+                               $params[3] = $this->createProtectDescription( $rawParams['details'] );
+                       } elseif ( isset( $params[3] ) ) {
+                               // Old way of Restrictions and expiries
+                               $params[3] = $this->context->getLanguage()->getDirMark() . $params[3];
+                       } else {
+                               // Very old way (nothing set)
+                               $params[3] = '';
+                       }
+                       // Cascading flag
+                       if ( isset( $params[4] ) ) {
+                               // handled in getMessageKey
+                               unset( $params[4] );
+                       }
+               } elseif ( $subtype === 'move_prot' ) {
                        $oldname = $this->makePageLink( Title::newFromText( $params[3] ), array( 'redirect' => 'no' ) );
                        $params[3] = Message::rawParam( $oldname );
                }
@@ -49,15 +76,59 @@ class ProtectLogFormatter extends LogFormatter {
                return $params;
        }
 
+       public function getActionLinks() {
+               $subtype = $this->entry->getSubtype();
+               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
+                       || $subtype === 'move_prot' // the move log entry has the right action link
+               ) {
+                       return '';
+               }
+
+               // Show history link for all changes after the protection
+               $title = $this->entry->getTarget();
+               $links = array(
+                       Linker::link( $title,
+                               $this->msg( 'hist' )->escaped(),
+                               array(),
+                               array(
+                                       'action' => 'history',
+                                       'offset' => $this->entry->getTimestamp(),
+                               )
+                       )
+               );
+
+               // Show change protection link
+               if ( $this->context->getUser()->isAllowed( 'protect' ) ) {
+                       $links[] = Linker::linkKnown(
+                               $title,
+                               $this->msg( 'protect_change' )->escaped(),
+                               array(),
+                               array( 'action' => 'protect' )
+                       );
+               }
+
+               return $this->msg( 'parentheses' )->rawParams(
+                       $this->context->getLanguage()->pipeList( $links ) )->escaped();
+       }
+
        protected function getParametersForApi() {
                $entry = $this->entry;
+               $subtype = $this->entry->getSubtype();
                $params = $entry->getParameters();
 
-               static $map = array(
-                       // param keys for move_prot sub type
-                       '4:title:oldtitle',
-                       '4::oldtitle' => '4:title:oldtitle',
-               );
+               $map = array();
+               if ( $subtype === 'protect' || $subtype === 'modify' ) {
+                       $map = array(
+                               '4::description',
+                               '5:bool:cascade',
+                               'details' => ':array:details',
+                       );
+               } elseif ( $subtype === 'move_prot' ) {
+                       $map = array(
+                               '4:title:oldtitle',
+                               '4::oldtitle' => '4:title:oldtitle',
+                       );
+               }
                foreach ( $map as $index => $key ) {
                        if ( isset( $params[$index] ) ) {
                                $params[$key] = $params[$index];
@@ -65,6 +136,78 @@ class ProtectLogFormatter extends LogFormatter {
                        }
                }
 
+               // Change string to explicit boolean
+               if ( isset( $params['5:bool:cascade'] ) && is_string( $params['5:bool:cascade'] ) ) {
+                       $params['5:bool:cascade'] = $params['5:bool:cascade'] === 'cascade';
+               }
+
                return $params;
        }
+
+       public function formatParametersForApi() {
+               global $wgContLang;
+
+               $ret = parent::formatParametersForApi();
+               if ( isset( $ret['details'] ) && is_array( $ret['details'] ) ) {
+                       foreach ( $ret['details'] as &$detail ) {
+                               if ( isset( $detail['expiry'] ) ) {
+                                       $detail['expiry'] = $wgContLang->formatExpiry( $detail['expiry'], TS_ISO_8601, 'infinite' );
+                               }
+                       }
+               }
+
+               return $ret;
+       }
+
+       /**
+        * Create the protect description to show in the log formatter
+        *
+        * @param array $details
+        * @return string
+        */
+       public function createProtectDescription( array $details ) {
+               $protectDescription = '';
+
+               foreach ( $details as $param ) {
+                       $expiryText = $this->formatExpiry( $param['expiry'] );
+
+                       // Messages: restriction-edit, restriction-move, restriction-create,
+                       // restriction-upload
+                       $action = $this->context->msg( 'restriction-' . $param['type'] )->escaped();
+
+                       $protectionLevel = $param['level'];
+                       // Messages: protect-level-autoconfirmed, protect-level-sysop
+                       $message = $this->context->msg( 'protect-level-' . $protectionLevel );
+                       if ( $message->isDisabled() ) {
+                               // Require "$1" permission
+                               $restrictions = $this->context->msg( "protect-fallback", $protectionLevel )->parse();
+                       } else {
+                               $restrictions = $message->escaped();
+                       }
+
+                       if ( $protectDescription !== '' ) {
+                               $protectDescription .= $this->context->msg( 'word-separator' )->escaped();
+                       }
+
+                       $protectDescription .= $this->context->msg( 'protect-summary-desc' )
+                               ->params( $action, $restrictions, $expiryText )->escaped();
+               }
+
+               return $protectDescription;
+       }
+
+       private function formatExpiry( $expiry ) {
+               if ( wfIsInfinity( $expiry ) ) {
+                       return $this->context->msg( 'protect-expiry-indefinite' )->text();
+               }
+               $lang = $this->context->getLanguage();
+               $user = $this->context->getUser();
+               return $this->context->msg(
+                       'protect-expiring-local',
+                       $lang->userTimeAndDate( $expiry, $user ),
+                       $lang->userDate( $expiry, $user ),
+                       $lang->userTime( $expiry, $user )
+               )->text();
+       }
+
 }
index 01b6afa..31dd395 100644 (file)
@@ -148,11 +148,10 @@ class EmailNotification {
                $watchers = self::updateWatchlistTimestamp( $editor, $title, $timestamp );
 
                $sendEmail = true;
+               // $watchers deals with $wgEnotifWatchlist.
                // If nobody is watching the page, and there are no users notified on all changes
                // don't bother creating a job/trying to send emails, unless it's a
                // talk page with an applicable notification.
-               //
-               // $watchers deals with $wgEnotifWatchlist
                if ( !count( $watchers ) && !count( $wgUsersNotifiedOnAllChanges ) ) {
                        $sendEmail = false;
                        // Only send notification for non minor edits, unless $wgEnotifMinorEdits
index 7c5f18d..3c28c5f 100644 (file)
@@ -178,32 +178,34 @@ class UserMailer {
                        return Status::newFatal( 'user-mail-no-addy' );
                }
 
-               // Forge email headers
-               // -------------------
-               //
-               // WARNING
-               //
-               // DO NOT add To: or Subject: headers at this step. They need to be
-               // handled differently depending upon the mailer we are going to use.
-               //
-               // To:
-               //  PHP mail() first argument is the mail receiver. The argument is
-               //  used as a recipient destination and as a To header.
-               //
-               //  PEAR mailer has a recipient argument which is only used to
-               //  send the mail. If no To header is given, PEAR will set it to
-               //  to 'undisclosed-recipients:'.
-               //
-               //  NOTE: To: is for presentation, the actual recipient is specified
-               //  by the mailer using the Rcpt-To: header.
-               //
-               // Subject:
-               //  PHP mail() second argument to pass the subject, passing a Subject
-               //  as an additional header will result in a duplicate header.
-               //
-               //  PEAR mailer should be passed a Subject header.
-               //
-               // -- hashar 20120218
+               /**
+                * Forge email headers
+                * -------------------
+                *
+                * WARNING
+                *
+                * DO NOT add To: or Subject: headers at this step. They need to be
+                * handled differently depending upon the mailer we are going to use.
+                *
+                * To:
+                *  PHP mail() first argument is the mail receiver. The argument is
+                *  used as a recipient destination and as a To header.
+                *
+                *  PEAR mailer has a recipient argument which is only used to
+                *  send the mail. If no To header is given, PEAR will set it to
+                *  to 'undisclosed-recipients:'.
+                *
+                *  NOTE: To: is for presentation, the actual recipient is specified
+                *  by the mailer using the Rcpt-To: header.
+                *
+                * Subject:
+                *  PHP mail() second argument to pass the subject, passing a Subject
+                *  as an additional header will result in a duplicate header.
+                *
+                *  PEAR mailer should be passed a Subject header.
+                *
+                * -- hashar 20120218
+                */
 
                $headers['From'] = $from->toString();
                $returnPath = $from->address;
@@ -326,9 +328,7 @@ class UserMailer {
                        MediaWiki\restoreWarnings();
                        return Status::newGood();
                } else {
-                       //
                        // PHP mail()
-                       //
                        if ( count( $to ) > 1 ) {
                                $headers['To'] = 'undisclosed-recipients:;';
                        }
index 1f00650..692e5a6 100644 (file)
@@ -299,7 +299,6 @@ class BitmapHandler extends TransformationalImageHandler {
         */
        protected function transformGd( $image, $params ) {
                # Use PHP's builtin GD library functions.
-               #
                # First find out what kind of file this is, and select the correct
                # input routine for this.
 
@@ -339,7 +338,9 @@ class BitmapHandler extends TransformationalImageHandler {
 
                $src_image = call_user_func( $loader, $params['srcPath'] );
 
-               $rotation = function_exists( 'imagerotate' ) && !isset( $params['disableRotation'] ) ? $this->getRotation( $image ) : 0;
+               $rotation = function_exists( 'imagerotate' ) && !isset( $params['disableRotation'] ) ?
+                       $this->getRotation( $image ) :
+                       0;
                list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation );
                $dst_image = imagecreatetruecolor( $width, $height );
 
index dac76fa..3b9b7c9 100644 (file)
@@ -410,11 +410,11 @@ EOT;
                                $xml .= Xml::tags(
                                        'OBJECT',
                                        array(
-                                               #'data' => '',
-                                               #'type' => 'image/x.djvu',
+                                               # 'data' => '',
+                                               # 'type' => 'image/x.djvu',
                                                'height' => $m[2],
                                                'width' => $m[1],
-                                               #'usemap' => '',
+                                               # 'usemap' => '',
                                        ),
                                        "\n" .
                                                Xml::element( 'PARAM', array( 'name' => 'DPI', 'value' => $m[3] ) ) . "\n" .
index b4cc43e..052c39d 100644 (file)
@@ -390,8 +390,8 @@ class Exif {
                $this->charCodeString( 'GPSProcessingMethod' );
                $this->charCodeString( 'GPSAreaInformation' );
 
-               //ComponentsConfiguration should really be an array instead of a string...
-               //This turns a string of binary numbers into an array of numbers.
+               // ComponentsConfiguration should really be an array instead of a string...
+               // This turns a string of binary numbers into an array of numbers.
 
                if ( isset( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
                        $val = $this->mFilteredExifData['ComponentsConfiguration'];
@@ -401,16 +401,16 @@ class Exif {
                        for ( $i = 0; $i < $strLen; $i++ ) {
                                $ccVals[$i] = ord( substr( $val, $i, 1 ) );
                        }
-                       $ccVals['_type'] = 'ol'; //this is for formatting later.
+                       $ccVals['_type'] = 'ol'; // this is for formatting later.
                        $this->mFilteredExifData['ComponentsConfiguration'] = $ccVals;
                }
 
-               //GPSVersion(ID) is treated as the wrong type by php exif support.
-               //Go through each byte turning it into a version string.
-               //For example: "\x02\x02\x00\x00" -> "2.2.0.0"
+               // GPSVersion(ID) is treated as the wrong type by php exif support.
+               // Go through each byte turning it into a version string.
+               // For example: "\x02\x02\x00\x00" -> "2.2.0.0"
 
-               //Also change exif tag name from GPSVersion (what php exif thinks it is)
-               //to GPSVersionID (what the exif standard thinks it is).
+               // Also change exif tag name from GPSVersion (what php exif thinks it is)
+               // to GPSVersionID (what the exif standard thinks it is).
 
                if ( isset( $this->mFilteredExifData['GPSVersion'] ) ) {
                        $val = $this->mFilteredExifData['GPSVersion'];
@@ -448,7 +448,7 @@ class Exif {
                if ( isset( $this->mFilteredExifData[$prop] ) ) {
 
                        if ( strlen( $this->mFilteredExifData[$prop] ) <= 8 ) {
-                               //invalid. Must be at least 9 bytes long.
+                               // invalid. Must be at least 9 bytes long.
 
                                $this->debug( $this->mFilteredExifData[$prop], __FUNCTION__, false );
                                unset( $this->mFilteredExifData[$prop] );
@@ -460,13 +460,13 @@ class Exif {
 
                        switch ( $charCode ) {
                                case "\x4A\x49\x53\x00\x00\x00\x00\x00":
-                                       //JIS
+                                       // JIS
                                        $charset = "Shift-JIS";
                                        break;
                                case "UNICODE\x00":
                                        $charset = "UTF-16" . $this->byteOrder;
                                        break;
-                               default: //ascii or undefined.
+                               default: // ascii or undefined.
                                        $charset = "";
                                        break;
                        }
@@ -477,7 +477,7 @@ class Exif {
                        } else {
                                // if valid utf-8, assume that, otherwise assume windows-1252
                                $valCopy = $val;
-                               UtfNormal\Validator::quickIsNFCVerify( $valCopy ); //validates $valCopy.
+                               UtfNormal\Validator::quickIsNFCVerify( $valCopy ); // validates $valCopy.
                                if ( $valCopy !== $val ) {
                                        MediaWiki\suppressWarnings();
                                        $val = iconv( 'Windows-1252', 'UTF-8//IGNORE', $val );
@@ -485,17 +485,17 @@ class Exif {
                                }
                        }
 
-                       //trim and check to make sure not only whitespace.
+                       // trim and check to make sure not only whitespace.
                        $val = trim( $val );
                        if ( strlen( $val ) === 0 ) {
-                               //only whitespace.
+                               // only whitespace.
                                $this->debug( $this->mFilteredExifData[$prop], __FUNCTION__, "$prop: Is only whitespace" );
                                unset( $this->mFilteredExifData[$prop] );
 
                                return;
                        }
 
-                       //all's good.
+                       // all's good.
                        $this->mFilteredExifData[$prop] = $val;
                }
        }
index 5ba5c68..3537cc6 100644 (file)
@@ -110,7 +110,7 @@ class ExifBitmapHandler extends BitmapHandler {
                        if ( isset( $exif['MEDIAWIKI_EXIF_VERSION'] )
                                && $exif['MEDIAWIKI_EXIF_VERSION'] == 1
                        ) {
-                               //back-compatible but old
+                               // back-compatible but old
                                wfDebug( __METHOD__ . ": back-compat version\n" );
 
                                return self::METADATA_COMPATIBLE;
@@ -269,9 +269,11 @@ class ExifBitmapHandler extends BitmapHandler {
        }
 
        /**
-        * Swaps an embedded ICC profile for another, if found. Depends on exiftool, no-op if not installed.
+        * Swaps an embedded ICC profile for another, if found.
+        * Depends on exiftool, no-op if not installed.
         * @param string $filepath File to be manipulated (will be overwritten)
-        * @param string $oldProfileString Exact name of color profile to look for (the one that will be replaced)
+        * @param string $oldProfileString Exact name of color profile to look for
+        *  (the one that will be replaced)
         * @param string $profileFilepath ICC profile file to apply to the file
         * @since 1.26
         * @return bool
index 0fee8cc..a1cb01c 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+// @codingStandardsIgnoreFile
+// PHPCS can't handle the level of nesting in this file
 /**
  * Formatting of image metadata values into human readable form.
  *
@@ -117,9 +119,9 @@ class FormatMetadata extends ContextSource {
                                $type = 'ul'; // default unordered list.
                        }
 
-                       //This is done differently as the tag is an array.
+                       // This is done differently as the tag is an array.
                        if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3 ) {
-                               //hour min sec array
+                               // hour min sec array
 
                                $h = explode( '/', $vals[0] );
                                $m = explode( '/', $vals[1] );
@@ -413,7 +415,7 @@ class FormatMetadata extends ContextSource {
                                                        'mode' => ( $val & bindec( '00011000' ) ) >> 3,
                                                        'function' => ( $val & bindec( '00100000' ) ) >> 5,
                                                        'redeye' => ( $val & bindec( '01000000' ) ) >> 6,
-//                                             'reserved' => ($val & bindec( '10000000' )) >> 7,
+//                                             'reserved' => ($val & bindec( '10000000' )) >> 7,
                                                );
                                                $flashMsgs = array();
                                                # We do not need to handle unknown values since all are used.
@@ -597,7 +599,7 @@ class FormatMetadata extends ContextSource {
                                                }
                                                break;
 
-                                       //The GPS...Ref values are kept for compatibility, probably won't be reached.
+                                       // The GPS...Ref values are kept for compatibility, probably won't be reached.
                                        case 'GPSLatitudeRef':
                                        case 'GPSDestLatitudeRef':
                                                switch ( $val ) {
@@ -730,7 +732,7 @@ class FormatMetadata extends ContextSource {
 
                                        case 'Software':
                                                if ( is_array( $val ) ) {
-                                                       //if its a software, version array.
+                                                       // if its a software, version array.
                                                        $val = $this->msg( 'exif-software-version-value', $val[0], $val[1] )->text();
                                                } else {
                                                        $val = $this->exifMsg( $tag, '', $val );
@@ -1169,7 +1171,7 @@ class FormatMetadata extends ContextSource {
                $lowLang = strtolower( $lang );
                $langName = Language::fetchLanguageName( $lowLang );
                if ( $langName === '' ) {
-                       //try just the base language name. (aka en-US -> en ).
+                       // try just the base language name. (aka en-US -> en ).
                        list( $langPrefix ) = explode( '-', $lowLang, 2 );
                        $langName = Language::fetchLanguageName( $langPrefix );
                        if ( $langName === '' ) {
index 94aca61..b998d18 100644 (file)
@@ -187,4 +187,25 @@ class GIFHandler extends BitmapHandler {
 
                return $wgLang->commaList( $info );
        }
+
+       /**
+        * Return the duration of the GIF file.
+        *
+        * Shown in the &query=imageinfo&iiprop=size api query.
+        *
+        * @param $file File
+        * @return float The duration of the file.
+        */
+       public function getLength( $file ) {
+               $serMeta = $file->getMetadata();
+               MediaWiki\suppressWarnings();
+               $metadata = unserialize( $serMeta );
+               MediaWiki\restoreWarnings();
+
+               if ( !$metadata || !isset( $metadata['duration'] ) || !$metadata['duration'] ) {
+                       return 0.0;
+               } else {
+                       return (float)$metadata['duration'];
+               }
+       }
 }
index 6ee23cd..f5772de 100644 (file)
@@ -102,14 +102,14 @@ class GIFMetadataExtractor {
                                // Found a frame
                                $frameCount++;
 
-                               ## Skip bounding box
+                               # # Skip bounding box
                                fread( $fh, 8 );
 
-                               ## Read BPP
+                               # # Read BPP
                                $buf = fread( $fh, 1 );
                                $bpp = self::decodeBPP( $buf );
 
-                               ## Read GCT
+                               # # Read GCT
                                self::readGCT( $fh, $bpp );
                                fread( $fh, 1 );
                                self::skipBlock( $fh );
index c3d58b8..98fbde3 100644 (file)
@@ -45,13 +45,13 @@ class IPTC {
                }
 
                $c = '';
-               //charset info contained in tag 1:90.
+               // charset info contained in tag 1:90.
                if ( isset( $parsed['1#090'] ) && isset( $parsed['1#090'][0] ) ) {
                        $c = self::getCharset( $parsed['1#090'][0] );
                        if ( $c === false ) {
-                               //Unknown charset. refuse to parse.
-                               //note: There is a different between
-                               //unknown and no charset specified.
+                               // Unknown charset. refuse to parse.
+                               // note: There is a different between
+                               // unknown and no charset specified.
                                return array();
                        }
                        unset( $parsed['1#090'] );
@@ -165,15 +165,15 @@ class IPTC {
                                        $software = self::convIPTC( $val, $c );
 
                                        if ( count( $software ) !== 1 ) {
-                                               //according to iim standard this cannot have multiple values
-                                               //so if there is more than one, something weird is happening,
-                                               //and we skip it.
+                                               // according to iim standard this cannot have multiple values
+                                               // so if there is more than one, something weird is happening,
+                                               // and we skip it.
                                                wfDebugLog( 'iptc', 'IPTC: Wrong count on 2:65 Software field' );
                                                break;
                                        }
 
                                        if ( isset( $parsed['2#070'] ) ) {
-                                               //if a version is set for the software.
+                                               // if a version is set for the software.
                                                $softwareVersion = self::convIPTC( $parsed['2#070'], $c );
                                                unset( $parsed['2#070'] );
                                                $data['Software'] = array( array( $software[0], $softwareVersion[0] ) );
@@ -220,8 +220,8 @@ class IPTC {
                                // according to spec.
                                // Should potentially store timezone as well.
                                case '2#055':
-                                       //Date created (not date digitized).
-                                       //Maps to exif DateTimeOriginal
+                                       // Date created (not date digitized).
+                                       // Maps to exif DateTimeOriginal
                                        if ( isset( $parsed['2#060'] ) ) {
                                                $time = $parsed['2#060'];
                                        } else {
@@ -234,8 +234,8 @@ class IPTC {
                                        break;
 
                                case '2#062':
-                                       //Date converted to digital representation.
-                                       //Maps to exif DateTimeDigitized
+                                       // Date converted to digital representation.
+                                       // Maps to exif DateTimeDigitized
                                        if ( isset( $parsed['2#063'] ) ) {
                                                $time = $parsed['2#063'];
                                        } else {
@@ -248,7 +248,7 @@ class IPTC {
                                        break;
 
                                case '2#030':
-                                       //Date released.
+                                       // Date released.
                                        if ( isset( $parsed['2#035'] ) ) {
                                                $time = $parsed['2#035'];
                                        } else {
@@ -261,7 +261,7 @@ class IPTC {
                                        break;
 
                                case '2#037':
-                                       //Date expires.
+                                       // Date expires.
                                        if ( isset( $parsed['2#038'] ) ) {
                                                $time = $parsed['2#038'];
                                        } else {
@@ -275,10 +275,10 @@ class IPTC {
 
                                case '2#000': /* iim version */
                                        // unlike other tags, this is a 2-byte binary number.
-                                       //technically this is required if there is iptc data
-                                       //but in practise it isn't always there.
+                                       // technically this is required if there is iptc data
+                                       // but in practise it isn't always there.
                                        if ( strlen( $val[0] ) == 2 ) {
-                                               //if is just to be paranoid.
+                                               // if is just to be paranoid.
                                                $versionValue = ord( substr( $val[0], 0, 1 ) ) * 256;
                                                $versionValue += ord( substr( $val[0], 1, 1 ) );
                                                $data['iimVersion'] = $versionValue;
@@ -335,7 +335,7 @@ class IPTC {
                                case '2#085':
                                case '2#038':
                                case '2#035':
-                                       //ignore. Handled elsewhere.
+                                       // ignore. Handled elsewhere.
                                        break;
 
                                default:
@@ -358,8 +358,8 @@ class IPTC {
         */
        private static function timeHelper( $date, $time, $c ) {
                if ( count( $date ) === 1 ) {
-                       //the standard says this should always be 1
-                       //just double checking.
+                       // the standard says this should always be 1
+                       // just double checking.
                        list( $date ) = self::convIPTC( $date, $c );
                } else {
                        return null;
@@ -369,7 +369,7 @@ class IPTC {
                        list( $time ) = self::convIPTC( $time, $c );
                        $dateOnly = false;
                } else {
-                       $time = '000000+0000'; //placeholder
+                       $time = '000000+0000'; // placeholder
                        $dateOnly = true;
                }
 
@@ -379,7 +379,7 @@ class IPTC {
                        && substr( $date, 4, 2 ) !== '00'
                        && substr( $date, 6, 2 ) !== '00'
                ) ) {
-                       //something wrong.
+                       // something wrong.
                        // Note, this rejects some valid dates according to iptc spec
                        // for example: the date 00000400 means the photo was taken in
                        // April, but the year and day is unknown. We don't process these
@@ -410,7 +410,7 @@ class IPTC {
                        return null;
                }
                if ( $dateOnly ) {
-                       //return the date only
+                       // return the date only
                        return substr( $finalTimestamp, 0, 10 );
                } else {
                        return $finalTimestamp;
@@ -453,12 +453,12 @@ class IPTC {
                                wfDebugLog( 'iptc', __METHOD__ . " Error converting iptc data charset $charset to utf-8" );
                        }
                } else {
-                       //treat as utf-8 if is valid utf-8. otherwise pretend its windows-1252
+                       // treat as utf-8 if is valid utf-8. otherwise pretend its windows-1252
                        // most of the time if there is no 1:90 tag, it is either ascii, latin1, or utf-8
                        $oldData = $data;
-                       UtfNormal\Validator::quickIsNFCVerify( $data ); //make $data valid utf-8
+                       UtfNormal\Validator::quickIsNFCVerify( $data ); // make $data valid utf-8
                        if ( $data === $oldData ) {
-                               return $data; //if validation didn't change $data
+                               return $data; // if validation didn't change $data
                        } else {
                                return self::convIPTCHelper( $oldData, 'Windows-1252' );
                        }
@@ -477,39 +477,39 @@ class IPTC {
         */
        static function getCharset( $tag ) {
 
-               //According to iim standard, charset is defined by the tag 1:90.
-               //in which there are iso 2022 escape sequences to specify the character set.
-               //the iim standard seems to encourage that all necessary escape sequences are
-               //in the 1:90 tag, but says it doesn't have to be.
+               // According to iim standard, charset is defined by the tag 1:90.
+               // in which there are iso 2022 escape sequences to specify the character set.
+               // the iim standard seems to encourage that all necessary escape sequences are
+               // in the 1:90 tag, but says it doesn't have to be.
 
-               //This is in need of more testing probably. This is definitely not complete.
-               //however reading the docs of some other iptc software, it appears that most iptc software
-               //only recognizes utf-8. If 1:90 tag is not present content is
+               // This is in need of more testing probably. This is definitely not complete.
+               // however reading the docs of some other iptc software, it appears that most iptc software
+               // only recognizes utf-8. If 1:90 tag is not present content is
                // usually ascii or iso-8859-1 (and sometimes utf-8), but no guarantee.
 
-               //This also won't work if there are more than one escape sequence in the 1:90 tag
-               //or if something is put in the G2, or G3 charsets, etc. It will only reliably recognize utf-8.
+               // This also won't work if there are more than one escape sequence in the 1:90 tag
+               // or if something is put in the G2, or G3 charsets, etc. It will only reliably recognize utf-8.
 
                // This is just going through the charsets mentioned in appendix C of the iim standard.
 
                //  \x1b = ESC.
                switch ( $tag ) {
-                       case "\x1b%G": //utf-8
-                       //Also call things that are compatible with utf-8, utf-8 (e.g. ascii)
+                       case "\x1b%G": // utf-8
+                       // Also call things that are compatible with utf-8, utf-8 (e.g. ascii)
                        case "\x1b(B": // ascii
                        case "\x1b(@": // iso-646-IRV (ascii in latest version, $ different in older version)
                                $c = 'UTF-8';
                                break;
-                       case "\x1b(A": //like ascii, but british.
+                       case "\x1b(A": // like ascii, but british.
                                $c = 'ISO646-GB';
                                break;
-                       case "\x1b(C": //some obscure sweedish/finland encoding
+                       case "\x1b(C": // some obscure sweedish/finland encoding
                                $c = 'ISO-IR-8-1';
                                break;
                        case "\x1b(D":
                                $c = 'ISO-IR-8-2';
                                break;
-                       case "\x1b(E": //some obscure danish/norway encoding
+                       case "\x1b(E": // some obscure danish/norway encoding
                                $c = 'ISO-IR-9-1';
                                break;
                        case "\x1b(F":
@@ -533,22 +533,22 @@ class IPTC {
                        case "\x1b(K":
                                $c = "ISO646-DE";
                                break;
-                       case "\x1b(N": //crylic
+                       case "\x1b(N": // crylic
                                $c = "ISO_5427";
                                break;
-                       case "\x1b(`": //iso646-NO
+                       case "\x1b(`": // iso646-NO
                                $c = "NS_4551-1";
                                break;
-                       case "\x1b(f": //iso646-FR
+                       case "\x1b(f": // iso646-FR
                                $c = "NF_Z_62-010";
                                break;
                        case "\x1b(g":
-                               $c = "PT2"; //iso646-PT2
+                               $c = "PT2"; // iso646-PT2
                                break;
                        case "\x1b(h":
                                $c = "ES2";
                                break;
-                       case "\x1b(i": //iso646-HU
+                       case "\x1b(i": // iso646-HU
                                $c = "MSZ_7795.3";
                                break;
                        case "\x1b(w":
@@ -594,7 +594,7 @@ class IPTC {
                                break;
                        default:
                                wfDebugLog( 'iptc', __METHOD__ . 'Unknown charset in iptc 1:90: ' . bin2hex( $tag ) );
-                               //at this point just give up and refuse to parse iptc?
+                               // at this point just give up and refuse to parse iptc?
                                $c = false;
                }
                return $c;
index db74bb3..c2870c2 100644 (file)
@@ -61,7 +61,7 @@ abstract class ImageHandler extends MediaHandler {
                }
 
                # Removed for ProofreadPage
-               #$width = intval( $width );
+               # $width = intval( $width );
                return "{$width}px";
        }
 
index 3a59996..015eb5a 100644 (file)
@@ -180,7 +180,7 @@ abstract class MediaHandler {
        function convertMetadataVersion( $metadata, $version = 1 ) {
                if ( !is_array( $metadata ) ) {
 
-                       //unserialize to keep return parameter consistent.
+                       // unserialize to keep return parameter consistent.
                        MediaWiki\suppressWarnings();
                        $ret = unserialize( $metadata );
                        MediaWiki\restoreWarnings();
@@ -866,14 +866,21 @@ abstract class MediaHandler {
         * Gets configuration for the file warning message. Return value of
         * the following structure:
         *   array(
-        *     'module' => 'example.filewarning.messages', // Required, module with messages loaded for the client
-        *     'messages' => array( // Required, array of names of messages
-        *       'main' => 'example-filewarning-main', // Required, main warning message
-        *       'header' => 'example-filewarning-header', // Optional, header for warning dialog
-        *       'footer' => 'example-filewarning-footer', // Optional, footer for warning dialog
-        *       'info' => 'example-filewarning-info', // Optional, text for more-information link (see below)
+        *     // Required, module with messages loaded for the client
+        *     'module' => 'example.filewarning.messages',
+        *     // Required, array of names of messages
+        *     'messages' => array(
+        *       // Required, main warning message
+        *       'main' => 'example-filewarning-main',
+        *       // Optional, header for warning dialog
+        *       'header' => 'example-filewarning-header',
+        *       // Optional, footer for warning dialog
+        *       'footer' => 'example-filewarning-footer',
+        *       // Optional, text for more-information link (see below)
+        *       'info' => 'example-filewarning-info',
         *     ),
-        *     'link' => 'http://example.com', // Optional, link for more information
+        *     // Optional, link for more information
+        *     'link' => 'http://example.com',
         *   )
         *
         * Returns null if no warning is necessary.
index c3f0832..e297fe1 100644 (file)
@@ -175,9 +175,29 @@ class PNGHandler extends BitmapHandler {
                return $wgLang->commaList( $info );
        }
 
+       /**
+        * Return the duration of an APNG file.
+        *
+        * Shown in the &query=imageinfo&iiprop=size api query.
+        *
+        * @param $file File
+        * @return float The duration of the file.
+        */
+       public function getLength( $file ) {
+               $serMeta = $file->getMetadata();
+               MediaWiki\suppressWarnings();
+               $metadata = unserialize( $serMeta );
+               MediaWiki\restoreWarnings();
+
+               if ( !$metadata || !isset( $metadata['duration'] ) || !$metadata['duration'] ) {
+                       return 0.0;
+               } else {
+                       return (float)$metadata['duration'];
+               }
+       }
+
        // PNGs should be easy to support, but it will need some sharpening applied
        // and another user test to check if the perceived quality change is noticeable
-
        public function supportsBucketing() {
                return false;
        }
index ff4dcee..f894618 100644 (file)
@@ -102,7 +102,7 @@ class WebPHandler extends BitmapHandler {
 
                if ( $info['fourCC'] != 'WEBP' ) {
                        wfDebugLog( 'WebP', __METHOD__ . ': FourCC was not WEBP: ' .
-                               bin2hex( $info['fourCC'] ) .  " \n" );
+                               bin2hex( $info['fourCC'] ) . " \n" );
                        return false;
                }
 
@@ -187,7 +187,7 @@ class WebPHandler extends BitmapHandler {
                // Bytes 4-7 are chunk stream size
                // Byte 8 is 0x2F called the signature
                if ( $header{8} != "\x2F" ) {
-                       wfDebugLog( 'WebP',  __METHOD__ . ': Invalid signature: ' .
+                       wfDebugLog( 'WebP', __METHOD__ . ': Invalid signature: ' .
                                bin2hex( $header{8} ) . "\n" );
                        return array();
                }
index 16e11dc..41e1d54 100644 (file)
@@ -106,21 +106,23 @@ class XCFHandler extends BitmapHandler {
                $binaryHeader = fread( $f, 26 );
                fclose( $f );
 
-               # Master image structure:
-               #
-               # byte[9] "gimp xcf "  File type magic
-               # byte[4] version      XCF version
-               #                        "file" - version 0
-               #                        "v001" - version 1
-               #                        "v002" - version 2
-               # byte    0            Zero-terminator for version tag
-               # uint32  width        With of canvas
-               # uint32  height       Height of canvas
-               # uint32  base_type    Color mode of the image; one of
-               #                         0: RGB color
-               #                         1: Grayscale
-               #                         2: Indexed color
-               #        (enum GimpImageBaseType in libgimpbase/gimpbaseenums.h)
+               /**
+                * Master image structure:
+                *
+                * byte[9] "gimp xcf "  File type magic
+                * byte[4] version      XCF version
+                *                        "file" - version 0
+                *                        "v001" - version 1
+                *                        "v002" - version 2
+                * byte    0            Zero-terminator for version tag
+                * uint32  width        With of canvas
+                * uint32  height       Height of canvas
+                * uint32  base_type    Color mode of the image; one of
+                *                         0: RGB color
+                *                         1: Grayscale
+                *                         2: Indexed color
+                *        (enum GimpImageBaseType in libgimpbase/gimpbaseenums.h)
+                */
                try {
                        $header = wfUnpack(
                                "A9magic" . # A: space padded
index 64a7e8a..6d19700 100644 (file)
@@ -329,7 +329,7 @@ class XMPReader implements LoggerAwareInterface {
                                                        $this->charset = 'UTF-8';
                                                        break;
                                                default:
-                                                       //this should be impossible to get to
+                                                       // this should be impossible to get to
                                                        throw new RuntimeException( "Invalid BOM" );
                                        }
                                } else {
@@ -338,7 +338,7 @@ class XMPReader implements LoggerAwareInterface {
                                }
                        }
                        if ( $this->charset !== 'UTF-8' ) {
-                               //don't convert if already utf-8
+                               // don't convert if already utf-8
                                MediaWiki\suppressWarnings();
                                $content = iconv( $this->charset, 'UTF-8//IGNORE', $content );
                                MediaWiki\restoreWarnings();
@@ -429,8 +429,14 @@ class XMPReader implements LoggerAwareInterface {
                }
                $len = unpack( 'Nlength/Noffset', substr( $content, 32, 8 ) );
 
-               if ( !$len || $len['length'] < 4 || $len['offset'] < 0 || $len['offset'] > $len['length'] ) {
-                       $this->logger->info( __METHOD__ . 'Error reading extended XMP block, invalid length or offset.' );
+               if ( !$len ||
+                       $len['length'] < 4 ||
+                       $len['offset'] < 0 ||
+                       $len['offset'] > $len['length']
+               ) {
+                       $this->logger->info(
+                               __METHOD__ . 'Error reading extended XMP block, invalid length or offset.'
+                       );
 
                        return false;
                }
@@ -441,9 +447,8 @@ class XMPReader implements LoggerAwareInterface {
                // immediately following the StandardXMP. However, the JPEG standard
                // does not require preservation of marker segment order. A robust JPEG
                // reader should tolerate the marker segments in any order."
-               //
-               // otoh the probability that an image will have more than 128k of
-               // metadata is rather low... so the probability that it will have
+               // On the other hand, the probability that an image will have more than
+               // 128k of metadata is rather low... so the probability that it will have
                // > 128k, and be in the wrong order is very low...
 
                if ( $len['offset'] !== $this->extendedXMPOffset ) {
@@ -710,7 +715,6 @@ class XMPReader implements LoggerAwareInterface {
         * @throws RuntimeException
         */
        private function endElementModeLi( $elm ) {
-
                list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
                $info = $this->items[$ns][$tag];
                $finalName = isset( $info['map_name'] )
@@ -734,7 +738,9 @@ class XMPReader implements LoggerAwareInterface {
                                $this->results['xmp-' . $info['map_group']][$finalName]['_type'] = 'lang';
                        }
                } else {
-                       throw new RuntimeException( __METHOD__ . " expected </rdf:seq> or </rdf:bag> but instead got $elm." );
+                       throw new RuntimeException(
+                               __METHOD__ . " expected </rdf:seq> or </rdf:bag> but instead got $elm."
+                       );
                }
        }
 
@@ -1206,8 +1212,7 @@ class XMPReader implements LoggerAwareInterface {
                        // In practise I have yet to see a file that
                        // uses this element, however it is mentioned
                        // on page 25 of part 1 of the xmp standard.
-                       //
-                       // also it seems as if exiv2 and exiftool do not support
+                       // Also it seems as if exiv2 and exiftool do not support
                        // this either (That or I misunderstand the standard)
                        $this->logger->info( __METHOD__ . ' Encountered <rdf:type> which isn\'t currently supported' );
                }
@@ -1264,6 +1269,7 @@ class XMPReader implements LoggerAwareInterface {
                }
        }
 
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * Process attributes.
         * Simple values can be stored as either a tag or attribute
@@ -1271,16 +1277,15 @@ class XMPReader implements LoggerAwareInterface {
         * Often the initial "<rdf:Description>" tag just has all the simple
         * properties as attributes.
         *
-        * @codingStandardsIgnoreStart Long line that cannot be broken
         * @par Example:
         * @code
         * <rdf:Description rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/" exif:DigitalZoomRatio="0/10">
         * @endcode
-        * @codingStandardsIgnoreEnd
         *
         * @param array $attribs Array attribute=>value
         * @throws RuntimeException
         */
+       // @codingStandardsIgnoreEnd
        private function doAttribs( $attribs ) {
                // first check for rdf:parseType attribute, as that can change
                // how the attributes are interperted.
index 1d8d777..6fc2343 100644 (file)
@@ -705,7 +705,7 @@ class XMPInfo {
                        ),
                        'creator' => array(
                                'map_group' => 'general',
-                               'map_name' => 'Artist', //map with exif Artist, iptc byline (2:80)
+                               'map_name' => 'Artist', // map with exif Artist, iptc byline (2:80)
                                'mode' => XMPReader::MODE_SEQ,
                        ),
                        'date' => array(
@@ -872,7 +872,7 @@ class XMPInfo {
                                'mode' => XMPReader::MODE_SIMPLE,
                        ),
                ),
-               //Note, this property affects how jpeg metadata is extracted.
+               // Note, this property affects how jpeg metadata is extracted.
                'http://ns.adobe.com/xmp/note/' => array(
                        'HasExtendedXMP' => array(
                                'map_group' => 'special',
index 55e8ce7..519c420 100644 (file)
@@ -167,7 +167,7 @@ class XMPValidate implements LoggerAwareInterface {
                        return;
                }
 
-               //check if its in a numeric range
+               // check if its in a numeric range
                $inRange = false;
                if ( isset( $info['rangeLow'] )
                        && isset( $info['rangeHigh'] )
@@ -231,7 +231,7 @@ class XMPValidate implements LoggerAwareInterface {
                        return;
                }
                if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val ) ) {
-                       //this is a rather naive check.
+                       // this is a rather naive check.
                        $this->logger->info( __METHOD__ . " Expected Lang code but got $val" );
                        $val = null;
                }
@@ -292,8 +292,8 @@ class XMPValidate implements LoggerAwareInterface {
                                return;
                        }
 
-                       if ( !isset( $res[4] ) ) { //hour
-                               //just have the year month day (if that)
+                       if ( !isset( $res[4] ) ) { // hour
+                               // just have the year month day (if that)
                                $val = $res[1];
                                if ( isset( $res[2] ) ) {
                                        $val .= ':' . $res[2];
@@ -306,7 +306,7 @@ class XMPValidate implements LoggerAwareInterface {
                        }
 
                        if ( !isset( $res[7] ) || $res[7] === 'Z' ) {
-                               //if hour is set, then minute must also be or regex above will fail.
+                               // if hour is set, then minute must also be or regex above will fail.
                                $val = $res[1] . ':' . $res[2] . ':' . $res[3]
                                        . ' ' . $res[4] . ':' . $res[5];
                                if ( isset( $res[6] ) && $res[6] !== '' ) {
index e545aa5..7d12749 100644 (file)
@@ -168,7 +168,10 @@ class MemcachedBagOStuff extends BagOStuff {
         * @return string
         */
        public function decodeKey( $key ) {
-               return urldecode( $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 );
        }
 
        /**
index 1a52930..b690772 100644 (file)
@@ -34,6 +34,11 @@ class MultiWriteBagOStuff extends BagOStuff {
        /** @var bool Use async secondary writes */
        protected $asyncWrites = false;
 
+       /** 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:      This should have a numbered array of cache parameter
@@ -60,7 +65,9 @@ class MultiWriteBagOStuff extends BagOStuff {
                parent::__construct( $params );
 
                if ( empty( $params['caches'] ) || !is_array( $params['caches'] ) ) {
-                       throw new InvalidArgumentException( __METHOD__ . ': "caches" parameter must be an array of caches' );
+                       throw new InvalidArgumentException(
+                               __METHOD__ . ': "caches" parameter must be an array of caches'
+                       );
                }
 
                $this->caches = array();
@@ -77,17 +84,28 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @param bool $debug
         */
        public function setDebug( $debug ) {
-               $this->doWrite( 'setDebug', $debug );
+               $this->doWrite( self::ALL, 'setDebug', $debug );
        }
 
        public function get( $key, &$casToken = null, $flags = 0 ) {
+               $misses = 0; // number backends checked
+               $value = false;
                foreach ( $this->caches as $cache ) {
                        $value = $cache->get( $key, $casToken, $flags );
                        if ( $value !== false ) {
-                               return $value;
+                               break;
                        }
+                       ++$misses;
+               }
+
+               if ( $value !== false
+                       && $misses > 0
+                       && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
+               ) {
+                       $this->doWrite( $misses, 'set', $key, $value, self::UPGRADE_TTL );
                }
-               return false;
+
+               return $value;
        }
 
        /**
@@ -97,7 +115,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         */
        public function set( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( 'set', $key, $value, $exptime );
+               return $this->doWrite( self::ALL, 'set', $key, $value, $exptime );
        }
 
        /**
@@ -105,7 +123,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         */
        public function delete( $key ) {
-               return $this->doWrite( 'delete', $key );
+               return $this->doWrite( self::ALL, 'delete', $key );
        }
 
        /**
@@ -115,7 +133,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         */
        public function add( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( 'add', $key, $value, $exptime );
+               return $this->doWrite( self::ALL, 'add', $key, $value, $exptime );
        }
 
        /**
@@ -124,7 +142,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool|null
         */
        public function incr( $key, $value = 1 ) {
-               return $this->doWrite( 'incr', $key, $value );
+               return $this->doWrite( self::ALL, 'incr', $key, $value );
        }
 
        /**
@@ -133,7 +151,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         */
        public function decr( $key, $value = 1 ) {
-               return $this->doWrite( 'decr', $key, $value );
+               return $this->doWrite( self::ALL, 'decr', $key, $value );
        }
 
        /**
@@ -164,7 +182,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool Success
         */
        public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               return $this->doWrite( 'merge', $key, $callback, $exptime );
+               return $this->doWrite( self::ALL, 'merge', $key, $callback, $exptime );
        }
 
        public function getLastError() {
@@ -176,15 +194,22 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
+        * Apply a write method to the first $count backing caches
+        *
+        * @param integer $count
         * @param string $method
+        * @param mixed ...
         * @return bool
         */
-       protected function doWrite( $method /*, ... */ ) {
+       protected function doWrite( $count, $method /*, ... */ ) {
                $ret = true;
-               $args = func_get_args();
-               array_shift( $args );
+               $args = array_slice( func_get_args(), 2 );
 
                foreach ( $this->caches as $i => $cache ) {
+                       if ( $i >= $count ) {
+                               break; // ignore the lower tiers
+                       }
+
                        if ( $i == 0 || !$this->asyncWrites ) {
                                // First store or in sync mode: write now and get result
                                if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
index 6019105..70e97ff 100644 (file)
@@ -185,14 +185,26 @@ class ObjectCache {
         * This will look for any APC style server-local cache.
         * A fallback cache can be specified if none is found.
         *
-        * @param array $params [optional]
+        *     // Direct calls
+        *     ObjectCache::newAccelerator( $fallbackType );
+        *
+        *     // From $wgObjectCaches via newFromParams()
+        *     ObjectCache::newAccelerator( 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)
         * @return BagOStuff
         * @throws MWException
         */
        public static function newAccelerator( $params = array(), $fallback = null ) {
-               if ( !is_array( $params ) && $fallback === null ) {
-                       $fallback = $params;
+               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;
+                       }
                }
                if ( function_exists( 'apc_fetch' ) ) {
                        $id = 'apc';
index a9af9b1..7d9903f 100644 (file)
  * @file
  */
 
+/**
+ * Redis-based caching module for redis server >= 2.6.12
+ *
+ * @note: avoid use of Redis::MULTI transactions for twemproxy support
+ */
 class RedisBagOStuff extends BagOStuff {
        /** @var RedisConnectionPool */
        protected $redisPool;
@@ -81,7 +86,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function get( $key, &$casToken = null, $flags = 0 ) {
-
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
@@ -100,7 +104,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function set( $key, $value, $expiry = 0 ) {
-
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
@@ -122,41 +125,7 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       protected function cas( $casToken, $key, $value, $expiry = 0 ) {
-
-               list( $server, $conn ) = $this->getConnection( $key );
-               if ( !$conn ) {
-                       return false;
-               }
-               $expiry = $this->convertToRelative( $expiry );
-               try {
-                       $conn->watch( $key );
-
-                       if ( $this->serialize( $this->get( $key ) ) !== $casToken ) {
-                               $conn->unwatch();
-                               return false;
-                       }
-
-                       // multi()/exec() will fail atomically if the key changed since watch()
-                       $conn->multi();
-                       if ( $expiry ) {
-                               $conn->setex( $key, $expiry, $this->serialize( $value ) );
-                       } else {
-                               // No expiry, that is very different from zero expiry in Redis
-                               $conn->set( $key, $this->serialize( $value ) );
-                       }
-                       $result = ( $conn->exec() == array( true ) );
-               } catch ( RedisException $e ) {
-                       $result = false;
-                       $this->handleException( $conn, $e );
-               }
-
-               $this->logRequest( 'cas', $key, $server, $result );
-               return $result;
-       }
-
        public function delete( $key ) {
-
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
@@ -175,7 +144,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function getMulti( array $keys, $flags = 0 ) {
-
                $batches = array();
                $conns = array();
                foreach ( $keys as $key ) {
@@ -220,7 +188,6 @@ class RedisBagOStuff extends BagOStuff {
         * @return bool
         */
        public function setMulti( array $data, $expiry = 0 ) {
-
                $batches = array();
                $conns = array();
                foreach ( $data as $key => $value ) {
@@ -265,7 +232,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function add( $key, $value, $expiry = 0 ) {
-
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
@@ -273,11 +239,11 @@ class RedisBagOStuff extends BagOStuff {
                $expiry = $this->convertToRelative( $expiry );
                try {
                        if ( $expiry ) {
-                               $conn->multi();
-                               $conn->setnx( $key, $this->serialize( $value ) );
-                               // @FIXME: this always bumps the TTL; use Redis 2.8 or Lua
-                               $conn->expire( $key, $expiry );
-                               $result = ( $conn->exec() == array( true, true ) );
+                               $result = $conn->set(
+                                       $key,
+                                       $this->serialize( $value ),
+                                       array( 'nx', 'ex' => $expiry )
+                               );
                        } else {
                                $result = $conn->setnx( $key, $this->serialize( $value ) );
                        }
@@ -303,7 +269,6 @@ class RedisBagOStuff extends BagOStuff {
         * @return int|bool New value or false on failure
         */
        public function incr( $key, $value = 1 ) {
-
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
@@ -323,14 +288,6 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               if ( !is_callable( $callback ) ) {
-                       throw new Exception( "Got invalid callback." );
-               }
-
-               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
-       }
-
        public function modifySimpleRelayEvent( array $event ) {
                if ( array_key_exists( 'val', $event ) ) {
                        $event['val'] = serialize( $event['val'] ); // this class uses PHP serialization
@@ -381,7 +338,9 @@ class RedisBagOStuff extends BagOStuff {
 
                        // If automatic failover is enabled, check that the server's link
                        // to its master (if any) is up -- but only if there are other
-                       // viable candidates left to consider.
+                       // viable candidates left to consider. Also, getMasterLinkStatus()
+                       // does not work with twemproxy, though $candidates will be empty
+                       // by now in such cases.
                        if ( $this->automaticFailover && $candidates ) {
                                try {
                                        if ( $this->getMasterLinkStatus( $conn ) === 'down' ) {
index e08fec9..91189c8 100644 (file)
@@ -131,8 +131,6 @@ class SqlBagOStuff extends BagOStuff {
         * @throws MWException
         */
        protected function getDB( $serverIndex ) {
-               global $wgDebugDBTransactions;
-
                if ( !isset( $this->conns[$serverIndex] ) ) {
                        if ( $serverIndex >= $this->numServers ) {
                                throw new MWException( __METHOD__ . ": Invalid server index \"$serverIndex\"" );
@@ -147,9 +145,6 @@ class SqlBagOStuff extends BagOStuff {
 
                        # If server connection info was given, use that
                        if ( $this->serverInfos ) {
-                               if ( $wgDebugDBTransactions ) {
-                                       $this->logger->debug( "Using provided serverInfo for SqlBagOStuff" );
-                               }
                                $info = $this->serverInfos[$serverIndex];
                                $type = isset( $info['type'] ) ? $info['type'] : 'mysql';
                                $host = isset( $info['host'] ) ? $info['host'] : '[unknown]';
@@ -173,9 +168,7 @@ class SqlBagOStuff extends BagOStuff {
                                        $db = wfGetDB( $index );
                                }
                        }
-                       if ( $wgDebugDBTransactions ) {
-                               $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $db ) );
-                       }
+                       $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $db ) );
                        $this->conns[$serverIndex] = $db;
                }
 
index 56b9520..4fdaea1 100644 (file)
@@ -379,7 +379,7 @@ class Article implements Page {
 
                # Pre-fill content with error message so that if something
                # fails we'll have something telling us what we intended.
-               //XXX: this isn't page content but a UI message. horrible.
+               // XXX: this isn't page content but a UI message. horrible.
                $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ) );
 
                if ( $oldid ) {
@@ -1124,8 +1124,7 @@ class Article implements Page {
                                        'rc_namespace' => $this->getTitle()->getNamespace(),
                                        'rc_cur_id' => $this->getTitle()->getArticleID()
                                ),
-                               __METHOD__,
-                               array( 'USE INDEX' => 'new_name_timestamp' )
+                               __METHOD__
                        );
                } else {
                        // Cache the information we gathered above in case we can't patrol
@@ -1937,7 +1936,7 @@ class Article implements Page {
         * @return ParserOutput|bool ParserOutput or false if the given revision ID is not found
         */
        public function getParserOutput( $oldid = null, User $user = null ) {
-               //XXX: bypasses mParserOptions and thus setParserOptions()
+               // XXX: bypasses mParserOptions and thus setParserOptions()
 
                if ( $user === null ) {
                        $parserOptions = $this->getParserOptions();
@@ -2010,7 +2009,7 @@ class Article implements Page {
         */
        public function __get( $fname ) {
                if ( property_exists( $this->mPage, $fname ) ) {
-                       #wfWarn( "Access to raw $fname field " . __CLASS__ );
+                       # wfWarn( "Access to raw $fname field " . __CLASS__ );
                        return $this->mPage->$fname;
                }
                trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
@@ -2025,7 +2024,7 @@ class Article implements Page {
         */
        public function __set( $fname, $fvalue ) {
                if ( property_exists( $this->mPage, $fname ) ) {
-                       #wfWarn( "Access to raw $fname field of " . __CLASS__ );
+                       # wfWarn( "Access to raw $fname field of " . __CLASS__ );
                        $this->mPage->$fname = $fvalue;
                // Note: extensions may want to toss on new fields
                } elseif ( !in_array( $fname, array( 'mContext', 'mPage' ) ) ) {
@@ -2045,7 +2044,7 @@ class Article implements Page {
         */
        public function __call( $fname, $args ) {
                if ( is_callable( array( $this->mPage, $fname ) ) ) {
-                       #wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
+                       # wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
                        return call_user_func_array( array( $this->mPage, $fname ), $args );
                }
                trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
index 9b9e3cb..e1cd76c 100644 (file)
@@ -248,7 +248,9 @@ class ImagePage extends Article {
                Hooks::run( 'ImagePageShowTOC', array( $this, &$r ) );
 
                if ( $metadata ) {
-                       $r[] = '<li><a href="#metadata">' . $this->getContext()->msg( 'metadata' )->escaped() . '</a></li>';
+                       $r[] = '<li><a href="#metadata">' .
+                               $this->getContext()->msg( 'metadata' )->escaped() .
+                               '</a></li>';
                }
 
                return '<ul id="filetoc">' . implode( "\n", $r ) . '</ul>';
@@ -389,9 +391,13 @@ class ImagePage extends Article {
                                        }
                                        if ( count( $otherSizes ) ) {
                                                $msgsmall .= ' ' .
-                                               Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
-                                                       $this->getContext()->msg( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
-                                                       params( count( $otherSizes ) )->parse()
+                                               Html::rawElement(
+                                                       'span',
+                                                       array( 'class' => 'mw-filepage-other-resolutions' ),
+                                                       $this->getContext()->msg( 'show-big-image-other' )
+                                                               ->rawParams( $lang->pipeList( $otherSizes ) )
+                                                               ->params( count( $otherSizes ) )
+                                                               ->parse()
                                                );
                                        }
                                } elseif ( $width == 0 && $height == 0 ) {
@@ -667,9 +673,14 @@ EOT
                $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
                $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
 
-               if ( $descUrl && $descText && $this->getContext()->msg( 'sharedupload-desc-here' )->plain() !== '-' ) {
+               if ( $descUrl &&
+                       $descText &&
+                       $this->getContext()->msg( 'sharedupload-desc-here' )->plain() !== '-'
+               ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
-               } elseif ( $descUrl && $this->getContext()->msg( 'sharedupload-desc-there' )->plain() !== '-' ) {
+               } elseif ( $descUrl &&
+                       $this->getContext()->msg( 'sharedupload-desc-there' )->plain() !== '-'
+               ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
                } else {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
@@ -854,7 +865,9 @@ EOT
                                $liContents = $link;
                        } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
                                # Redirect without usages
-                               $liContents = $this->getContext()->msg( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
+                               $liContents = $this->getContext()->msg( 'linkstoimage-redirect' )
+                                       ->rawParams( $link, '' )
+                                       ->parse();
                        } else {
                                # Redirect with usages
                                $li = '';
@@ -923,7 +936,10 @@ EOT
                        } else {
                                $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
                                        $file->getTitle()->getPrefixedText() );
-                               $fromSrc = $this->getContext()->msg( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
+                               $fromSrc = $this->getContext()->msg(
+                                       'shared-repo-from',
+                                       $file->getRepo()->getDisplayName()
+                               )->text();
                        }
                        $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
                }
@@ -1068,8 +1084,10 @@ EOT
                );
                $submit = Xml::submitButton( $this->getContext()->msg( 'img-lang-go' )->text() );
 
-               $formContents = $this->getContext()->msg( 'img-lang-info' )->rawParams( $select, $submit )->parse()
-                       . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
+               $formContents = $this->getContext()->msg( 'img-lang-info' )
+                       ->rawParams( $select, $submit )
+                       ->parse();
+               $formContents .= Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
 
                $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
                        Html::rawElement( 'form', array( 'action' => $wgScript ), $formContents )
@@ -1141,7 +1159,9 @@ EOT
                } else {
                        # Creating thumb links triggers thumbnail generation.
                        # Just generate the thumb for the current users prefs.
-                       $thumbSizes = array( $this->getImageLimitsFromOption( $this->getContext()->getUser(), 'thumbsize' ) );
+                       $thumbSizes = array(
+                               $this->getImageLimitsFromOption( $this->getContext()->getUser(), 'thumbsize' )
+                       );
                        if ( !$this->displayImg->mustRender() ) {
                                // We can safely include a link to the "full-size" preview,
                                // without actually rendering.
index d1cec60..98cc80a 100644 (file)
@@ -298,7 +298,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Fetch a page record with the given conditions
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param array $conditions
         * @param array $options
         * @return object|bool Database result resource, or false on failure
@@ -319,7 +319,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Fetch a page record matching the Title object's namespace and title
         * using a sanitized title string
         *
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param Title $title
         * @param array $options
         * @return object|bool Database result resource, or false on failure
@@ -333,7 +333,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Fetch a page record matching the requested ID
         *
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param int $id
         * @param array $options
         * @return object|bool Database result resource, or false on failure
@@ -469,12 +469,11 @@ class WikiPage implements Page, IDBAccessObject {
         * @return bool
         */
        public function isRedirect() {
-               $content = $this->getContent();
-               if ( !$content ) {
-                       return false;
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
                }
 
-               return $content->isRedirect();
+               return (bool)$this->mIsRedirect;
        }
 
        /**
@@ -950,7 +949,6 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $rt->isExternal() ) {
                        if ( $rt->isLocal() ) {
                                // Offsite wikis need an HTTP redirect.
-                               //
                                // This can be hard to reverse and may produce loops,
                                // so they may be disabled in the site configuration.
                                $source = $this->mTitle->getFullURL( 'redirect=no' );
@@ -964,10 +962,8 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $rt->isSpecialPage() ) {
                        // Gotta handle redirects to special pages differently:
-                       // Fill the HTTP response "Location" header and ignore
-                       // the rest of the page we're on.
-                       //
-                       // Some pages are not valid targets
+                       // Fill the HTTP response "Location" header and ignore the rest of the page we're on.
+                       // Some pages are not valid targets.
                        if ( $rt->isValidRedirectTarget() ) {
                                return $rt->getFullURL();
                        } else {
@@ -1198,7 +1194,7 @@ class WikiPage implements Page, IDBAccessObject {
         * or else the record will be left in a funky state.
         * Best if all done inside a transaction.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @return int|bool The newly created page_id key; false if the title already existed
         */
        public function insertOn( $dbw ) {
@@ -1232,7 +1228,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Update the page record to point to a newly saved revision.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param Revision $revision For ID number, and text used to set
         *   length and redirect status fields
         * @param int $lastRevision If given, will not overwrite the page field
@@ -1299,7 +1295,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Add row to the redirect table if this is a redirect, remove otherwise.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param Title $redirectTitle Title object pointing to the redirect target,
         *   or NULL if this is not a redirect
         * @param null|bool $lastRevIsRedirect If given, will optimize adding and
@@ -1338,7 +1334,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @deprecated since 1.24, use updateRevisionOn instead
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param Revision $revision
         * @return bool
         */
@@ -1425,7 +1421,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $edittime Revision timestamp or null to use the current revision.
         *
         * @throws MWException
-        * @return string New complete article text, or null if error.
+        * @return string|null New complete article text, or null if error.
         *
         * @deprecated since 1.21, use replaceSectionAtRev() instead
         */
@@ -1434,7 +1430,7 @@ class WikiPage implements Page, IDBAccessObject {
        ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
-               //NOTE: keep condition in sync with condition in replaceSectionContent!
+               // NOTE: keep condition in sync with condition in replaceSectionContent!
                if ( strval( $sectionId ) === '' ) {
                        // Whole-page edit; let the whole text through
                        return $text;
@@ -1477,7 +1473,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $edittime Revision timestamp or null to use the current revision.
         *
         * @throws MWException
-        * @return Content New complete article content, or null if error.
+        * @return Content|null New complete article content, or null if error.
         *
         * @since 1.21
         * @deprecated since 1.24, use replaceSectionAtRev instead
@@ -1516,7 +1512,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param int|null $baseRevId
         *
         * @throws MWException
-        * @return Content New complete article content, or null if error.
+        * @return Content|null New complete article content, or null if error.
         *
         * @since 1.24
         */
@@ -1811,8 +1807,7 @@ class WikiPage implements Page, IDBAccessObject {
                                }
                                $revisionId = $revision->insertOn( $dbw );
 
-                               // Update page
-                               //
+                               // Update page.
                                // We check for conflicts by comparing $oldid with the current latest revision ID.
                                $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
 
@@ -2046,7 +2041,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $user = is_null( $user ) ? $wgUser : $user;
-               //XXX: check $user->getId() here???
+               // XXX: check $user->getId() here???
 
                // Use a sane default for $serialFormat, see bug 57026
                if ( $serialFormat === null ) {
@@ -2409,6 +2404,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $logRelationsValues = array();
                $logRelationsField = null;
+               $logParamsDetails = array();
 
                if ( $id ) { // Protection of existing page
                        if ( !Hooks::run( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
@@ -2467,6 +2463,7 @@ class WikiPage implements Page, IDBAccessObject {
                                        __METHOD__
                                );
                                if ( $restrictions != '' ) {
+                                       $cascadeValue = ( $cascade && $action == 'edit' ) ? 1 : 0;
                                        $dbw->insert(
                                                'page_restrictions',
                                                array(
@@ -2474,12 +2471,18 @@ class WikiPage implements Page, IDBAccessObject {
                                                        'pr_page' => $id,
                                                        'pr_type' => $action,
                                                        'pr_level' => $restrictions,
-                                                       'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
+                                                       'pr_cascade' => $cascadeValue,
                                                        'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
                                                ),
                                                __METHOD__
                                        );
                                        $logRelationsValues[] = $dbw->insertId();
+                                       $logParamsDetails[] = array(
+                                               'type' => $action,
+                                               'level' => $restrictions,
+                                               'expiry' => $expiry[$action],
+                                               'cascade' => (bool)$cascadeValue,
+                                       );
                                }
                        }
 
@@ -2510,6 +2513,11 @@ class WikiPage implements Page, IDBAccessObject {
                                                'pt_reason' => $reason,
                                        ), __METHOD__
                                );
+                               $logParamsDetails[] = array(
+                                       'type' => 'create',
+                                       'level' => $limit['create'],
+                                       'expiry' => $expiry['create'],
+                               );
                        } else {
                                $dbw->delete( 'protected_titles',
                                        array(
@@ -2527,15 +2535,24 @@ class WikiPage implements Page, IDBAccessObject {
                        $params = array();
                } else {
                        $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
-                       $params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
+                       $params = array(
+                               '4::description' => $protectDescriptionLog, // parameter for IRC
+                               '5:bool:cascade' => $cascade,
+                               'details' => $logParamsDetails, // parameter for localize and api
+                       );
                }
 
                // Update the protection log
-               $log = new LogPage( 'protect' );
-               $logId = $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
+               $logEntry = new ManualLogEntry( 'protect', $logAction );
+               $logEntry->setTarget( $this->mTitle );
+               $logEntry->setComment( $reason );
+               $logEntry->setPerformer( $user );
+               $logEntry->setParameters( $params );
                if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
-                       $log->addRelations( $logRelationsField, $logRelationsValues, $logId );
+                       $logEntry->setRelations( array( $logRelationsField => $logRelationsValues ) );
                }
+               $logId = $logEntry->insert();
+               $logEntry->publish( $logId );
 
                return Status::newGood();
        }
@@ -2795,16 +2812,18 @@ class WikiPage implements Page, IDBAccessObject {
                        $bitfield = 'rev_deleted';
                }
 
-               // For now, shunt the revision data into the archive table.
-               // Text is *not* removed from the text table; bulk storage
-               // is left intact to avoid breaking block-compression or
-               // immutable storage schemes.
-               //
-               // For backwards compatibility, note that some older archive
-               // table entries will have ar_text and ar_flags fields still.
-               //
-               // In the future, we may keep revisions and mark them with
-               // the rev_deleted field, which is reserved for this purpose.
+               /**
+                * For now, shunt the revision data into the archive table.
+                * Text is *not* removed from the text table; bulk storage
+                * is left intact to avoid breaking block-compression or
+                * immutable storage schemes.
+                *
+                * For backwards compatibility, note that some older archive
+                * table entries will have ar_text and ar_flags fields still.
+                *
+                * In the future, we may keep revisions and mark them with
+                * the rev_deleted field, which is reserved for this purpose.
+                */
 
                $row = array(
                        'ar_namespace'  => 'page_namespace',
@@ -2911,12 +2930,15 @@ class WikiPage implements Page, IDBAccessObject {
         *   may already return null when the page proper was deleted.
         */
        public function doDeleteUpdates( $id, Content $content = null ) {
-               // update site status
+               // Update site status
                DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
 
-               // remove secondary indexes, etc
+               // Delete pagelinks, update secondary indexes, etc
                $updates = $this->getDeletionUpdates( $content );
-               DataUpdate::runUpdates( $updates );
+               // Make sure an enqueued jobs run after commit so they see the deletion
+               wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $updates ) {
+                       DataUpdate::runUpdates( $updates, 'enqueue' );
+               } );
 
                // Reparse any pages transcluding this page
                LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
index c450689..7acfe38 100644 (file)
@@ -32,10 +32,17 @@ class CacheTime {
         */
        public $mUsedOptions;
 
-       public $mVersion = Parser::VERSION,  # Compatibility check
-               $mCacheTime = '',             # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
-               $mCacheExpiry = null,         # Seconds after which the object should expire, use 0 for uncacheable. Used in ParserCache.
-               $mCacheRevisionId = null;     # Revision ID that was parsed
+       # Compatibility check
+       public $mVersion = Parser::VERSION;
+
+       # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
+       public $mCacheTime = '';
+
+       # Seconds after which the object should expire, use 0 for uncacheable. Used in ParserCache.
+       public $mCacheExpiry = null;
+
+       # Revision ID that was parsed
+       public $mCacheRevisionId = null;
 
        /**
         * @return string TS_MW timestamp
index 7639e2f..42091a0 100644 (file)
@@ -60,7 +60,11 @@ class CoreParserFunctions {
                        $parser->setFunctionHook( $func, array( __CLASS__, $func ), Parser::SFH_NO_HASH );
                }
 
-               $parser->setFunctionHook( 'namespace', array( __CLASS__, 'mwnamespace' ), Parser::SFH_NO_HASH );
+               $parser->setFunctionHook(
+                       'namespace',
+                       array( __CLASS__, 'mwnamespace' ),
+                       Parser::SFH_NO_HASH
+               );
                $parser->setFunctionHook( 'int', array( __CLASS__, 'intFunction' ), Parser::SFH_NO_HASH );
                $parser->setFunctionHook( 'special', array( __CLASS__, 'special' ) );
                $parser->setFunctionHook( 'speciale', array( __CLASS__, 'speciale' ) );
@@ -68,7 +72,11 @@ class CoreParserFunctions {
                $parser->setFunctionHook( 'formatdate', array( __CLASS__, 'formatDate' ) );
 
                if ( $wgAllowDisplayTitle ) {
-                       $parser->setFunctionHook( 'displaytitle', array( __CLASS__, 'displaytitle' ), Parser::SFH_NO_HASH );
+                       $parser->setFunctionHook(
+                               'displaytitle',
+                               array( __CLASS__, 'displaytitle' ),
+                               Parser::SFH_NO_HASH
+                       );
                }
                if ( $wgAllowSlowParserFunctions ) {
                        $parser->setFunctionHook(
@@ -696,15 +704,15 @@ class CoreParserFunctions {
 
                // split the given option to its variable
                if ( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
-                       //{{pagesincategory:|raw[|type]}}
+                       // {{pagesincategory:|raw[|type]}}
                        $raw = $arg1;
                        $type = $magicWords->matchStartToEnd( $arg2 );
                } else {
-                       //{{pagesincategory:[|type[|raw]]}}
+                       // {{pagesincategory:[|type[|raw]]}}
                        $type = $magicWords->matchStartToEnd( $arg1 );
                        $raw = $arg2;
                }
-               if ( !$type ) { //backward compatibility
+               if ( !$type ) { // backward compatibility
                        $type = 'pagesincategory_all';
                }
 
@@ -810,7 +818,9 @@ class CoreParserFunctions {
         * @param int $direction
         * @return string
         */
-       public static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) {
+       public static function pad(
+               $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT
+       ) {
                $padding = $parser->killMarkers( $padding );
                $lengthOfPadding = mb_strlen( $padding );
                if ( $lengthOfPadding == 0 ) {
index b4ca7c8..41b5dec 100644 (file)
@@ -364,13 +364,13 @@ class LinkHolderArray {
                                # The redirect status and length is passed to getLinkColour via the LinkCache
                                # Use formal parameters instead
                                $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
-                               //add id to the extension todolist
+                               // add id to the extension todolist
                                $linkcolour_ids[$s->page_id] = $pdbk;
                        }
                        unset( $res );
                }
                if ( count( $linkcolour_ids ) ) {
-                       //pass an array of page_ids to an extension
+                       // pass an array of page_ids to an extension
                        Hooks::run( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
                }
 
index 807842b..3a2bb17 100644 (file)
@@ -45,7 +45,7 @@ class MWTidy {
        public static function tidy( $text ) {
                $driver = self::singleton();
                if ( !$driver ) {
-                       throw new MWException( __METHOD__.
+                       throw new MWException( __METHOD__ .
                                ': tidy is disabled, caller should have checked MWTidy::isEnabled()' );
                }
                return $driver->tidy( $text );
@@ -61,7 +61,7 @@ class MWTidy {
        public static function checkErrors( $text, &$errorStr = null ) {
                $driver = self::singleton();
                if ( !$driver ) {
-                       throw new MWException( __METHOD__.
+                       throw new MWException( __METHOD__ .
                                ': tidy is disabled, caller should have checked MWTidy::isEnabled()' );
                }
                if ( $driver->supportsValidate() ) {
index 677da63..efad151 100644 (file)
@@ -91,8 +91,10 @@ class Parser {
        # at least one character of a host name (embeds EXT_LINK_URL_CLASS)
        const EXT_LINK_ADDR = '(?:[0-9.]+|\\[(?i:[0-9a-f:.]+)\\]|[^][<>"\\x00-\\x20\\x7F\p{Zs}])';
        # RegExp to make image URLs (embeds IPv6 part of EXT_LINK_ADDR)
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)((?:\\[(?i:[0-9a-f:.]+)\\])?[^][<>"\\x00-\\x20\\x7F\p{Zs}]+)
                \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sxu';
+       // @codingStandardsIgnoreEnd
 
        # Regular expression for a non-newline space
        const SPACE_NOT_NL = '(?:\t|&nbsp;|&\#0*160;|&\#[Xx]0*[Aa]0;|\p{Zs})';
@@ -511,7 +513,10 @@ class Parser {
                        }
                        $limitReport .= 'Cached time: ' . $this->mOutput->getCacheTime() . "\n";
                        $limitReport .= 'Cache expiry: ' . $this->mOutput->getCacheExpiry() . "\n";
-                       $limitReport .= 'Dynamic content: ' . ( $this->mOutput->hasDynamicContent() ? 'true' : 'false' ) . "\n";
+                       $limitReport .= 'Dynamic content: ' .
+                               ( $this->mOutput->hasDynamicContent() ? 'true' : 'false' ) .
+                               "\n";
+
                        foreach ( $this->mOutput->getLimitReportData() as $key => $value ) {
                                if ( Hooks::run( 'ParserLimitReportFormat',
                                        array( $key, &$value, &$limitReport, false, false )
@@ -1468,14 +1473,19 @@ class Parser {
         * @private
         */
        public function makeFreeExternalLink( $url, $numPostProto ) {
-
                $trail = '';
 
                # The characters '<' and '>' (which were escaped by
                # removeHTMLtags()) should not be included in
                # URLs, per RFC 2396.
+               # Make &nbsp; terminate a URL as well (bug T84937)
                $m2 = array();
-               if ( preg_match( '/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE ) ) {
+               if ( preg_match(
+                       '/&(lt|gt|nbsp|#x0*(3[CcEe]|[Aa]0)|#0*(60|62|160));/',
+                       $url,
+                       $m2,
+                       PREG_OFFSET_CAPTURE
+               ) ) {
                        $trail = substr( $url, $m2[0][1] ) . $trail;
                        $url = substr( $url, 0, $m2[0][1] );
                }
@@ -3377,6 +3387,8 @@ class Parser {
         * Warn the user when a parser limitation is reached
         * Will warn at most once the user per limitation type
         *
+        * The results are shown during preview and run through the Parser (See EditPage.php)
+        *
         * @param string $limitationType Should be one of:
         *   'expensive-parserfunction' (corresponding messages:
         *       'expensive-parserfunction-warning',
@@ -3399,8 +3411,10 @@ class Parser {
         */
        public function limitationWarn( $limitationType, $current = '', $max = '' ) {
                # does no harm if $current and $max are present but are unnecessary for the message
+               # Not doing ->inLanguage( $this->mOptions->getUserLangObj() ), since this is shown
+               # only during preview, and that would split the parser cache unnecessarily.
                $warning = wfMessage( "$limitationType-warning" )->numParams( $current, $max )
-                       ->inLanguage( $this->mOptions->getUserLangObj() )->text();
+                       ->text();
                $this->mOutput->addWarning( $warning );
                $this->addTrackingCategory( "$limitationType-category" );
        }
@@ -4842,16 +4856,7 @@ class Parser {
                $ts = $this->mOptions->getTimestamp();
                $timestamp = MWTimestamp::getLocalInstance( $ts );
                $ts = $timestamp->format( 'YmdHis' );
-               $tzMsg = $timestamp->format( 'T' );  # might vary on DST changeover!
-
-               # Allow translation of timezones through wiki. format() can return
-               # whatever crap the system uses, localised or not, so we cannot
-               # ship premade translations.
-               $key = 'timezone-' . strtolower( trim( $tzMsg ) );
-               $msg = wfMessage( $key )->inContentLanguage();
-               if ( $msg->exists() ) {
-                       $tzMsg = $msg->text();
-               }
+               $tzMsg = $timestamp->getTimezoneMessage()->inContentLanguage()->text();
 
                $d = $wgContLang->timeanddate( $ts, false, false ) . " ($tzMsg)";
 
@@ -5326,7 +5331,6 @@ class Parser {
                $ig->setParser( $this );
                $ig->setHideBadImages();
                $ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'table' ) );
-               $this->getOutput()->addModuleStyles( 'mediawiki.page.gallery.styles' );
 
                if ( isset( $params['showfilename'] ) ) {
                        $ig->setShowFilename( true );
index abff543..0eba166 100644 (file)
@@ -139,7 +139,9 @@ class ParserCache {
                }
 
                // Determine the options which affect this article
-               $optionsKey = $this->mMemc->get( $this->getOptionsKey( $article ) );
+               $casToken = null;
+               $optionsKey = $this->mMemc->get(
+                       $this->getOptionsKey( $article ), $casToken, BagOStuff::READ_VERIFIED );
                if ( $optionsKey instanceof CacheTime ) {
                        if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
                                wfIncrStats( "pcache.miss.expired" );
@@ -198,7 +200,8 @@ class ParserCache {
                        return false;
                }
 
-               $value = $this->mMemc->get( $parserOutputKey );
+               $casToken = null;
+               $value = $this->mMemc->get( $parserOutputKey, $casToken, BagOStuff::READ_VERIFIED );
                if ( !$value ) {
                        wfDebug( "ParserOutput cache miss.\n" );
                        wfIncrStats( "pcache.miss.absent" );
@@ -226,11 +229,17 @@ class ParserCache {
                        wfIncrStats( "pcache.miss.revid" );
                        $revId = $article->getLatest();
                        $cachedRevId = $value->getCacheRevisionId();
-                       wfDebug( "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n" );
+                       wfDebug(
+                               "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n"
+                       );
                        $value = false;
-               } elseif ( Hooks::run( 'RejectParserCacheValue', array( $value, $wikiPage, $popts ) ) === false ) {
+               } elseif (
+                       Hooks::run( 'RejectParserCacheValue', array( $value, $wikiPage, $popts ) ) === false
+               ) {
                        wfIncrStats( 'pcache.miss.rejected' );
-                       wfDebug( "ParserOutput key valid, but rejected by RejectParserCacheValue hook handler.\n" );
+                       wfDebug(
+                               "ParserOutput key valid, but rejected by RejectParserCacheValue hook handler.\n"
+                       );
                        $value = false;
                } else {
                        wfIncrStats( "pcache.hit" );
@@ -284,7 +293,10 @@ class ParserCache {
                        // ...and its pointer
                        $this->mMemc->set( $this->getOptionsKey( $page ), $optionsKey, $expire );
 
-                       Hooks::run( 'ParserCacheSaveComplete', array( $this, $parserOutput, $page->getTitle(), $popts, $revId ) );
+                       Hooks::run(
+                               'ParserCacheSaveComplete',
+                               array( $this, $parserOutput, $page->getTitle(), $popts, $revId )
+                       );
                } else {
                        wfDebug( "Parser output was marked as uncacheable and has not been saved.\n" );
                }
index 1073aed..e6d5274 100644 (file)
@@ -831,8 +831,8 @@ class ParserOptions {
        }
 
        /**
-        * Sets a hook to force that a page exists, and sets a current revision callback to return a
-        * revision with custom content when the current revision of the page is requested.
+        * Sets a hook to force that a page exists, and sets a current revision callback to return
+        * revision with custom content when the current revision of the page is requested.
         *
         * @since 1.25
         * @param Title $title
@@ -841,20 +841,25 @@ class ParserOptions {
         * @return ScopedCallback to unset the hook
         */
        public function setupFakeRevision( $title, $content, $user ) {
-               $oldCallback = $this->setCurrentRevisionCallback( function ( $titleToCheck, $parser = false ) use ( $title, $content, $user, &$oldCallback ) {
-                       if ( $titleToCheck->equals( $title ) ) {
-                               return new Revision( array(
-                                       'page' => $title->getArticleID(),
-                                       'user_text' => $user->getName(),
-                                       'user' => $user->getId(),
-                                       'parent_id' => $title->getLatestRevId(),
-                                       'title' => $title,
-                                       'content' => $content
-                               ) );
-                       } else {
-                               return call_user_func( $oldCallback, $titleToCheck, $parser );
+               $oldCallback = $this->setCurrentRevisionCallback(
+                       function (
+                               $titleToCheck, $parser = false ) use ( $title, $content, $user, &$oldCallback
+                       ) {
+                               if ( $titleToCheck->equals( $title ) ) {
+                                       return new Revision( array(
+                                               'page' => $title->getArticleID(),
+                                               'user_text' => $user->getName(),
+                                               'user' => $user->getId(),
+                                               'parent_id' => $title->getLatestRevId(),
+                                               'title' => $title,
+                                               'content' => $content
+                                       ) );
+                               } else {
+                                       return call_user_func( $oldCallback, $titleToCheck, $parser );
+                               }
                        }
-               } );
+               );
+
                global $wgHooks;
                $wgHooks['TitleExists'][] =
                        function ( $titleToCheck, &$exists ) use ( $title ) {
index 2eb1dc9..3745238 100644 (file)
  * @ingroup Parser
  */
 class ParserOutput extends CacheTime {
-       public $mText,                       # The output text
-               $mLanguageLinks,              # List of the full text of language links, in the order they appear
-               $mCategories,                 # Map of category names to sort keys
-               $mIndicators = array(),       # Page status indicators, usually displayed in top-right corner
-               $mTitleText,                  # title text of the chosen language variant
-               $mLinks = array(),            # 2-D map of NS/DBK to ID for the links in the document. ID=zero for broken.
-               $mTemplates = array(),        # 2-D map of NS/DBK to ID for the template references. ID=zero for broken.
-               $mTemplateIds = array(),      # 2-D map of NS/DBK to rev ID for the template references. ID=zero for broken.
-               $mImages = array(),           # DB keys of the images used, in the array key only
-               $mFileSearchOptions = array(), # DB keys of the images used mapped to sha1 and MW timestamp
-               $mExternalLinks = array(),    # External link URLs, in the key only
-               $mInterwikiLinks = array(),   # 2-D map of prefix/DBK (in keys only) for the inline interwiki links in the document.
-               $mNewSection = false,         # Show a new section link?
-               $mHideNewSection = false,     # Hide the new section link?
-               $mNoGallery = false,          # No gallery on category page? (__NOGALLERY__)
-               $mHeadItems = array(),        # Items to put in the <head> section
-               $mModules = array(),          # Modules to be loaded by the resource loader
-               $mModuleScripts = array(),    # Modules of which only the JS will be loaded by the resource loader
-               $mModuleStyles = array(),     # Modules of which only the CSSS will be loaded by the resource loader
-               $mJsConfigVars = array(),     # JavaScript config variable for mw.config combined with this page
-               $mOutputHooks = array(),      # Hook tags as per $wgParserOutputHooks
-               $mWarnings = array(),         # Warning text to be returned to the user. Wikitext formatted, in the key only
-               $mSections = array(),         # Table of contents
-               $mEditSectionTokens = false,  # prefix/suffix markers if edit sections were output as tokens
-               $mProperties = array(),       # Name/value pairs to be cached in the DB
-               $mTOCHTML = '',               # HTML of the TOC
-               $mTimestamp,                  # Timestamp of the revision
-               $mTOCEnabled = true,          # Whether TOC should be shown, can't override __NOTOC__
-               $mEnableOOUI = false;         # Whether OOUI should be enabled
-       private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
-       private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
-       private $mExtensionData = array(); # extra data used by extensions
-       private $mLimitReportData = array(); # Parser limit report data
-       private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
-       private $mPreventClickjacking = false; # Whether to emit X-Frame-Options: DENY
-       private $mFlags = array();        # Generic flags
+       /**
+        * @var string $mText The output text
+        */
+       public $mText;
+
+       /**
+        * @var array $mLanguageLinks List of the full text of language links,
+        *  in the order they appear.
+        */
+       public $mLanguageLinks;
+
+       /**
+        * @var array $mCategoriesMap of category names to sort keys
+        */
+       public $mCategories;
+
+       /**
+        * @var array $mIndicators Page status indicators, usually displayed in top-right corner.
+        */
+       public $mIndicators = array();
+
+       /**
+        * @var string $mTitleText Title text of the chosen language variant
+        */
+       public $mTitleText;
+
+       /**
+        * @var array $mLinks 2-D map of NS/DBK to ID for the links in the document.
+        *  ID=zero for broken.
+        */
+       public $mLinks = array();
+
+       /**
+        * @var array $mTemplates 2-D map of NS/DBK to ID for the template references.
+        *  ID=zero for broken.
+        */
+       public $mTemplates = array();
+
+       /**
+        * @var array $mTemplateIds 2-D map of NS/DBK to rev ID for the template references.
+        *  ID=zero for broken.
+        */
+       public $mTemplateIds = array();
+
+       /**
+        * @var array $mImages DB keys of the images used, in the array key only
+        */
+       public $mImages = array();
+
+       /**
+        * @var array $mFileSearchOptions DB keys of the images used mapped to sha1 and MW timestamp.
+        */
+       public $mFileSearchOptions = array();
+
+       /**
+        * @var array $mExternalLinks External link URLs, in the key only.
+        */
+       public $mExternalLinks = array();
+
+       /**
+        * @var array $mInterwikiLinks 2-D map of prefix/DBK (in keys only)
+        *  for the inline interwiki links in the document.
+        */
+       public $mInterwikiLinks = array();
+
+       /**
+        * @var bool $mNewSection Show a new section link?
+        */
+       public $mNewSection = false;
+
+       /**
+        * @var bool $mHideNewSection Hide the new section link?
+        */
+       public $mHideNewSection = false;
+
+       /**
+        * @var bool $mNoGallery No gallery on category page? (__NOGALLERY__).
+        */
+       public $mNoGallery = false;
+
+       /**
+        * @var array $mHeadItems Items to put in the <head> section
+        */
+       public $mHeadItems = array();
+
+       /**
+        * @var array $mModules Modules to be loaded by the resource loader
+        */
+       public $mModules = array();
+
+       /**
+        * @var array $mModuleScripts Modules of which only the JS will be loaded by
+        *  the resource loader.
+        */
+       public $mModuleScripts = array();
+
+       /**
+        * @var array $mModuleStyles Modules of which only the CSSS will be loaded by
+        *  the resource loader.
+        */
+       public $mModuleStyles = array();
+
+       /**
+        * @var array $mJsConfigVars JavaScript config variable for mw.config combined with this page.
+        */
+       public $mJsConfigVars = array();
+
+       /**
+        * @var array $mOutputHooks Hook tags as per $wgParserOutputHooks.
+        */
+       public $mOutputHooks = array();
+
+       /**
+        * @var array $mWarnings Warning text to be returned to the user.
+        *  Wikitext formatted, in the key only.
+        */
+       public $mWarnings = array();
+
+       /**
+        * @var array $mSections Table of contents
+        */
+       public $mSections = array();
+
+       /**
+        * @var bool $mEditSectionTokens prefix/suffix markers if edit sections were output as tokens.
+        */
+       public $mEditSectionTokens = false;
+
+       /**
+        * @var array $mProperties Name/value pairs to be cached in the DB.
+        */
+       public $mProperties = array();
+
+       /**
+        * @var string $mTOCHTML HTML of the TOC.
+        */
+       public $mTOCHTML = '';
+
+       /**
+        * @var string $mTimestamp Timestamp of the revision.
+        */
+       public $mTimestamp;
+
+       /**
+        * @var bool $mTOCEnabled Whether TOC should be shown, can't override __NOTOC__.
+        */
+       public $mTOCEnabled = true;
+
+       /**
+        * @var bool $mEnableOOUI Whether OOUI should be enabled.
+        */
+       public $mEnableOOUI = false;
+
+       /**
+        * @var string $mIndexPolicy 'index' or 'noindex'?  Any other value will result in no change.
+        */
+       private $mIndexPolicy = '';
+
+       /**
+        * @var array $mAccessedOptions List of ParserOptions (stored in the keys).
+        */
+       private $mAccessedOptions = array();
+
+       /**
+        * @var array $mExtensionData extra data used by extensions.
+        */
+       private $mExtensionData = array();
+
+       /**
+        * @var array $mLimitReportData Parser limit report data.
+        */
+       private $mLimitReportData = array();
+
+       /**
+        * @var array $mParseStartTime Timestamps for getTimeSinceStart().
+        */
+       private $mParseStartTime = array();
+
+       /**
+        * @var bool $mPreventClickjacking Whether to emit X-Frame-Options: DENY.
+        */
+       private $mPreventClickjacking = false;
+
+       /**
+        * @var array $mFlags Generic flags.
+        */
+       private $mFlags = array();
 
        const EDITSECTION_REGEX =
                '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
@@ -715,7 +866,11 @@ class ParserOutput extends CacheTime {
         */
        public function addSecondaryDataUpdate( DataUpdate $update ) {
                wfDeprecated( __METHOD__, '1.25' );
-               throw new MWException( 'ParserOutput::addSecondaryDataUpdate() is no longer supported. Override Content::getSecondaryDataUpdates() or use the SecondaryDataUpdates hook instead.' );
+               throw new MWException(
+                       'ParserOutput::addSecondaryDataUpdate() is no longer supported. ' .
+                               'Override Content::getSecondaryDataUpdates() ' .
+                               'or use the SecondaryDataUpdates hook instead.'
+               );
        }
 
        /**
index 8a09be8..4e359a6 100644 (file)
@@ -71,7 +71,7 @@ class Preprocessor_DOM implements Preprocessor {
         * @throws MWException
         */
        public function newPartNodeArray( $values ) {
-               //NOTE: DOM manipulation is slower than building & parsing XML! (or so Tim sais)
+               // NOTE: DOM manipulation is slower than building & parsing XML! (or so Tim sais)
                $xml = "<list>";
 
                foreach ( $values as $k => $val ) {
@@ -257,7 +257,7 @@ class Preprocessor_DOM implements Preprocessor {
 
                $stack = new PPDStack;
 
-               $searchBase = "[{<\n"; #}
+               $searchBase = "[{<\n"; # }
                // For fast reverse searches
                $revText = strrev( $text );
                $lengthText = strlen( $text );
@@ -282,7 +282,7 @@ class Preprocessor_DOM implements Preprocessor {
                $fakeLineStart = true;
 
                while ( true ) {
-                       //$this->memCheck();
+                       // $this->memCheck();
 
                        if ( $findOnlyinclude ) {
                                // Ignore all input up to the next <onlyinclude>
@@ -848,12 +848,31 @@ class PPDStack {
  * @ingroup Parser
  */
 class PPDStackElement {
-       public $open,              // Opening character (\n for heading)
-               $close,             // Matching closing character
-               $count,             // Number of opening characters found (number of "=" for heading)
-               $parts,             // Array of PPDPart objects describing pipe-separated parts.
-               $lineStart;         // True if the open char appeared at the start of the input line.
-                                   // Not set for headings.
+       /**
+        * @var string Opening character (\n for heading)
+        */
+       public $open;
+
+       /**
+        * @var string Matching closing character
+        */
+       public $close;
+
+       /**
+        * @var int Number of opening characters found (number of "=" for heading)
+        */
+       public $count;
+
+       /**
+        * @var PPDPart[] Array of PPDPart objects describing pipe-separated parts.
+        */
+       public $parts;
+
+       /**
+        * @var bool True if the open char appeared at the start of the input line.
+        *  Not set for headings.
+        */
+       public $lineStart;
 
        public $partClass = 'PPDPart';
 
@@ -924,7 +943,10 @@ class PPDStackElement {
  * @ingroup Parser
  */
 class PPDPart {
-       public $out; // Output accumulator string
+       /**
+        * @var string Output accumulator string
+        */
+       public $out;
 
        // Optional member variables:
        //   eqpos        Position of equals sign in output accumulator
index 9429e44..f536d82 100644 (file)
@@ -200,7 +200,7 @@ class Preprocessor_Hash implements Preprocessor {
                $fakeLineStart = true;
 
                while ( true ) {
-                       //$this->memCheck();
+                       // $this->memCheck();
 
                        if ( $findOnlyinclude ) {
                                // Ignore all input up to the next <onlyinclude>
@@ -1154,7 +1154,7 @@ class PPFrame_Hash implements PPFrame {
                                        ) {
                                                $out .= $contextNode->firstChild->value;
                                        } else {
-                                               //$out .= '';
+                                               // $out .= '';
                                        }
                                } elseif ( $contextNode->name == 'ext' ) {
                                        # Extension tag
index d7357cf..6dd0b35 100644 (file)
@@ -149,6 +149,7 @@ class PoolCounterRedis extends PoolCounter {
                }
                $conn = $status->value;
 
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                static $script =
 <<<LUA
                local kSlots,kSlotsNextRelease,kWakeup,kWaiting = unpack(KEYS)
@@ -186,6 +187,8 @@ class PoolCounterRedis extends PoolCounter {
                end
                return 1
 LUA;
+               // @codingStandardsIgnoreEnd
+
                try {
                        $conn->luaEval( $script,
                                array(
index 6c58453..50a77ec 100644 (file)
@@ -32,7 +32,7 @@
 function wfGetRusage() {
        if ( !function_exists( 'getrusage' ) ) {
                return false;
-       } elseif ( defined( 'HHVM_VERSION' ) ) {
+       } elseif ( defined( 'HHVM_VERSION' ) && PHP_OS === 'Linux' ) {
                return getrusage( 2 /* RUSAGE_THREAD */ );
        } else {
                return getrusage( 0 /* RUSAGE_SELF */ );
index a7a926c..f64d826 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 use Composer\Semver\VersionParser;
-use Composer\Semver\Constraint\VersionConstraint;
+use Composer\Semver\Constraint\Constraint;
 
 /**
  * @since 1.26
@@ -26,7 +26,7 @@ use Composer\Semver\Constraint\VersionConstraint;
 class CoreVersionChecker {
 
        /**
-        * @var VersionConstraint|bool representing $wgVersion
+        * @var Constraint|bool representing $wgVersion
         */
        private $coreVersion = false;
 
@@ -41,7 +41,7 @@ class CoreVersionChecker {
        public function __construct( $coreVersion ) {
                $this->versionParser = new VersionParser();
                try {
-                       $this->coreVersion = new VersionConstraint(
+                       $this->coreVersion = new Constraint(
                                '==',
                                $this->versionParser->normalize( $coreVersion )
                        );
index a286f6b..84e873d 100644 (file)
@@ -58,7 +58,7 @@ class ExtensionProcessor implements Processor {
                'wgRevokePermissions' => 'array_plus_2d',
                'wgHooks' => 'array_merge_recursive',
                // credits are handled in the ExtensionRegistry
-               //'wgExtensionCredits' => 'array_merge_recursive',
+               // 'wgExtensionCredits' => 'array_merge_recursive',
                'wgExtraGenderNamespaces' => 'array_plus',
                'wgNamespacesWithSubpages' => 'array_plus',
                'wgNamespaceContentModels' => 'array_plus',
index 23e29d8..59b9249 100644 (file)
@@ -114,12 +114,22 @@ class ExtensionRegistry {
        }
 
        public function loadFromQueue() {
+               global $wgVersion;
                if ( !$this->queued ) {
                        return;
                }
 
+               // A few more things to vary the cache on
+               $versions = array(
+                       'registration' => self::CACHE_VERSION,
+                       'mediawiki' => $wgVersion
+               );
+
                // See if this queue is in APC
-               $key = wfMemcKey( 'registration', md5( json_encode( $this->queued ) ), self::CACHE_VERSION );
+               $key = wfMemcKey(
+                       'registration',
+                       md5( json_encode( $this->queued + $versions ) )
+               );
                $data = $this->cache->get( $key );
                if ( $data ) {
                        $this->exportExtractedData( $data );
@@ -194,7 +204,7 @@ class ExtensionRegistry {
                        ) {
                                // Doesn't match, mark it as incompatible.
                                $incompatible[] = "{$info['name']} is not compatible with the current "
-                                       . "MediaWiki core (version {$wgVersion}), it requires: ". $requires[self::MEDIAWIKI_CORE]
+                                       . "MediaWiki core (version {$wgVersion}), it requires: " . $requires[self::MEDIAWIKI_CORE]
                                        . '.';
                                continue;
                        }
index 1f48514..77ceff6 100644 (file)
@@ -87,6 +87,9 @@ class ResourceLoader implements LoggerAwareInterface {
         */
        private $logger;
 
+       /** @var string JavaScript / CSS pragma to disable minification. **/
+       const FILTER_NOMIN = ' /* @nomin */ ';
+
        /**
         * Load information stored in the database about modules.
         *
@@ -110,28 +113,29 @@ class ResourceLoader implements LoggerAwareInterface {
                $skin = $context->getSkin();
                $lang = $context->getLanguage();
 
-               // Get file dependency information
+               // Batched version of ResourceLoaderModule::getFileDependencies
+               $vary = "$skin|$lang";
                $res = $dbr->select( 'module_deps', array( 'md_module', 'md_deps' ), array(
                                'md_module' => $modules,
-                               'md_skin' => $skin
+                               'md_skin' => $vary,
                        ), __METHOD__
                );
-
-               // Set modules' dependencies
+               // Prime in-object cache values for each module
                $modulesWithDeps = array();
                foreach ( $res as $row ) {
                        $module = $this->getModule( $row->md_module );
                        if ( $module ) {
-                               $module->setFileDependencies( $skin, FormatJson::decode( $row->md_deps, true ) );
+                               $module->setFileDependencies( $context, ResourceLoaderModule::expandRelativePaths(
+                                       FormatJson::decode( $row->md_deps, true )
+                               ) );
                                $modulesWithDeps[] = $row->md_module;
                        }
                }
-
                // Register the absence of a dependency row too
                foreach ( array_diff( $modules, $modulesWithDeps ) as $name ) {
                        $module = $this->getModule( $name );
                        if ( $module ) {
-                               $this->getModule( $name )->setFileDependencies( $skin, array() );
+                               $this->getModule( $name )->setFileDependencies( $context, array() );
                        }
                }
 
@@ -179,77 +183,57 @@ class ResourceLoader implements LoggerAwareInterface {
         *
         * @param string $filter Name of filter to run
         * @param string $data Text to filter, such as JavaScript or CSS text
-        * @param array $options For back-compat, can also be the boolean value for "cacheReport". Keys:
+        * @param array $options Keys:
         *  - (bool) cache: Whether to allow caching this data. Default: true.
-        *  - (bool) cacheReport: Whether to include the "cache key" report comment. Default: false.
         * @return string Filtered data, or a comment containing an error message
         */
-       public function filter( $filter, $data, $options = array() ) {
-               // Back-compat
-               if ( is_bool( $options ) ) {
-                       $options = array( 'cacheReport' => $options );
-               }
-               // Defaults
-               $options += array( 'cache' => true, 'cacheReport' => false );
-               $stats = RequestContext::getMain()->getStats();
-
-               // Don't filter empty content
-               if ( trim( $data ) === '' ) {
+       public static function filter( $filter, $data, Array $options = array() ) {
+               if ( strpos( $data, ResourceLoader::FILTER_NOMIN ) !== false ) {
                        return $data;
                }
 
-               if ( !in_array( $filter, array( 'minify-js', 'minify-css' ) ) ) {
-                       $this->logger->warning( 'Invalid filter {filter}', array(
-                               'filter' => $filter
-                       ) );
-                       return $data;
+               if ( isset( $options['cache'] ) && $options['cache'] === false ) {
+                       return self::applyFilter( $filter, $data );
                }
 
-               if ( !$options['cache'] ) {
-                       $result = self::applyFilter( $filter, $data, $this->config );
+               $stats = RequestContext::getMain()->getStats();
+               $cache = ObjectCache::newAccelerator( CACHE_ANYTHING );
+
+               $key = wfGlobalCacheKey(
+                       'resourceloader',
+                       'filter',
+                       $filter,
+                       self::$filterCacheVersion, md5( $data )
+               );
+
+               $result = $cache->get( $key );
+               if ( $result === false ) {
+                       $stats->increment( "resourceloader_cache.$filter.miss" );
+                       $result = self::applyFilter( $filter, $data );
+                       $cache->set( $key, $result, 24 * 3600 );
                } else {
-                       $key = wfGlobalCacheKey( 'resourceloader', 'filter', $filter, self::$filterCacheVersion, md5( $data ) );
-                       $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING );
-                       $cacheEntry = $cache->get( $key );
-                       if ( is_string( $cacheEntry ) ) {
-                               $stats->increment( "resourceloader_cache.$filter.hit" );
-                               return $cacheEntry;
-                       }
-                       $result = '';
-                       try {
-                               $statStart = microtime( true );
-                               $result = self::applyFilter( $filter, $data, $this->config );
-                               $statTiming = microtime( true ) - $statStart;
-                               $stats->increment( "resourceloader_cache.$filter.miss" );
-                               $stats->timing( "resourceloader_cache.$filter.timing", 1000 * $statTiming );
-                               if ( $options['cacheReport'] ) {
-                                       $result .= "\n/* cache key: $key */";
-                               }
-                               // Set a TTL since HHVM's APC doesn't have any limitation or eviction logic.
-                               $cache->set( $key, $result, 24 * 3600 );
-                       } catch ( Exception $e ) {
-                               MWExceptionHandler::logException( $e );
-                               $this->logger->warning( 'Minification failed: {exception}', array(
-                                       'exception' => $e
-                               ) );
-                               $this->errors[] = self::formatExceptionNoComment( $e );
-                       }
+                       $stats->increment( "resourceloader_cache.$filter.hit" );
+               }
+               if ( $result === null ) {
+                       // Cached failure
+                       $result = $data;
                }
 
                return $result;
        }
 
-       private static function applyFilter( $filter, $data, Config $config ) {
-               switch ( $filter ) {
-                       case 'minify-js':
-                               return JavaScriptMinifier::minify( $data,
-                                       $config->get( 'ResourceLoaderMinifierStatementsOnOwnLine' ),
-                                       $config->get( 'ResourceLoaderMinifierMaxLineLength' )
-                               );
-                       case 'minify-css':
-                               return CSSMin::minify( $data );
+       private static function applyFilter( $filter, $data ) {
+               $data = trim( $data );
+               if ( $data ) {
+                       try {
+                               $data = ( $filter === 'minify-css' )
+                                       ? CSSMin::minify( $data )
+                                       : JavaScriptMinifier::minify( $data );
+                       } catch ( Exception $e ) {
+                               MWExceptionHandler::logException( $e );
+                               return null;
+                       }
                }
-
                return $data;
        }
 
@@ -747,7 +731,7 @@ class ResourceLoader implements LoggerAwareInterface {
 
                if ( $context->getImageObj() && $this->errors ) {
                        // We can't show both the error messages and the response when it's an image.
-                       $response = implode( "\n\n",  $this->errors );
+                       $response = implode( "\n\n", $this->errors );
                } elseif ( $this->errors ) {
                        $errorText = implode( "\n\n", $this->errors );
                        $errorResponse = self::makeComment( $errorText );
@@ -941,18 +925,18 @@ class ResourceLoader implements LoggerAwareInterface {
                global $wgShowExceptionDetails;
 
                if ( !$wgShowExceptionDetails ) {
-                       return 'Internal error';
+                       return MWExceptionHandler::getPublicLogMessage( $e );
                }
 
-               return $e->__toString();
+               return MWExceptionHandler::getLogMessage( $e );
        }
 
        /**
         * Generate code for a response.
         *
         * @param ResourceLoaderContext $context Context in which to generate a response
-        * @param array $modules List of module objects keyed by module name
-        * @param array $missing List of requested module names that are unregistered (optional)
+        * @param ResourceLoaderModule[] $modules List of module objects keyed by module name
+        * @param string[] $missing List of requested module names that are unregistered (optional)
         * @return string Response data
         */
        public function makeModuleResponse( ResourceLoaderContext $context,
@@ -998,9 +982,13 @@ MESSAGE;
 
                // Generate output
                $isRaw = false;
+
+               $filter = $context->getOnly() === 'styles' ? 'minify-css' : 'minify-js';
+
                foreach ( $modules as $name => $module ) {
                        try {
                                $content = $module->getModuleContent( $context );
+                               $strContent = '';
 
                                // Append output
                                switch ( $context->getOnly() ) {
@@ -1008,10 +996,10 @@ MESSAGE;
                                                $scripts = $content['scripts'];
                                                if ( is_string( $scripts ) ) {
                                                        // Load scripts raw...
-                                                       $out .= $scripts;
+                                                       $strContent = $scripts;
                                                } elseif ( is_array( $scripts ) ) {
                                                        // ...except when $scripts is an array of URLs
-                                                       $out .= self::makeLoaderImplementScript( $name, $scripts, array(), array(), array() );
+                                                       $strContent = self::makeLoaderImplementScript( $name, $scripts, array(), array(), array() );
                                                }
                                                break;
                                        case 'styles':
@@ -1019,10 +1007,10 @@ MESSAGE;
                                                // We no longer seperate into media, they are all combined now with
                                                // custom media type groups into @media .. {} sections as part of the css string.
                                                // Module returns either an empty array or a numerical array with css strings.
-                                               $out .= isset( $styles['css'] ) ? implode( '', $styles['css'] ) : '';
+                                               $strContent = isset( $styles['css'] ) ? implode( '', $styles['css'] ) : '';
                                                break;
                                        default:
-                                               $out .= self::makeLoaderImplementScript(
+                                               $strContent = self::makeLoaderImplementScript(
                                                        $name,
                                                        isset( $content['scripts'] ) ? $content['scripts'] : '',
                                                        isset( $content['styles'] ) ? $content['styles'] : array(),
@@ -1031,6 +1019,13 @@ MESSAGE;
                                                );
                                                break;
                                }
+
+                               if ( !$context->getDebug() ) {
+                                       $strContent = self::filter( $filter, $strContent );
+                               }
+
+                               $out .= $strContent;
+
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
                                $this->logger->warning( 'Generating module package failed: {exception}', array(
@@ -1057,7 +1052,11 @@ MESSAGE;
 
                        // Set the state of modules we didn't respond to with mw.loader.implement
                        if ( count( $states ) ) {
-                               $out .= self::makeLoaderStateScript( $states );
+                               $stateScript = self::makeLoaderStateScript( $states );
+                               if ( !$context->getDebug() ) {
+                                       $stateScript = self::filter( 'minify-js', $stateScript );
+                               }
+                               $out .= $stateScript;
                        }
                } else {
                        if ( count( $states ) ) {
@@ -1066,22 +1065,6 @@ MESSAGE;
                        }
                }
 
-               $enableFilterCache = true;
-               if ( count( $modules ) === 1 && reset( $modules ) instanceof ResourceLoaderUserTokensModule ) {
-                       // If we're building the embedded user.tokens, don't cache (T84960)
-                       $enableFilterCache = false;
-               }
-
-               if ( !$context->getDebug() ) {
-                       if ( $context->getOnly() === 'styles' ) {
-                               $out = $this->filter( 'minify-css', $out );
-                       } else {
-                               $out = $this->filter( 'minify-js', $out, array(
-                                       'cache' => $enableFilterCache
-                               ) );
-                       }
-               }
-
                return $out;
        }
 
@@ -1112,8 +1095,7 @@ MESSAGE;
                                // Minify manually because the general makeModuleResponse() minification won't be
                                // effective here due to the script being a string instead of a function. (T107377)
                                if ( !ResourceLoader::inDebugMode() ) {
-                                       $scripts = self::applyFilter( 'minify-js', $scripts,
-                                               ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+                                       $scripts = self::filter( 'minify-js', $scripts );
                                }
                        } else {
                                $scripts = new XmlJsCode( "function ( $, jQuery ) {\n{$scripts}\n}" );
@@ -1241,7 +1223,7 @@ MESSAGE;
        }
 
        private static function isEmptyObject( stdClass $obj ) {
-               foreach ( $obj as $key => &$value ) {
+               foreach ( $obj as $key => $value ) {
                        return false;
                }
                return true;
@@ -1380,7 +1362,8 @@ MESSAGE;
         * @return string
         */
        public static function makeLoaderConditionalScript( $script ) {
-               return "window.RLQ = window.RLQ || []; window.RLQ.push( function () {\n" . trim( $script ) . "\n} );";
+               return "window.RLQ = window.RLQ || []; window.RLQ.push( function () {\n" .
+                       trim( $script ) . "\n} );";
        }
 
        /**
@@ -1409,13 +1392,11 @@ MESSAGE;
         * @return string
         */
        public static function makeConfigSetScript( array $configuration ) {
-               if ( ResourceLoader::inDebugMode() ) {
-                       return Xml::encodeJsCall( 'mw.config.set', array( $configuration ), true );
-               }
-
-               $config = RequestContext::getMain()->getConfig();
-               $js = Xml::encodeJsCall( 'mw.config.set', array( $configuration ), false );
-               return self::applyFilter( 'minify-js', $js, $config );
+               return Xml::encodeJsCall(
+                       'mw.config.set',
+                       array( $configuration ),
+                       ResourceLoader::inDebugMode()
+               ) . ResourceLoader::FILTER_NOMIN;
        }
 
        /**
@@ -1599,18 +1580,21 @@ MESSAGE;
         * @return bool Whether $moduleName is a valid module name
         */
        public static function isValidModuleName( $moduleName ) {
-               return !preg_match( '/[|,!]/', $moduleName ) && strlen( $moduleName ) <= 255;
+               return strcspn( $moduleName, '!,|', 0, 255 ) === strlen( $moduleName );
        }
 
        /**
         * Returns LESS compiler set up for use with MediaWiki
         *
+        * @since 1.22
+        * @since 1.26 added $extraVars parameter
         * @param Config $config
+        * @param array $extraVars Associative array of extra (i.e., other than the
+        *   globally-configured ones) that should be used for compilation.
         * @throws MWException
-        * @since 1.22
         * @return Less_Parser
         */
-       public static function getLessCompiler( Config $config ) {
+       public static function getLessCompiler( Config $config, $extraVars = array() ) {
                // When called from the installer, it is possible that a required PHP extension
                // is missing (at least for now; see bug 47564). If this is the case, throw an
                // exception (caught by the installer) to prevent a fatal error later on.
@@ -1619,7 +1603,7 @@ MESSAGE;
                }
 
                $parser = new Less_Parser;
-               $parser->ModifyVars( self::getLessVars( $config ) );
+               $parser->ModifyVars( array_merge( self::getLessVars( $config ), $extraVars ) );
                $parser->SetImportDirs( array_fill_keys( $config->get( 'ResourceLoaderLESSImportPaths' ), '' ) );
                $parser->SetOption( 'relativeUrls', false );
                $parser->SetCacheDir( $config->get( 'CacheDirectory' ) ?: wfTempDir() );
@@ -1638,8 +1622,6 @@ MESSAGE;
                if ( !self::$lessVars ) {
                        $lessVars = $config->get( 'ResourceLoaderLESSVars' );
                        Hooks::run( 'ResourceLoaderGetLessVars', array( &$lessVars ) );
-                       // Sort by key to ensure consistent hashing for cache lookups.
-                       ksort( $lessVars );
                        self::$lessVars = $lessVars;
                }
                return self::$lessVars;
index da729fd..fca7961 100644 (file)
  * @since 1.24
  */
 class ResourceLoaderEditToolbarModule extends ResourceLoaderFileModule {
-       /**
-        * Serialize a string (escape and quote) for use as a CSS string value.
-        * http://www.w3.org/TR/2013/WD-cssom-20131205/#serialize-a-string
-        *
-        * @param string $value
-        * @return string
-        * @throws Exception
-        */
-       private static function cssSerializeString( $value ) {
-               if ( strstr( $value, "\0" ) ) {
-                       throw new Exception( "Invalid character in CSS string" );
-               }
-               $value = strtr( $value, array( '\\' => '\\\\', '"' => '\\"' ) );
-               $value = preg_replace_callback( '/[\x01-\x1f\x7f-\x9f]/', function ( $match ) {
-                       return '\\' . base_convert( ord( $match[0] ), 10, 16 ) . ' ';
-               }, $value );
-               return '"' . $value . '"';
-       }
-
        /**
         * Get language-specific LESS variables for this module.
         *
+        * @since 1.26
+        * @param ResourceLoaderContext $context
         * @return array
         */
-       private function getLessVars( ResourceLoaderContext $context ) {
+       protected function getLessVars( ResourceLoaderContext $context ) {
+               $vars = parent::getLessVars( $context );
                $language = Language::factory( $context->getLanguage() );
-
-               // This is very conveniently formatted and we can pass it right through
-               $vars = $language->getImageFiles();
-
-               // less.php tries to be helpful and parse our variables as LESS source code
-               foreach ( $vars as $key => &$value ) {
-                       $value = self::cssSerializeString( $value );
+               foreach ( $language->getImageFiles() as $key => $value ) {
+                       $vars[ $key ] = CSSMin::serializeStringValue( $value );
                }
-
                return $vars;
        }
-
-       /**
-        * @return bool
-        */
-       public function enableModuleContentVersion() {
-               return true;
-       }
-
-       /**
-        * Get a LESS compiler instance for this module.
-        *
-        * Set our variables in it.
-        *
-        * @throws MWException
-        * @param ResourceLoaderContext $context
-        * @return Less_Parser
-        */
-       protected function getLessCompiler( ResourceLoaderContext $context = null ) {
-               $parser = parent::getLessCompiler();
-               $parser->ModifyVars( $this->getLessVars( $context ) );
-               return $parser;
-       }
 }
index 7fbc1cb..a637b93 100644 (file)
@@ -416,22 +416,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $context
                );
                // Collect referenced files
-               $this->localFileRefs = array_unique( $this->localFileRefs );
-               // If the list has been modified since last time we cached it, update the cache
-               try {
-                       if ( $this->localFileRefs !== $this->getFileDependencies( $context->getSkin() ) ) {
-                               $dbw = wfGetDB( DB_MASTER );
-                               $dbw->replace( 'module_deps',
-                                       array( array( 'md_module', 'md_skin' ) ), array(
-                                               'md_module' => $this->getName(),
-                                               'md_skin' => $context->getSkin(),
-                                               'md_deps' => FormatJson::encode( $this->localFileRefs ),
-                                       )
-                               );
-                       }
-               } catch ( Exception $e ) {
-                       wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
-               }
+               $this->saveFileDependencies( $context, $this->localFileRefs );
+
                return $styles;
        }
 
@@ -574,7 +560,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                }
                $files = array_map( array( $this, 'getLocalPath' ), $files );
                // File deps need to be treated separately because they're already prefixed
-               $files = array_merge( $files, $this->getFileDependencies( $context->getSkin() ) );
+               $files = array_merge( $files, $this->getFileDependencies( $context ) );
                // Filter out any duplicates from getFileDependencies() and others.
                // Most commonly introduced by compileLessFile(), which always includes the
                // entry point Less file we already know about.
@@ -867,13 +853,21 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param array $styles List of media type/list of file paths pairs, to read, remap and
         * concetenate
         * @param bool $flip
-        * @param ResourceLoaderContext $context (optional)
+        * @param ResourceLoaderContext $context
         *
         * @throws MWException
         * @return array List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
+        *
+        * @since 1.26 Calling this method without a ResourceLoaderContext instance
+        *   is deprecated.
         */
        public function readStyleFiles( array $styles, $flip, $context = null ) {
+               if ( $context === null ) {
+                       wfDeprecated( __METHOD__ . ' without a ResourceLoader context', '1.26' );
+                       $context = ResourceLoaderContext::newDummyContext();
+               }
+
                if ( empty( $styles ) ) {
                        return array();
                }
@@ -895,12 +889,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param string $path File path of style file to read
         * @param bool $flip
-        * @param ResourceLoaderContext $context (optional)
+        * @param ResourceLoaderContext $context
         *
         * @return string CSS data in script file
         * @throws MWException If the file doesn't exist
         */
-       protected function readStyleFile( $path, $flip, $context = null ) {
+       protected function readStyleFile( $path, $flip, $context ) {
                $localPath = $this->getLocalPath( $path );
                $remotePath = $this->getRemotePath( $path );
                if ( !file_exists( $localPath ) ) {
@@ -910,8 +904,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                }
 
                if ( $this->getStyleSheetLang( $localPath ) === 'less' ) {
-                       $compiler = $this->getLessCompiler( $context );
-                       $style = $this->compileLessFile( $localPath, $compiler );
+                       $style = $this->compileLessFile( $localPath, $context );
                        $this->hasGeneratedStyles = true;
                } else {
                        $style = file_get_contents( $localPath );
@@ -960,32 +953,50 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * Keeps track of all used files and adds them to localFileRefs.
         *
         * @since 1.22
+        * @since 1.26 Added $context paramter.
         * @throws Exception If less.php encounters a parse error
         * @param string $fileName File path of LESS source
-        * @param Less_Parser $parser Compiler to use, if not default
+        * @param ResourceLoaderContext $context Context in which to generate script
         * @return string CSS source
         */
-       protected function compileLessFile( $fileName, $compiler = null ) {
-               if ( !$compiler ) {
-                       $compiler = $this->getLessCompiler();
+       protected function compileLessFile( $fileName, ResourceLoaderContext $context ) {
+               static $cache;
+
+               if ( !$cache ) {
+                       $cache = ObjectCache::newAccelerator( CACHE_ANYTHING );
                }
-               $result = $compiler->parseFile( $fileName )->getCss();
-               $this->localFileRefs += array_keys( $compiler->AllParsedFiles() );
-               return $result;
-       }
 
-       /**
-        * Get a LESS compiler instance for this module in given context.
-        *
-        * Just calls ResourceLoader::getLessCompiler() by default to get a global compiler.
-        *
-        * @param ResourceLoaderContext $context
-        * @throws MWException
-        * @since 1.24
-        * @return Less_Parser
-        */
-       protected function getLessCompiler( ResourceLoaderContext $context = null ) {
-               return ResourceLoader::getLessCompiler( $this->getConfig() );
+               // Construct a cache key from the LESS file name and a hash digest
+               // of the LESS variables used for compilation.
+               $vars = $this->getLessVars( $context );
+               ksort( $vars );
+               $varsHash = hash( 'md4', serialize( $vars ) );
+               $cacheKey = wfGlobalCacheKey( 'LESS', $fileName, $varsHash );
+               $cachedCompile = $cache->get( $cacheKey );
+
+               // If we got a cached value, we have to validate it by getting a
+               // checksum of all the files that were loaded by the parser and
+               // ensuring it matches the cached entry's.
+               if ( isset( $cachedCompile['hash'] ) ) {
+                       $contentHash = FileContentsHasher::getFileContentsHash( $cachedCompile['files'] );
+                       if ( $contentHash === $cachedCompile['hash'] ) {
+                               $this->localFileRefs = array_merge( $this->localFileRefs, $cachedCompile['files'] );
+                               return $cachedCompile['css'];
+                       }
+               }
+
+               $compiler = ResourceLoader::getLessCompiler( $this->getConfig(), $vars );
+               $css = $compiler->parseFile( $fileName )->getCss();
+               $files = $compiler->AllParsedFiles();
+               $this->localFileRefs = array_merge( $this->localFileRefs, $files );
+
+               $cache->set( $cacheKey, array(
+                       'css'   => $css,
+                       'files' => $files,
+                       'hash'  => FileContentsHasher::getFileContentsHash( $files ),
+               ), 60 * 60 * 24 );  // 86400 seconds, or 24 hours.
+
+               return $css;
        }
 
        /**
index 2338c90..9d5fe38 100644 (file)
@@ -315,21 +315,23 @@ class ResourceLoaderImage {
         * @return string|bool PNG image data, or false on failure
         */
        protected function rasterize( $svg ) {
-               // This code should be factored out to a separate method on SvgHandler, or perhaps a separate
-               // class, with a separate set of configuration settings.
-               //
-               // This is a distinct use case from regular SVG rasterization:
-               // * We can skip many sanity and security checks (as the images come from a trusted source,
-               //   rather than from the user).
-               // * We need to provide extra options to some converters to achieve acceptable quality for very
-               //   small images, which might cause performance issues in the general case.
-               // * We want to directly pass image data to the converter, rather than a file path.
-               //
-               // See https://phabricator.wikimedia.org/T76473#801446 for examples of what happens with the
-               // default settings.
-               //
-               // For now, we special-case rsvg (used in WMF production) and do a messy workaround for other
-               // converters.
+               /**
+                * This code should be factored out to a separate method on SvgHandler, or perhaps a separate
+                * class, with a separate set of configuration settings.
+                *
+                * This is a distinct use case from regular SVG rasterization:
+                * * We can skip many sanity and security checks (as the images come from a trusted source,
+                *   rather than from the user).
+                * * We need to provide extra options to some converters to achieve acceptable quality for very
+                *   small images, which might cause performance issues in the general case.
+                * * We want to directly pass image data to the converter, rather than a file path.
+                *
+                * See https://phabricator.wikimedia.org/T76473#801446 for examples of what happens with the
+                * default settings.
+                *
+                * For now, we special-case rsvg (used in WMF production) and do a messy workaround for other
+                * converters.
+                */
 
                global $wgSVGConverter, $wgSVGConverterPath;
 
index 1d3ffb5..4ddfe55 100644 (file)
@@ -374,44 +374,112 @@ abstract class ResourceLoaderModule {
 
        /**
         * Get the files this module depends on indirectly for a given skin.
-        * Currently these are only image files referenced by the module's CSS.
         *
-        * @param string $skin Skin name
+        * These are only image files referenced by the module's stylesheet.
+        *
+        * @param ResourceLoaderContext $context
         * @return array List of files
         */
-       public function getFileDependencies( $skin ) {
+       protected function getFileDependencies( ResourceLoaderContext $context ) {
+               $vary = $context->getSkin() . '|' . $context->getLanguage();
+
                // Try in-object cache first
-               if ( isset( $this->fileDeps[$skin] ) ) {
-                       return $this->fileDeps[$skin];
+               if ( !isset( $this->fileDeps[$vary] ) ) {
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $deps = $dbr->selectField( 'module_deps',
+                               'md_deps',
+                               array(
+                                       'md_module' => $this->getName(),
+                                       'md_skin' => $vary,
+                               ),
+                               __METHOD__
+                       );
+
+                       if ( !is_null( $deps ) ) {
+                               $this->fileDeps[$vary] = self::expandRelativePaths(
+                                       (array)FormatJson::decode( $deps, true )
+                               );
+                       } else {
+                               $this->fileDeps[$vary] = array();
+                       }
                }
+               return $this->fileDeps[$vary];
+       }
 
-               $dbr = wfGetDB( DB_SLAVE );
-               $deps = $dbr->selectField( 'module_deps',
-                       'md_deps',
-                       array(
-                               'md_module' => $this->getName(),
-                               'md_skin' => $skin,
-                       ),
-                       __METHOD__
-               );
+       /**
+        * Set in-object cache for file dependencies.
+        *
+        * This is used to retrieve data in batches. See ResourceLoader::preloadModuleInfo().
+        * To save the data, use saveFileDependencies().
+        *
+        * @param string $skin Skin name
+        * @param array $deps Array of file names
+        */
+       public function setFileDependencies( ResourceLoaderContext $context, $files ) {
+               $vary = $context->getSkin() . '|' . $context->getLanguage();
+               $this->fileDeps[$vary] = $files;
+       }
 
-               if ( !is_null( $deps ) ) {
-                       $this->fileDeps[$skin] = (array)FormatJson::decode( $deps, true );
-               } else {
-                       $this->fileDeps[$skin] = array();
+       /**
+        * Set the files this module depends on indirectly for a given skin.
+        *
+        * @since 1.26
+        * @param ResourceLoaderContext $context
+        * @param array $localFileRefs List of files
+        */
+       protected function saveFileDependencies( ResourceLoaderContext $context, $localFileRefs ) {
+               // Normalise array
+               $localFileRefs = array_values( array_unique( $localFileRefs ) );
+               sort( $localFileRefs );
+
+               try {
+                       // If the list has been modified since last time we cached it, update the cache
+                       if ( $localFileRefs !== $this->getFileDependencies( $context ) ) {
+                               $vary = $context->getSkin() . '|' . $context->getLanguage();
+                               $dbw = wfGetDB( DB_MASTER );
+                               $dbw->replace( 'module_deps',
+                                       array( array( 'md_module', 'md_skin' ) ), array(
+                                               'md_module' => $this->getName(),
+                                               'md_skin' => $vary,
+                                               // Use relative paths to avoid ghost entries when $IP changes (T111481)
+                                               'md_deps' => FormatJson::encode( self::getRelativePaths( $localFileRefs ) ),
+                                       )
+                               );
+                       }
+               } catch ( Exception $e ) {
+                       wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
                }
+       }
 
-               return $this->fileDeps[$skin];
+       /**
+        * Make file paths relative to MediaWiki directory.
+        *
+        * This is used to make file paths safe for storing in a database without the paths
+        * becoming stale or incorrect when MediaWiki is moved or upgraded (T111481).
+        *
+        * @since 1.26
+        * @param array $filePaths
+        * @return array
+        */
+       public static function getRelativePaths( Array $filePaths ) {
+               global $IP;
+               return array_map( function ( $path ) use ( $IP ) {
+                       return RelPath\getRelativePath( $path, $IP );
+               }, $filePaths );
        }
 
        /**
-        * Set preloaded file dependency information. Used so we can load this
-        * information for all modules at once.
-        * @param string $skin Skin name
-        * @param array $deps Array of file names
+        * Expand directories relative to $IP.
+        *
+        * @since 1.26
+        * @param array $filePaths
+        * @return array
         */
-       public function setFileDependencies( $skin, $deps ) {
-               $this->fileDeps[$skin] = $deps;
+       public static function expandRelativePaths( Array $filePaths ) {
+               global $IP;
+               return array_map( function ( $path ) use ( $IP ) {
+                       return RelPath\joinPath( $IP, $path );
+               }, $filePaths );
        }
 
        /**
@@ -445,8 +513,10 @@ abstract class ResourceLoaderModule {
        }
 
        /**
-        * Set a preloaded message blob last modification timestamp. Used so we
-        * can load this information for all modules at once.
+        * Set in-object cache for message blob time.
+        *
+        * This is used to retrieve data in batches. See ResourceLoader::preloadModuleInfo().
+        *
         * @param string $lang Language code
         * @param int $mtime UNIX timestamp
         */
@@ -454,6 +524,17 @@ abstract class ResourceLoaderModule {
                $this->msgBlobMtime[$lang] = $mtime;
        }
 
+       /**
+        * Get module-specific LESS variables, if any.
+        *
+        * @since 1.26
+        * @param ResourceLoaderContext $context
+        * @return array Module-specific LESS variables.
+        */
+       protected function getLessVars( ResourceLoaderContext $context ) {
+               return array();
+       }
+
        /**
         * Get an array of this module's resources. Ready for serving to the web.
         *
@@ -538,11 +619,11 @@ abstract class ResourceLoaderModule {
                                                                foreach ( $style as $cssText ) {
                                                                        if ( is_string( $cssText ) ) {
                                                                                $stylePairs[$media][] =
-                                                                                       $rl->filter( 'minify-css', $cssText );
+                                                                                       ResourceLoader::filter( 'minify-css', $cssText );
                                                                        }
                                                                }
                                                        } elseif ( is_string( $style ) ) {
-                                                               $stylePairs[$media] = $rl->filter( 'minify-css', $style );
+                                                               $stylePairs[$media] = ResourceLoader::filter( 'minify-css', $style );
                                                        }
                                                }
                                        }
@@ -857,35 +938,6 @@ abstract class ResourceLoaderModule {
         * @return string Hash
         */
        protected static function safeFileHash( $filePath ) {
-               static $cache;
-
-               if ( !$cache ) {
-                       $cache = ObjectCache::newAccelerator( CACHE_NONE );
-               }
-
-               MediaWiki\suppressWarnings();
-               $mtime = filemtime( $filePath );
-               MediaWiki\restoreWarnings();
-               if ( !$mtime ) {
-                       return '';
-               }
-
-               $cacheKey = wfGlobalCacheKey( 'resourceloader', __METHOD__, $filePath );
-               $cachedHash = $cache->get( $cacheKey );
-               if ( isset( $cachedHash['mtime'] ) && $cachedHash['mtime'] === $mtime ) {
-                       return $cachedHash['hash'];
-               }
-
-               MediaWiki\suppressWarnings();
-               $contents = file_get_contents( $filePath );
-               MediaWiki\restoreWarnings();
-               if ( !$contents ) {
-                       return '';
-               }
-
-               $hash = hash( 'md4', $contents );
-               $cache->set( $cacheKey, array( 'mtime' => $mtime, 'hash' => $hash ), 60 * 60 * 24 );
-
-               return $hash;
+               return FileContentsHasher::getFileContentsHash( $filePath );
        }
 }
index c704c1a..1857d23 100644 (file)
@@ -102,6 +102,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgResourceLoaderStorageVersion' => $conf->get( 'ResourceLoaderStorageVersion' ),
                        'wgResourceLoaderStorageEnabled' => $conf->get( 'ResourceLoaderStorageEnabled' ),
                        'wgResourceLoaderLegacyModules' => self::getLegacyModules(),
+                       'wgRemoteUploadTarget' => $conf->get( 'RemoteUploadTarget' ),
                );
 
                Hooks::run( 'ResourceLoaderGetConfigVars', array( &$vars ) );
@@ -220,13 +221,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
                        $skipFunction = $module->getSkipFunction();
                        if ( $skipFunction !== null && !ResourceLoader::inDebugMode() ) {
-                               $skipFunction = $resourceLoader->filter( 'minify-js',
-                                       $skipFunction,
-                                       // There will potentially be lots of these little strings in the registrations
-                                       // manifest, we don't want to blow up the startup module with
-                                       // "/* cache key: ... */" all over it.
-                                       /* cacheReport = */ false
-                               );
+                               $skipFunction = ResourceLoader::filter( 'minify-js', $skipFunction );
                        }
 
                        $registryData[$name] = array(
@@ -356,7 +351,11 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        '$VARS.configuration' => $this->getConfigSettings( $context ),
                        '$VARS.baseModulesUri' => self::getStartupModulesUrl( $context ),
                ) );
-               $pairs['$CODE.registrations()'] = str_replace( "\n", "\n\t", trim( $this->getModuleRegistrations( $context ) ) );
+               $pairs['$CODE.registrations()'] = str_replace(
+                       "\n",
+                       "\n\t",
+                       trim( $this->getModuleRegistrations( $context ) )
+               );
 
                return strtr( $out, $pairs );
        }
index ccd1dfd..28f1b9a 100644 (file)
@@ -51,14 +51,20 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
        }
 
        /**
+        * Generate the JavaScript content of this module.
+        *
+        * Add '@nomin' annotation to prevent the module's contents from getting
+        * cached (T84960).
+        *
         * @param ResourceLoaderContext $context
         * @return string
         */
        public function getScript( ResourceLoaderContext $context ) {
-               return Xml::encodeJsCall( 'mw.user.tokens.set',
+               return Xml::encodeJsCall(
+                       'mw.user.tokens.set',
                        array( $this->contextUserTokens( $context ) ),
                        ResourceLoader::inDebugMode()
-               );
+               ) . ResourceLoader::FILTER_NOMIN;
        }
 
        /**
index 82d0907..5b18b7c 100644 (file)
  */
 class SearchDatabase extends SearchEngine {
        /**
-        * @var DatabaseBase Slave database for reading from for results
+        * @var IDatabase Slave database for reading from for results
         */
        protected $db;
 
        /**
         * Constructor
-        * @param DatabaseBase $db The database to search from
+        * @param IDatabase $db The database to search from
         */
-       public function __construct( DatabaseBase $db = null ) {
+       public function __construct( IDatabase $db = null ) {
                if ( $db ) {
                        $this->db = $db;
                } else {
index 7d5d38f..98c05b5 100644 (file)
@@ -547,7 +547,9 @@ class SearchHighlighter {
                $text = ltrim( $text ) . "\n"; // make sure the preg_match may find the last line
                $text = str_replace( "\n\n", "\n", $text ); // remove empty lines
                preg_match( "/^(.*\n){0,$contextlines}/", $text, $match );
-               $text = htmlspecialchars( substr( trim( $match[0] ), 0, $contextlines * $contextchars ) ); // trim and limit to max number of chars
+
+               // Trim and limit to max number of chars
+               $text = htmlspecialchars( substr( trim( $match[0] ), 0, $contextlines * $contextchars ) );
                return str_replace( "\n", '<br>', $text );
        }
 }
index 246f115..1442671 100644 (file)
@@ -406,7 +406,6 @@ class SearchMySQL extends SearchDatabase {
                // Periods within things like hostnames and IP addresses
                // are also important -- we want a search for "example.com"
                // or "192.168.1.1" to work sanely.
-               //
                // MySQL's search seems to ignore them, so you'd match on
                // "example.wikipedia.com" and "192.168.83.1" as well.
                $out = preg_replace(
index 71e3b63..60c4249 100644 (file)
@@ -65,14 +65,14 @@ class SearchPostgres extends SearchDatabase {
 
                wfDebug( "parseQuery received: $term \n" );
 
-               ## No backslashes allowed
+               # # No backslashes allowed
                $term = preg_replace( '/\\\/', '', $term );
 
-               ## Collapse parens into nearby words:
+               # # Collapse parens into nearby words:
                $term = preg_replace( '/\s*\(\s*/', ' (', $term );
                $term = preg_replace( '/\s*\)\s*/', ') ', $term );
 
-               ## Treat colons as word separators:
+               # # Treat colons as word separators:
                $term = preg_replace( '/:/', ' ', $term );
 
                $searchstring = '';
@@ -97,22 +97,22 @@ class SearchPostgres extends SearchDatabase {
                        }
                }
 
-               ## Strip out leading junk
+               # # Strip out leading junk
                $searchstring = preg_replace( '/^[\s\&\|]+/', '', $searchstring );
 
-               ## Remove any doubled-up operators
+               # # Remove any doubled-up operators
                $searchstring = preg_replace( '/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring );
 
-               ## Remove any non-spaced operators (e.g. "Zounds!")
+               # # Remove any non-spaced operators (e.g. "Zounds!")
                $searchstring = preg_replace( '/([^ ])[\!\&\|]/', "$1", $searchstring );
 
-               ## Remove any trailing whitespace or operators
+               # # Remove any trailing whitespace or operators
                $searchstring = preg_replace( '/[\s\!\&\|]+$/', '', $searchstring );
 
-               ## Remove unnecessary quotes around everything
+               # # Remove unnecessary quotes around everything
                $searchstring = preg_replace( '/^[\'"](.*)[\'"]$/', "$1", $searchstring );
 
-               ## Quote the whole thing
+               # # Quote the whole thing
                $searchstring = $this->db->addQuotes( $searchstring );
 
                wfDebug( "parseQuery returned: $searchstring \n" );
@@ -132,18 +132,18 @@ class SearchPostgres extends SearchDatabase {
                # Get the SQL fragment for the given term
                $searchstring = $this->parseQuery( $term );
 
-               ## We need a separate query here so gin does not complain about empty searches
+               # # We need a separate query here so gin does not complain about empty searches
                $sql = "SELECT to_tsquery($searchstring)";
                $res = $this->db->query( $sql );
                if ( !$res ) {
-                       ## TODO: Better output (example to catch: one 'two)
+                       # # TODO: Better output (example to catch: one 'two)
                        die( "Sorry, that was not a valid search string. Please go back and try again" );
                }
                $top = $res->fetchRow();
                $top = $top[0];
 
                $this->searchTerms = array();
-               if ( $top === "" ) { ## e.g. if only stopwords are used XXX return something better
+               if ( $top === "" ) { # # e.g. if only stopwords are used XXX return something better
                        $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";
@@ -162,7 +162,7 @@ class SearchPostgres extends SearchDatabase {
                        "AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery($searchstring)";
                }
 
-               ## Namespaces - defaults to 0
+               # # Namespaces - defaults to 0
                if ( !is_null( $this->namespaces ) ) { // null -> search all
                        if ( count( $this->namespaces ) < 1 ) {
                                $query .= ' AND page_namespace = 0';
@@ -181,10 +181,10 @@ class SearchPostgres extends SearchDatabase {
                return $query;
        }
 
-       ## Most of the work of these two functions are done automatically via triggers
+       # # Most of the work of these two functions are done automatically via triggers
 
        function update( $pageid, $title, $text ) {
-               ## We don't want to index older revisions
+               # # We don't want to index older revisions
                $sql = "UPDATE pagecontent SET textvector = NULL WHERE textvector IS NOT NULL and old_id IN " .
                                "(SELECT DISTINCT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
                                " ORDER BY rev_text_id DESC OFFSET 1)";
index d384ae9..765cfc1 100644 (file)
@@ -165,7 +165,7 @@ class SearchResult {
        }
 
        /**
-        * @return Title Title object for the redirect to this page, null if none or not supported
+        * @return Title|null Title object for the redirect to this page, null if none or not supported
         */
        function getRedirectTitle() {
                return null;
@@ -179,7 +179,8 @@ class SearchResult {
        }
 
        /**
-        * @return Title Title object (pagename+fragment) for the section, null if none or not supported
+        * @return Title|null Title object (pagename+fragment) for the section,
+        *  null if none or not supported
         */
        function getSectionTitle() {
                return null;
index 8d18b0e..6178756 100644 (file)
@@ -98,7 +98,7 @@ class SearchResultSet {
        }
 
        /**
-        * @return string Suggested query, null if none
+        * @return string|null Suggested query, null if none
         */
        function getSuggestionQuery() {
                return null;
index 95631f8..029919c 100644 (file)
@@ -113,9 +113,9 @@ class MediaWikiSite extends Site {
                        return $t->getPrefixedText();
                } else {
 
-                       // Make sure the string is normalized into NFC (due to the bug 40017)
+                       // Make sure the string is normalized into NFC (due to T42017)
                        // but do nothing to the whitespaces, that should work appropriately.
-                       // @see https://bugzilla.wikimedia.org/show_bug.cgi?id=40017
+                       // @see https://phabricator.wikimedia.org/T42017
                        $pageName = UtfNormal\Validator::cleanUp( $pageName );
 
                        // Build the args for the specific call
index 169c0d8..294f1db 100644 (file)
@@ -105,8 +105,8 @@ class SiteExporter {
                        }
                }
 
-               //@todo: export <data>
-               //@todo: export <config>
+               // @todo: export <data>
+               // @todo: export <config>
 
                fwrite( $this->sink, "\t" . Xml::closeElement( 'site' ) . "\n" );
        }
index a05bad5..9aefea2 100644 (file)
@@ -183,8 +183,8 @@ class SiteImporter {
                        $site->addLocalId( $idType, $id );
                }
 
-               //@todo: import <data>
-               //@todo: import <config>
+               // @todo: import <data>
+               // @todo: import <config>
 
                return $site;
        }
index 2d9f22d..da883d9 100644 (file)
@@ -319,7 +319,7 @@ class SiteList extends GenericArrayObject {
         * @return array
         */
        protected function getSerializationData() {
-               //NOTE: When changing the structure, either implement unserialize() to handle the
+               // NOTE: When changing the structure, either implement unserialize() to handle the
                //      old structure too, or update SERIAL_VERSION_ID to kill any caches.
                return array_merge(
                        parent::getSerializationData(),
index baf9d95..4d7c03a 100644 (file)
@@ -928,7 +928,7 @@ class SkinTemplate extends Skin {
                                        // section link
                                        if ( $showNewSection ) {
                                                // Adds new section link
-                                               //$content_navigation['actions']['addsection']
+                                               // $content_navigation['actions']['addsection']
                                                $content_navigation['views']['addsection'] = array(
                                                        'class' => ( $isEditing && $section == 'new' ) ? 'selected' : false,
                                                        'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )
@@ -1019,12 +1019,11 @@ class SkinTemplate extends Skin {
                                         * the global versions.
                                         */
                                        $mode = $user->isWatched( $title ) ? 'unwatch' : 'watch';
-                                       $token = WatchAction::getWatchToken( $title, $user, $mode );
                                        $content_navigation['actions'][$mode] = array(
                                                'class' => $onPage && ( $action == 'watch' || $action == 'unwatch' ) ? 'selected' : false,
                                                // uses 'watch' or 'unwatch' message
                                                'text' => $this->msg( $mode )->text(),
-                                               'href' => $title->getLocalURL( array( 'action' => $mode, 'token' => $token ) )
+                                               'href' => $title->getLocalURL( array( 'action' => $mode ) )
                                        );
                                }
                        }
index 42c5980..d22875b 100644 (file)
@@ -169,7 +169,6 @@ abstract class FormSpecialPage extends SpecialPage {
         * Failures here must throw subclasses of ErrorPageError.
         * @param User $user
         * @throws UserBlockedError
-        * @return bool True
         */
        protected function checkExecutePermissions( User $user ) {
                $this->checkPermissions();
@@ -182,8 +181,6 @@ abstract class FormSpecialPage extends SpecialPage {
                if ( $this->requiresWrite() ) {
                        $this->checkReadOnly();
                }
-
-               return true;
        }
 
        /**
index 3c8b742..bfb29ae 100644 (file)
@@ -450,14 +450,13 @@ abstract class QueryPage extends SpecialPage {
                } else {
                        $options['ORDER BY'] = 'qc_value ASC';
                }
-               $res = $dbr->select( 'querycache', array( 'qc_type',
+               return $dbr->select( 'querycache', array( 'qc_type',
                                'namespace' => 'qc_namespace',
                                'title' => 'qc_title',
                                'value' => 'qc_value' ),
                                array( 'qc_type' => $this->getName() ),
                                __METHOD__, $options
                );
-               return $dbr->resultObject( $res );
        }
 
        public function getCachedTimestamp() {
index e794a5d..47b4fc8 100644 (file)
@@ -391,7 +391,7 @@ class SpecialPageFactory {
                                        'closure_expansion' => false,
                                ) );
                        } elseif ( $rec instanceof SpecialPage ) {
-                               $page = $rec; //XXX: we should deep clone here
+                               $page = $rec; // XXX: we should deep clone here
                        } else {
                                $page = null;
                        }
index 762658c..ed1c903 100644 (file)
@@ -445,7 +445,11 @@ class AllMessagesTablePager extends TablePager {
                } elseif ( $field === 'am_title' ) {
                        return array( 'class' => $field );
                } else {
-                       return array( 'lang' => wfBCP47( $this->langcode ), 'dir' => $this->lang->getDir(), 'class' => $field );
+                       return array(
+                               'lang' => wfBCP47( $this->langcode ),
+                               'dir' => $this->lang->getDir(),
+                               'class' => $field
+                       );
                }
        }
 
index 7028fdc..53798c0 100644 (file)
@@ -171,7 +171,7 @@ class SpecialBookSources extends SpecialPage {
                        $content = $rev->getContent();
 
                        if ( $content instanceof TextContent ) {
-                               //XXX: in the future, this could be stored as structured data, defining a list of book sources
+                               // XXX: in the future, this could be stored as structured data, defining a list of book sources
 
                                $text = $content->getNativeData();
                                $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
index 3a13b7e..cea6ceb 100644 (file)
@@ -134,7 +134,7 @@ class CategoryPager extends AlphabeticPager {
        }
 
        function getIndexField() {
-#              return array( 'abc' => 'cat_title', 'count' => 'cat_pages' );
+#              return array( 'abc' => 'cat_title', 'count' => 'cat_pages' );
                return 'cat_title';
        }
 
@@ -145,13 +145,13 @@ class CategoryPager extends AlphabeticPager {
                return $this->mDefaultQuery;
        }
 
-#      protected function getOrderTypeMessages() {
-#              return array( 'abc' => 'special-categories-sort-abc',
-#                      'count' => 'special-categories-sort-count' );
-#      }
+#      protected function getOrderTypeMessages() {
+#              return array( 'abc' => 'special-categories-sort-abc',
+#                      'count' => 'special-categories-sort-count' );
+#      }
 
        protected function getDefaultDirections() {
-#              return array( 'abc' => false, 'count' => true );
+#              return array( 'abc' => false, 'count' => true );
                return false;
        }
 
index cce5da5..b0def59 100644 (file)
@@ -139,7 +139,7 @@ class SpecialChangeContentModel extends FormSpecialPage {
                        throw new RuntimeException( "Form submission was not POSTed" );
                }
 
-               $this->title = Title::newFromText( $data['pagetitle' ] );
+               $this->title = Title::newFromText( $data['pagetitle'] );
                $user = $this->getUser();
                // Check permissions and make sure the user has permission to edit the specific page
                $errors = $this->title->getUserPermissionsErrors( 'editcontentmodel', $user );
index 22df04e..65fa01f 100644 (file)
@@ -92,7 +92,8 @@ class SpecialChangeEmail extends FormSpecialPage {
                        'NewEmail' => array(
                                'type' => 'email',
                                'label-message' => 'changeemail-newemail',
-                               'autofocus' => true
+                               'autofocus' => true,
+                               'help-message' => 'changeemail-newemail-help',
                        ),
                );
 
index 74662ae..64a93a0 100644 (file)
@@ -71,6 +71,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                $this->outputHeader();
                $this->outputSubtitle();
+               $out->addModuleStyles( 'mediawiki.special' );
 
                # B/C: $mode used to be waaay down the parameter list, and the first parameter
                # was $wgUser
@@ -403,7 +404,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         */
        private function cleanupWatchlist() {
                if ( !count( $this->badItems ) ) {
-                       return; //nothing to do
+                       return; // nothing to do
                }
 
                $dbw = wfGetDB( DB_MASTER );
index 92cb8bf..6b0d1ec 100644 (file)
@@ -329,29 +329,33 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                }
 
                if ( $config->get( 'UserEmailUseReplyTo' ) ) {
-                       // Put the generic wiki autogenerated address in the From:
-                       // header and reserve the user for Reply-To.
-                       //
-                       // This is a bit ugly, but will serve to differentiate
-                       // wiki-borne mails from direct mails and protects against
-                       // SPF and bounce problems with some mailers (see below).
+                       /**
+                        * Put the generic wiki autogenerated address in the From:
+                        * header and reserve the user for Reply-To.
+                        *
+                        * This is a bit ugly, but will serve to differentiate
+                        * wiki-borne mails from direct mails and protects against
+                        * SPF and bounce problems with some mailers (see below).
+                        */
                        $mailFrom = new MailAddress( $config->get( 'PasswordSender' ),
                                wfMessage( 'emailsender' )->inContentLanguage()->text() );
                        $replyTo = $from;
                } else {
-                       // Put the sending user's e-mail address in the From: header.
-                       //
-                       // This is clean-looking and convenient, but has issues.
-                       // One is that it doesn't as clearly differentiate the wiki mail
-                       // from "directly" sent mails.
-                       //
-                       // Another is that some mailers (like sSMTP) will use the From
-                       // address as the envelope sender as well. For open sites this
-                       // can cause mails to be flunked for SPF violations (since the
-                       // wiki server isn't an authorized sender for various users'
-                       // domains) as well as creating a privacy issue as bounces
-                       // containing the recipient's e-mail address may get sent to
-                       // the sending user.
+                       /**
+                        * Put the sending user's e-mail address in the From: header.
+                        *
+                        * This is clean-looking and convenient, but has issues.
+                        * One is that it doesn't as clearly differentiate the wiki mail
+                        * from "directly" sent mails.
+                        *
+                        * Another is that some mailers (like sSMTP) will use the From
+                        * address as the envelope sender as well. For open sites this
+                        * can cause mails to be flunked for SPF violations (since the
+                        * wiki server isn't an authorized sender for various users'
+                        * domains) as well as creating a privacy issue as bounces
+                        * containing the recipient's e-mail address may get sent to
+                        * the sending user.
+                        */
                        $mailFrom = $from;
                        $replyTo = null;
                }
index 39c4d77..642ea69 100644 (file)
@@ -385,7 +385,7 @@ class SpecialExport extends SpecialPage {
                        $exporter->allPages();
                } else {
                        foreach ( $pages as $page ) {
-                               #Bug 8824: Only export pages the user can read
+                               # Bug 8824: Only export pages the user can read
                                $title = Title::newFromText( $page );
                                if ( is_null( $title ) ) {
                                        // @todo Perhaps output an <error> tag or something.
index 4cdf6dd..e2bc629 100644 (file)
@@ -42,6 +42,7 @@ class SpecialImport extends SpecialPage {
        private $history = true;
        private $includeTemplates = false;
        private $pageLinkDepth;
+       private $importSources;
 
        /**
         * Constructor
@@ -66,6 +67,9 @@ class SpecialImport extends SpecialPage {
 
                $this->getOutput()->addModules( 'mediawiki.special.import' );
 
+               $this->importSources = $this->getConfig()->get( 'ImportSources' );
+               Hooks::run( 'ImportSources', array( &$this->importSources ) );
+
                $user = $this->getUser();
                if ( !$user->isAllowedAny( 'import', 'importupload' ) ) {
                        throw new PermissionsError( 'import' );
@@ -136,16 +140,17 @@ class SpecialImport extends SpecialPage {
                        }
                        $this->interwiki = $this->fullInterwikiPrefix = $request->getVal( 'interwiki' );
                        // does this interwiki have subprojects?
-                       $importSources = $this->getConfig()->get( 'ImportSources' );
-                       $hasSubprojects = array_key_exists( $this->interwiki, $importSources );
-                       if ( !$hasSubprojects && !in_array( $this->interwiki, $importSources ) ) {
+                       $hasSubprojects = array_key_exists( $this->interwiki, $this->importSources );
+                       if ( !$hasSubprojects && !in_array( $this->interwiki, $this->importSources ) ) {
                                $source = Status::newFatal( "import-invalid-interwiki" );
                        } else {
                                if ( $hasSubprojects ) {
                                        $this->subproject = $request->getVal( 'subproject' );
                                        $this->fullInterwikiPrefix .= ':' . $request->getVal( 'subproject' );
                                }
-                               if ( $hasSubprojects && !in_array( $this->subproject, $importSources[$this->interwiki] ) ) {
+                               if ( $hasSubprojects &&
+                                       !in_array( $this->subproject, $this->importSources[$this->interwiki] )
+                               ) {
                                        $source = Status::newFatal( "import-invalid-interwiki" );
                                } else {
                                        $this->history = $request->getCheck( 'interwikiHistory' );
@@ -306,7 +311,6 @@ class SpecialImport extends SpecialPage {
                $user = $this->getUser();
                $out = $this->getOutput();
                $this->addHelpLink( '//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Import', true );
-               $importSources = $this->getConfig()->get( 'ImportSources' );
 
                if ( $user->isAllowed( 'importupload' ) ) {
                        $mappingSelection = $this->getMappingFormPart( 'upload' );
@@ -356,12 +360,12 @@ class SpecialImport extends SpecialPage {
                                        Xml::closeElement( 'fieldset' )
                        );
                } else {
-                       if ( empty( $importSources ) ) {
+                       if ( empty( $this->importSources ) ) {
                                $out->addWikiMsg( 'importnosources' );
                        }
                }
 
-               if ( $user->isAllowed( 'import' ) && !empty( $importSources ) ) {
+               if ( $user->isAllowed( 'import' ) && !empty( $this->importSources ) ) {
                        # Show input field for import depth only if $wgExportMaxLinkDepth > 0
                        $importDepth = '';
                        if ( $this->getConfig()->get( 'ExportMaxLinkDepth' ) > 0 ) {
@@ -403,7 +407,7 @@ class SpecialImport extends SpecialPage {
                        );
 
                        $needSubprojectField = false;
-                       foreach ( $importSources as $key => $value ) {
+                       foreach ( $this->importSources as $key => $value ) {
                                if ( is_int( $key ) ) {
                                        $key = $value;
                                } elseif ( $value !== $key ) {
@@ -435,7 +439,7 @@ class SpecialImport extends SpecialPage {
                                );
 
                                $subprojectsToAdd = array();
-                               foreach ( $importSources as $key => $value ) {
+                               foreach ( $this->importSources as $key => $value ) {
                                        if ( is_array( $value ) ) {
                                                $subprojectsToAdd = array_merge( $subprojectsToAdd, $value );
                                        }
index 2d79aaf..3ea56c6 100644 (file)
@@ -52,7 +52,7 @@ class SpecialListFiles extends IncludableSpecialPage {
                if ( $this->including() ) {
                        $out->addParserOutputContent( $pager->getBodyOutput() );
                } else {
-                       $out->addHTML( $pager->getForm() );
+                       $pager->getForm();
                        $out->addParserOutputContent( $pager->getFullOutput() );
                }
        }
index 828a93b..382b03f 100644 (file)
@@ -234,7 +234,7 @@ class SpecialListGroupRights extends SpecialPage {
        private function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
                $r = array();
                foreach ( $permissions as $permission => $granted ) {
-                       //show as granted only if it isn't revoked to prevent duplicate display of permissions
+                       // show as granted only if it isn't revoked to prevent duplicate display of permissions
                        if ( $granted && ( !isset( $revoke[$permission] ) || !$revoke[$permission] ) ) {
                                $r[] = $this->msg( 'listgrouprights-right-display',
                                        User::getRightDescription( $permission ),
index 31200c8..274a95a 100644 (file)
@@ -163,7 +163,7 @@ class UsersPager extends AlphabeticPager {
         * @return string
         */
        function formatRow( $row ) {
-               if ( $row->user_id == 0 ) { #Bug 16487
+               if ( $row->user_id == 0 ) { # Bug 16487
                        return '';
                }
 
index 7edf961..ef1fd73 100644 (file)
@@ -61,6 +61,9 @@ class SpecialMergeHistory extends SpecialPage {
        /** @var Title */
        protected $mDestObj;
 
+       /** @var int[] */
+       public $prevId;
+
        public function __construct() {
                parent::__construct( 'MergeHistory', 'mergehistory' );
        }
@@ -94,18 +97,6 @@ class SpecialMergeHistory extends SpecialPage {
                        $this->mTargetObj = null;
                        $this->mDestObj = null;
                }
-               $this->preCacheMessages();
-       }
-
-       /**
-        * As we use the same small set of messages in various methods and that
-        * they are called often, we call them once and save them in $this->message
-        */
-       function preCacheMessages() {
-               // Precache various messages
-               if ( !isset( $this->message ) ) {
-                       $this->message['last'] = $this->msg( 'last' )->escaped();
-               }
        }
 
        public function execute( $par ) {
@@ -283,7 +274,7 @@ class SpecialMergeHistory extends SpecialPage {
                $rev = new Revision( $row );
 
                $stxt = '';
-               $last = $this->message['last'];
+               $last = $this->msg( 'last' )->escaped();
 
                $ts = wfTimestamp( TS_MW, $row->rev_timestamp );
                $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mTimestamp === $ts ) );
@@ -302,11 +293,11 @@ class SpecialMergeHistory extends SpecialPage {
 
                # Last link
                if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-                       $last = $this->message['last'];
+                       $last = $this->msg( 'last' )->escaped();
                } elseif ( isset( $this->prevId[$row->rev_id] ) ) {
                        $last = Linker::linkKnown(
                                $rev->getTitle(),
-                               $this->message['last'],
+                               $this->msg( 'last' )->escaped(),
                                array(),
                                array(
                                        'diff' => $row->rev_id,
@@ -485,10 +476,18 @@ class SpecialMergeHistory extends SpecialPage {
                $logId = $logEntry->insert();
                $logEntry->publish( $logId );
 
-               # @todo message should use redirect=no
-               $this->getOutput()->addWikiText( $this->msg( 'mergehistory-success',
-                       $targetTitle->getPrefixedText(), $destTitle->getPrefixedText() )->numParams(
-                       $count )->text() );
+               $targetLink = Linker::link(
+                       $targetTitle,
+                       $targetTitle->getPrefixedText(),
+                       array(),
+                       array( 'redirect' => 'no' )
+               );
+
+               $this->getOutput()->addWikiMsg( $this->msg( 'mergehistory-done' )
+                       ->rawParams( $targetLink )
+                       ->params( $destTitle->getPrefixedText() )
+                       ->numParams( $count )
+               );
 
                Hooks::run( 'ArticleMergeComplete', array( $targetTitle, $destTitle ) );
 
@@ -501,13 +500,13 @@ class SpecialMergeHistory extends SpecialPage {
 }
 
 class MergeHistoryPager extends ReverseChronologicalPager {
-       /** @var IContextSource */
+       /** @var SpecialMergeHistory */
        public $mForm;
 
        /** @var array */
        public $mConds;
 
-       function __construct( $form, $conds, $source, $dest ) {
+       function __construct( SpecialMergeHistory $form, $conds, Title $source, Title $dest ) {
                $this->mForm = $form;
                $this->mConds = $conds;
                $this->title = $source;
index 8091f1b..589c39f 100644 (file)
@@ -142,8 +142,6 @@ class MovePageForm extends UnlistedSpecialPage {
 
                $this->getSkin()->setRelevantTitle( $this->oldTitle );
 
-               $oldTitleLink = Linker::link( $this->oldTitle );
-
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'move-page', $this->oldTitle->getPrefixedText() ) );
                $out->addModules( 'mediawiki.special.movePage' );
@@ -230,10 +228,6 @@ class MovePageForm extends UnlistedSpecialPage {
                        $hasRedirects = false;
                }
 
-               if ( $considerTalk ) {
-                       $out->addWikiMsg( 'movepagetalktext' );
-               }
-
                if ( count( $err ) ) {
                        $out->addHTML( "<div class='error'>\n" );
                        $action_desc = $this->msg( 'action-move' )->plain();
@@ -302,16 +296,6 @@ class MovePageForm extends UnlistedSpecialPage {
                $out->enableOOUI();
                $fields = array();
 
-               $fields[] = new OOUI\FieldLayout(
-                       new OOUI\LabelWidget( array(
-                               'label' => new OOUI\HtmlSnippet( "<strong>$oldTitleLink</strong>" )
-                       ) ),
-                       array(
-                               'label' => $this->msg( 'movearticle' )->text(),
-                               'align' => 'top',
-                       )
-               );
-
                $fields[] = new OOUI\FieldLayout(
                        new MediaWiki\Widget\ComplexTitleInputWidget( array(
                                'id' => 'wpNewTitle',
@@ -342,6 +326,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                'id' => 'wpReason',
                                'maxLength' => 200,
                                'infusable' => true,
+                               'value' => $this->reason,
                        ) ),
                        array(
                                'label' => $this->msg( 'movereason' )->text(),
@@ -359,7 +344,9 @@ class MovePageForm extends UnlistedSpecialPage {
                                ) ),
                                array(
                                        'label' => $this->msg( 'movetalk' )->text(),
+                                       'help' => new OOUI\HtmlSnippet( $this->msg( 'movepagetalktext' )->parseAsBlock() ),
                                        'align' => 'inline',
+                                       'infusable' => true,
                                )
                        );
                }
@@ -445,8 +432,6 @@ class MovePageForm extends UnlistedSpecialPage {
                }
 
                if ( $confirm ) {
-                       $watchChecked = $user->isLoggedIn() && ( $this->watch || $user->getBoolOption( 'watchmoves' )
-                               || $user->isWatched( $this->oldTitle ) );
                        $fields[] = new OOUI\FieldLayout(
                                new OOUI\CheckboxInputWidget( array(
                                        'name' => 'wpConfirm',
@@ -465,7 +450,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                'name' => $submitVar,
                                'value' => $movepagebtn,
                                'label' => $movepagebtn,
-                               'flags' => array( 'progressive', 'primary' ),
+                               'flags' => array( 'constructive', 'primary' ),
                                'type' => 'submit',
                        ) ),
                        array(
@@ -617,7 +602,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $newText = $nt->getPrefixedText();
 
                if ( $ot->exists() ) {
-                       //NOTE: we assume that if the old title exists, it's because it was re-created as
+                       // NOTE: we assume that if the old title exists, it's because it was re-created as
                        // a redirect to the new title. This is not safe, but what we did before was
                        // even worse: we just determined whether a redirect should have been created,
                        // and reported that it was created if it should have, without any checks.
@@ -644,17 +629,19 @@ class MovePageForm extends UnlistedSpecialPage {
                        $this->moveSubpages = false;
                }
 
-               # Next make a list of id's.  This might be marginally less efficient
-               # 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.
-               # @todo FIXME: A specific error message should be given in this case.
+               /**
+                * Next make a list of id's.  This might be marginally less efficient
+                * 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.
+                * @todo FIXME: A specific error message should be given in this case.
+                */
 
                // @todo FIXME: Use Title::moveSubpages() here
                $dbr = wfGetDB( DB_MASTER );
index 251a8e0..0fa4857 100644 (file)
@@ -315,7 +315,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                        array()
                );
 
-               $query = array( 'redirect' => 'no' );
+               $query = $title->isRedirect() ? array( 'redirect' => 'no' ) : array();
 
                // Linker::linkKnown() uses 'known' and 'noclasses' options.
                // This breaks the colouration for stubs.
@@ -463,7 +463,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        protected function feedItemDesc( $row ) {
                $revision = Revision::newFromId( $row->rev_id );
                if ( $revision ) {
-                       //XXX: include content model/type in feed item?
+                       // XXX: include content model/type in feed item?
                        return '<p>' . htmlspecialchars( $revision->getUserText() ) .
                                $this->msg( 'colon-separator' )->inContentLanguage()->escaped() .
                                htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
index 8cad616..f1eb8c2 100644 (file)
@@ -58,7 +58,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        throw new ErrorPageError( 'internalerror', 'resetpass_forbidden' );
                }
 
-               return parent::checkExecutePermissions( $user );
+               parent::checkExecutePermissions( $user );
        }
 
        protected function getFormFields() {
@@ -271,7 +271,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        round( $this->getConfig()->get( 'NewPasswordExpiry' ) / 86400 )
                );
 
-               $title = $this->msg( 'passwordreset-emailtitle' );
+               $title = $this->msg( 'passwordreset-emailtitle' )->inLanguage( $userLanguage );
 
                $this->result = $firstUser->sendMail( $title->text(), $this->email->text() );
 
index 5a67d92..d92010a 100644 (file)
@@ -180,7 +180,7 @@ class SpecialPrefixindex extends SpecialAllPages {
                        list( $namespace, $prefixKey, $prefix ) = $prefixList;
                        list( /* $fromNS */, $fromKey, ) = $fromList;
 
-                       ### @todo FIXME: Should complain if $fromNs != $namespace
+                       # ## @todo FIXME: Should complain if $fromNs != $namespace
 
                        $dbr = wfGetDB( DB_SLAVE );
 
@@ -205,7 +205,7 @@ class SpecialPrefixindex extends SpecialAllPages {
                                )
                        );
 
-                       ### @todo FIXME: Side link to previous
+                       # ## @todo FIXME: Side link to previous
 
                        $n = 0;
                        if ( $res->numRows() > 0 ) {
index fd0745f..91e84e4 100644 (file)
@@ -115,6 +115,7 @@ class SpecialSearch extends SpecialPage {
                        return;
                }
 
+               $out->addJsConfigVars( array( 'searchTerm' => $search ) );
                $this->searchEngineType = $request->getVal( 'srbackend' );
 
                if ( $request->getVal( 'fulltext' )
@@ -388,7 +389,7 @@ class SpecialSearch extends SpecialPage {
                        }
                }
 
-               $out->addHTML( '<div class="visualClear"></div>\n' );
+               $out->addHTML( '<div class="visualClear"></div>' );
                if ( $prevnext ) {
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
@@ -415,10 +416,7 @@ class SpecialSearch extends SpecialPage {
                        return false;
                }
 
-               // Generate a random number between 0 and 1. If the
-               // number is less than the desired percentages run it.
-               $rand = rand( 0, getrandmax() ) / getrandmax();
-               return $this->getConfig()->get( 'SearchRunSuggestedQueryPercent' ) > $rand;
+               return $this->getConfig()->get( 'SearchRunSuggestedQuery' );
        }
 
        /**
@@ -436,11 +434,11 @@ class SpecialSearch extends SpecialPage {
                $suggest = Linker::linkKnown(
                        $this->getPageTitle(),
                        $textMatches->getSuggestionSnippet() ?: null,
-                       array(),
+                       array( 'id' => 'mw-search-DYM-suggestion' ),
                        $stParams
                );
 
-               # html of did you mean... search suggestion link
+               # HTML of did you mean... search suggestion link
                return Html::rawElement(
                        'div',
                        array( 'class' => 'searchdidyoumean' ),
@@ -470,7 +468,7 @@ class SpecialSearch extends SpecialPage {
                $rewritten = Linker::linkKnown(
                        $this->getPageTitle(),
                        $textMatches->getQueryAfterRewriteSnippet() ?: null,
-                       array(),
+                       array( 'id' => 'mw-search-DYM-rewritten' ),
                        $stParams
                );
 
@@ -479,7 +477,7 @@ class SpecialSearch extends SpecialPage {
                $original = Linker::linkKnown(
                        $this->getPageTitle(),
                        htmlspecialchars( $term ),
-                       array(),
+                       array( 'id' => 'mw-search-DYM-original' ),
                        $stParams
                );
 
@@ -648,8 +646,9 @@ class SpecialSearch extends SpecialPage {
 
                $out = "<ul class='mw-search-results'>\n";
                $result = $matches->next();
+               $pos = $this->offset;
                while ( $result ) {
-                       $out .= $this->showHit( $result, $terms );
+                       $out .= $this->showHit( $result, $terms, ++$pos );
                        $result = $matches->next();
                }
                $out .= "</ul>\n";
@@ -665,10 +664,11 @@ class SpecialSearch extends SpecialPage {
         *
         * @param SearchResult $result
         * @param array $terms Terms to highlight
+        * @param int $position Position within the search results, including offset.
         *
         * @return string
         */
-       protected function showHit( $result, $terms ) {
+       protected function showHit( $result, $terms, $position ) {
 
                if ( $result->isBrokenTitle() ) {
                        return '';
@@ -689,12 +689,13 @@ class SpecialSearch extends SpecialPage {
 
                $link = Linker::linkKnown(
                        $link_t,
-                       $titleSnippet
+                       $titleSnippet,
+                       array( 'data-serp-pos' => $position ) // HTML attributes
                );
 
-               //If page content is not readable, just return the title.
-               //This is not quite safe, but better than showing excerpts from non-readable pages
-               //Note that hiding the entry entirely would screw up paging.
+               // If page content is not readable, just return the title.
+               // This is not quite safe, but better than showing excerpts from non-readable pages
+               // Note that hiding the entry entirely would screw up paging.
                if ( !$title->userCan( 'read', $this->getUser() ) ) {
                        return "<li>{$link}</li>\n";
                }
index a66a3d1..00ee327 100644 (file)
@@ -555,7 +555,7 @@ class PageArchive {
                $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
                $content = $revision->getContent( Revision::RAW );
 
-               //NOTE: article ID may not be known yet. prepareSave() should not modify the database.
+               // NOTE: article ID may not be known yet. prepareSave() should not modify the database.
                $status = $content->prepareSave( $article, 0, -1, $user );
 
                if ( !$status->isOK() ) {
@@ -1210,6 +1210,8 @@ class SpecialUndelete extends SpecialPage {
        }
 
        protected function showHistory() {
+               $this->checkReadOnly();
+
                $out = $this->getOutput();
                if ( $this->mAllowed ) {
                        $out->addModules( 'mediawiki.special.undelete' );
@@ -1639,9 +1641,7 @@ class SpecialUndelete extends SpecialPage {
                        throw new ErrorPageError( 'undelete-error', 'filedelete-maintenance' );
                }
 
-               if ( wfReadOnly() ) {
-                       throw new ReadOnlyError;
-               }
+               $this->checkReadOnly();
 
                $out = $this->getOutput();
                $archive = new PageArchive( $this->mTargetObj, $this->getConfig() );
index b3ca006..4ad6ac0 100644 (file)
@@ -96,12 +96,11 @@ class UnwatchedpagesPage extends QueryPage {
                $text = $wgContLang->convert( $nt->getPrefixedText() );
 
                $plink = Linker::linkKnown( $nt, htmlspecialchars( $text ) );
-               $token = WatchAction::getWatchToken( $nt, $this->getUser() );
                $wlink = Linker::linkKnown(
                        $nt,
                        $this->msg( 'watch' )->escaped(),
                        array( 'class' => 'mw-watch-link' ),
-                       array( 'action' => 'watch', 'token' => $token )
+                       array( 'action' => 'watch' )
                );
 
                return $this->getLanguage()->specialList( $plink, $wlink );
index dd90590..eb34008 100644 (file)
@@ -36,14 +36,16 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        // UploadStash
        private $stash;
 
-       // Since we are directly writing the file to STDOUT,
-       // we should not be reading in really big files and serving them out.
-       //
-       // We also don't want people using this as a file drop, even if they
-       // share credentials.
-       //
-       // This service is really for thumbnails and other such previews while
-       // uploading.
+       /**
+        * Since we are directly writing the file to STDOUT,
+        * we should not be reading in really big files and serving them out.
+        *
+        * We also don't want people using this as a file drop, even if they
+        * share credentials.
+        *
+        * This service is really for thumbnails and other such previews while
+        * uploading.
+        */
        const MAX_SERVE_BYTES = 1048576; // 1MB
 
        public function __construct() {
index 21f1194..085cfee 100644 (file)
@@ -276,13 +276,17 @@ class LoginForm extends SpecialPage {
                }
                $this->setHeaders();
 
-               // In the case where the user is already logged in, and was redirected to the login form from a
-               // page that requires login, do not show the login page. The use case scenario for this is when
-               // a user opens a large number of tabs, is redirected to the login page on all of them, and then
-               // logs in on one, expecting all the others to work properly.
-               //
-               // However, do show the form if it was visited intentionally (no 'returnto' is present). People
-               // who often switch between several accounts have grown accustomed to this behavior.
+               /**
+                * In the case where the user is already logged in, and was redirected to
+                * the login form from a page that requires login, do not show the login
+                * page. The use case scenario for this is when a user opens a large number
+                * of tabs, is redirected to the login page on all of them, and then logs
+                * in on one, expecting all the others to work properly.
+                *
+                * However, do show the form if it was visited intentionally (no 'returnto'
+                * is present). People who often switch between several accounts have grown
+                * accustomed to this behavior.
+                */
                if (
                        $this->mType !== 'signup' &&
                        !$this->mPosted &&
@@ -357,10 +361,10 @@ class LoginForm extends SpecialPage {
                }
 
                $status = $this->addNewAccountInternal();
-               LoggerFactory::getInstance( 'authmanager' )->info( 'Account creation attempt with mailed password', array(
-                       'event' => 'accountcreation',
-                       'status' => $status,
-               ) );
+               LoggerFactory::getInstance( 'authmanager' )->info(
+                       'Account creation attempt with mailed password',
+                       array( 'event' => 'accountcreation', 'status' => $status )
+               );
                if ( !$status->isGood() ) {
                        $error = $status->getMessage();
                        $this->mainLoginForm( $error->toString() );
@@ -787,22 +791,24 @@ class LoginForm extends SpecialPage {
                global $wgBlockDisablesLogin;
                if ( !$u->checkPassword( $this->mPassword ) ) {
                        if ( $u->checkTemporaryPassword( $this->mPassword ) ) {
-                               // The e-mailed temporary password should not be used for actu-
-                               // al logins; that's a very sloppy habit, and insecure if an
-                               // attacker has a few seconds to click "search" on someone's o-
-                               // pen mail reader.
-                               //
-                               // Allow it to be used only to reset the password a single time
-                               // to a new value, which won't be in the user's e-mail ar-
-                               // chives.
-                               //
-                               // For backwards compatibility, we'll still recognize it at the
-                               // login form to minimize surprises for people who have been
-                               // logging in with a temporary password for some time.
-                               //
-                               // As a side-effect, we can authenticate the user's e-mail ad-
-                               // dress if it's not already done, since the temporary password
-                               // was sent via e-mail.
+                               /**
+                                * The e-mailed temporary password should not be used for actu-
+                                * al logins; that's a very sloppy habit, and insecure if an
+                                * attacker has a few seconds to click "search" on someone's
+                                * open mail reader.
+                                *
+                                * Allow it to be used only to reset the password a single time
+                                * to a new value, which won't be in the user's e-mail ar-
+                                * chives.
+                                *
+                                * For backwards compatibility, we'll still recognize it at the
+                                * login form to minimize surprises for people who have been
+                                * logging in with a temporary password for some time.
+                                *
+                                * As a side-effect, we can authenticate the user's e-mail ad-
+                                * dress if it's not already done, since the temporary password
+                                * was sent via e-mail.
+                                */
                                if ( !$u->isEmailConfirmed() && !wfReadOnly() ) {
                                        $u->confirmEmail();
                                        $u->saveSettings();
@@ -1380,7 +1386,7 @@ class LoginForm extends SpecialPage {
 
                if ( $this->mType == 'signup' ) {
                        // XXX hack pending RL or JS parse() support for complex content messages
-                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=25349
+                       // https://phabricator.wikimedia.org/T27349
                        $out->addJsConfigVars( 'wgCreateacctImgcaptchaHelp',
                                $this->msg( 'createacct-imgcaptcha-help' )->parse() );
 
@@ -1459,7 +1465,9 @@ class LoginForm extends SpecialPage {
                $template->set( 'emailothers', $wgEnableUserEmail );
                $template->set( 'canreset', $wgAuth->allowPasswordChange() );
                $template->set( 'resetlink', $resetLink );
-               $template->set( 'canremember', $wgExtendedLoginCookieExpiration === null ? ( $wgCookieExpiration > 0 ) : ( $wgExtendedLoginCookieExpiration > 0 ) );
+               $template->set( 'canremember', $wgExtendedLoginCookieExpiration === null ?
+                       ( $wgCookieExpiration > 0 ) :
+                       ( $wgExtendedLoginCookieExpiration > 0 ) );
                $template->set( 'usereason', $user->isLoggedIn() );
                $template->set( 'remember', $this->mRemember );
                $template->set( 'cansecurelogin', ( $wgSecureLogin === true ) );
index 5c4e9de..1ed392f 100644 (file)
@@ -269,12 +269,13 @@ class UserrightsPage extends SpecialPage {
                $user->invalidateCache();
 
                // update groups in external authentication database
-               Hooks::run( 'UserGroupsChanged', array( $user, $add, $remove ) );
+               Hooks::run( 'UserGroupsChanged', array( $user, $add, $remove, $this->getUser() ) );
                $wgAuth->updateExternalDBGroups( $user, $add, $remove );
 
                wfDebug( 'oldGroups: ' . print_r( $oldGroups, true ) . "\n" );
                wfDebug( 'newGroups: ' . print_r( $newGroups, true ) . "\n" );
-               Hooks::run( 'UserRights', array( &$user, $add, $remove ) );
+               // Deprecated in favor of UserGroupsChanged hook
+               Hooks::run( 'UserRights', array( &$user, $add, $remove ), '1.26' );
 
                if ( $newGroups != $oldGroups ) {
                        $this->addLogEntry( $user, $oldGroups, $newGroups, $reason );
index dd4eb0a..02a1f73 100644 (file)
@@ -43,10 +43,10 @@ class WantedPagesPage extends WantedQueryPage {
                        $parts = explode( '/', $par, 2 );
                        $this->limit = (int)$parts[0];
                        // @todo FIXME: nlinks is ignored
-                       //$nlinks = isset( $parts[1] ) && $parts[1] === 'nlinks';
+                       // $nlinks = isset( $parts[1] ) && $parts[1] === 'nlinks';
                        $this->offset = 0;
                } else {
-                       //$nlinks = true;
+                       // $nlinks = true;
                }
                $this->setListoutput( $inc );
                $this->shownavigation = !$inc;
index 39980d2..0e5ffce 100644 (file)
@@ -127,20 +127,13 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        'il_to' => $target->getDBkey(),
                );
 
-               $useLinkNamespaceDBFields = $this->getConfig()->get( 'UseLinkNamespaceDBFields' );
                $namespace = $this->opts->getValue( 'namespace' );
                $invert = $this->opts->getValue( 'invert' );
                $nsComparison = ( $invert ? '!= ' : '= ' ) . $dbr->addQuotes( $namespace );
                if ( is_int( $namespace ) ) {
-                       if ( $useLinkNamespaceDBFields ) {
-                               $conds['pagelinks'][] = "pl_from_namespace $nsComparison";
-                               $conds['templatelinks'][] = "tl_from_namespace $nsComparison";
-                               $conds['imagelinks'][] = "il_from_namespace $nsComparison";
-                       } else {
-                               $conds['pagelinks'][] = "page_namespace $nsComparison";
-                               $conds['templatelinks'][] = "page_namespace $nsComparison";
-                               $conds['imagelinks'][] = "page_namespace $nsComparison";
-                       }
+                       $conds['pagelinks'][] = "pl_from_namespace $nsComparison";
+                       $conds['templatelinks'][] = "tl_from_namespace $nsComparison";
+                       $conds['imagelinks'][] = "il_from_namespace $nsComparison";
                }
 
                if ( $from ) {
@@ -156,7 +149,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                }
 
                $queryFunc = function ( IDatabase $dbr, $table, $fromCol ) use (
-                       $conds, $target, $limit, $useLinkNamespaceDBFields
+                       $conds, $target, $limit
                ) {
                        // Read an extra row as an at-end check
                        $queryLimit = $limit + 1;
@@ -165,9 +158,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                                'rd_title' => $target->getDBkey(),
                                'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'
                        );
-                       if ( $useLinkNamespaceDBFields ) { // migration check
-                               $on['rd_namespace'] = $target->getNamespace();
-                       }
+                       $on['rd_namespace'] = $target->getNamespace();
                        // Inner LIMIT is 2X in case of stale backlinks with wrong namespaces
                        $subQuery = $dbr->selectSqlText(
                                array( $table, 'redirect', 'page' ),
index 23e445f..e2187f0 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 namespace MediaWiki\Tidy;
+
 use MWHttpRequest;
 use Exception;
 
index 1193318..c21bcf8 100644 (file)
@@ -37,7 +37,7 @@ class RaggettExternal extends RaggettBase {
                        "{$this->config['tidyBin']} -config {$this->config['tidyConfigFile']} " .
                        $this->config['tidyCommandLine'] . $opts, $descriptorspec, $pipes );
 
-               //NOTE: At least on linux, the process will be created even if tidy is not installed.
+               // NOTE: At least on linux, the process will be created even if tidy is not installed.
                //      This means that missing tidy will be treated as a validation failure.
 
                if ( is_resource( $process ) ) {
index 083f402..3f549d0 100644 (file)
@@ -86,4 +86,3 @@ class RaggettWrapper {
        }
 
 }
-?>
index 1d994aa..61fd3e4 100644 (file)
@@ -36,5 +36,5 @@ abstract class TidyDriverBase {
         * @param string HTML document fragment to clean up
         * @param string The corrected HTML output
         */
-       public abstract function tidy( $text );
+       abstract public function tidy( $text );
 }
index 0892ce4..5b8b643 100644 (file)
@@ -33,7 +33,9 @@ class MalformedTitleException extends Exception {
         * @param string[] $errorMessageParameters Additional parameters for the error message.
         * $titleText will be appended if it's not null. (since MW 1.26)
         */
-       public function __construct( $errorMessage = null, $titleText = null, $errorMessageParameters = array() ) {
+       public function __construct(
+               $errorMessage = null, $titleText = null, $errorMessageParameters = array()
+       ) {
                $this->errorMessage = $errorMessage;
                $this->titleText = $titleText;
                if ( $titleText !== null ) {
index 9ee4841..27574fa 100644 (file)
@@ -68,8 +68,8 @@ class MediaWikiPageLinkRenderer implements PageLinkRenderer {
         * @return string
         */
        public function getPageUrl( TitleValue $page, $params = array() ) {
-               //TODO: move the code from Linker::linkUrl here!
-               //The below is just a rough estimation!
+               // TODO: move the code from Linker::linkUrl here!
+               // The below is just a rough estimation!
 
                $name = $this->formatter->getPrefixedText( $page );
                $name = str_replace( ' ', '_', $name );
index 01575ac..6b2e877 100644 (file)
@@ -76,7 +76,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                        MWNamespace::hasGenderDistinction( $namespace )
                ) {
 
-                       //NOTE: we are assuming here that the title text is a user name!
+                       // NOTE: we are assuming here that the title text is a user name!
                        $gender = $this->genderCache->getGenderOf( $text, __METHOD__ );
                        $name = $this->language->getGenderNsText( $namespace, $gender );
                } else {
@@ -265,7 +265,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                                                        # Disallow Talk:File:x type titles...
                                                        throw new MalformedTitleException( 'title-invalid-talk-namespace', $text );
                                                } elseif ( Interwiki::isValidInterwiki( $x[1] ) ) {
-                                                       //TODO: get rid of global state!
+                                                       // TODO: get rid of global state!
                                                        # Disallow Talk:Interwiki:x type titles...
                                                        throw new MalformedTitleException( 'title-invalid-talk-namespace', $text );
                                                }
index 6c8bcc0..2c2f94b 100644 (file)
@@ -45,16 +45,18 @@ class NaiveForeignTitleFactory implements ForeignTitleFactory {
 
                global $wgContLang;
 
-               // Can we assume that the part of the page title before the colon is a
-               // namespace name?
-               //
-               // XML export schema version 0.5 and earlier (MW 1.18 and earlier) does not
-               // contain a <ns> tag, so we need to be able to handle that case.
-               //
-               // If we know the namespace ID, we assume a non-zero namespace ID means
-               // the ':' sets off a valid namespace name. If we don't know the namespace
-               // ID, we fall back to using the local wiki's namespace names to resolve
-               // this -- better than nothing, and mimics the old crappy behavior
+               /**
+                * Can we assume that the part of the page title before the colon is a
+                * namespace name?
+                *
+                * XML export schema version 0.5 and earlier (MW 1.18 and earlier) does not
+                * contain a <ns> tag, so we need to be able to handle that case.
+                *
+                * If we know the namespace ID, we assume a non-zero namespace ID means
+                * the ':' sets off a valid namespace name. If we don't know the namespace
+                * ID, we fall back to using the local wiki's namespace names to resolve
+                * this -- better than nothing, and mimics the old crappy behavior
+                */
                $isNamespacePartValid = is_null( $ns ) ?
                        ( $wgContLang->getNsIndex( $pieces[0] ) !== false ) :
                        $ns != 0;
index 30a85ae..5193a7f 100644 (file)
@@ -61,9 +61,6 @@ abstract class UploadBase {
        const FILETYPE_MISSING = 8;
        const FILETYPE_BADTYPE = 9;
        const VERIFICATION_ERROR = 10;
-
-       # HOOK_ABORTED is the new name of UPLOAD_VERIFICATION_ERROR
-       const UPLOAD_VERIFICATION_ERROR = 11;
        const HOOK_ABORTED = 11;
        const FILE_TOO_LARGE = 12;
        const WINDOWS_NONASCII_FILENAME = 13;
@@ -1118,10 +1115,10 @@ abstract class UploadBase {
                        '<a href',
                        '<body',
                        '<head',
-                       '<html', #also in safari
+                       '<html', # also in safari
                        '<img',
                        '<pre',
-                       '<script', #also in safari
+                       '<script', # also in safari
                        '<table'
                );
 
@@ -1402,7 +1399,10 @@ abstract class UploadBase {
                        # image/svg, text/xml, application/xml, and text/html, which can contain scripts
                        if ( $stripped == 'href' && strncasecmp( 'data:', $value, 5 ) === 0 ) {
                                // rfc2397 parameters. This is only slightly slower than (;[\w;]+)*.
+                               // @codingStandardsIgnoreStart Generic.Files.LineLength
                                $parameters = '(?>;[a-zA-Z0-9\!#$&\'*+.^_`{|}~-]+=(?>[a-zA-Z0-9\!#$&\'*+.^_`{|}~-]+|"(?>[\0-\x0c\x0e-\x21\x23-\x5b\x5d-\x7f]+|\\\\[\0-\x7f])*"))*(?:;base64)?';
+                               // @codingStandardsIgnoreEnd
+
                                if ( !preg_match( "!^data:\s*image/(gif|jpeg|jpg|png)$parameters,!i", $value ) ) {
                                        wfDebug( __METHOD__ . ": Found href to unwhitelisted data: uri "
                                                . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
@@ -1492,7 +1492,7 @@ abstract class UploadBase {
                        }
                }
 
-               return false; //No scripts detected
+               return false; // No scripts detected
        }
 
        /**
@@ -1655,7 +1655,7 @@ abstract class UploadBase {
                        $output = trim( $output );
 
                        if ( !$output ) {
-                               $output = true; #if there's no output, return true
+                               $output = true; # if there's no output, return true
                        } elseif ( $msgPattern ) {
                                $groups = array();
                                if ( preg_match( $msgPattern, $output, $groups ) ) {
index b4e815f..75540c1 100644 (file)
@@ -36,7 +36,7 @@ class UploadFromStash extends UploadBase {
        // an instance of UploadStash
        private $stash;
 
-       //LocalFile repo
+       // LocalFile repo
        private $repo;
 
        /**
index f578745..f897a79 100644 (file)
@@ -175,7 +175,6 @@ class UploadFromUrl extends UploadBase {
                $url = $request->getVal( 'wpUploadFileURL' );
 
                return !empty( $url )
-                       && Http::isValidURI( $url )
                        && $wgUser->isAllowed( 'upload_by_url' );
        }
 
index c07665a..b9a1bbf 100644 (file)
@@ -625,7 +625,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         *
         * @param array $params Handler-specific parameters
         * @param int $flags Bitfield that supports THUMB_* constants
-        * @return string Base name for URL, like '120px-12345.jpg', or null if there is no handler
+        * @return string|null Base name for URL, like '120px-12345.jpg', or null if there is no handler
         */
        function thumbName( $params, $flags = 0 ) {
                return $this->generateThumbName( $this->getUrlName(), $params );
@@ -747,4 +747,3 @@ class UploadStashWrongOwnerException extends UploadStashException {
 
 class UploadStashNoSuchKeyException extends UploadStashException {
 }
-
index 4f8e0b1..b9d30d7 100644 (file)
@@ -36,25 +36,25 @@ class AvroValidator {
         *  returned.
         */
        public static function getErrors( AvroSchema $schema, $datum ) {
-               switch ( $schema->type) {
+               switch ( $schema->type ) {
                case AvroSchema::NULL_TYPE:
-                       if ( !is_null($datum) ) {
+                       if ( !is_null( $datum ) ) {
                                return self::wrongType( 'null', $datum );
                        }
                        return array();
                case AvroSchema::BOOLEAN_TYPE:
-                       if ( !is_bool($datum) ) {
+                       if ( !is_bool( $datum ) ) {
                                return self::wrongType( 'boolean', $datum );
                        }
                        return array();
                case AvroSchema::STRING_TYPE:
                case AvroSchema::BYTES_TYPE:
-                       if ( !is_string($datum) ) {
+                       if ( !is_string( $datum ) ) {
                                return self::wrongType( 'string', $datum );
                        }
                        return array();
                case AvroSchema::INT_TYPE:
-                       if ( !is_int($datum) ) {
+                       if ( !is_int( $datum ) ) {
                                return self::wrongType( 'integer', $datum );
                        }
                        if ( AvroSchema::INT_MIN_VALUE > $datum
@@ -68,7 +68,7 @@ class AvroValidator {
                        }
                        return array();
                case AvroSchema::LONG_TYPE:
-                       if ( !is_int($datum) ) {
+                       if ( !is_int( $datum ) ) {
                                return self::wrongType( 'integer', $datum );
                        }
                        if ( AvroSchema::LONG_MIN_VALUE > $datum
@@ -83,32 +83,29 @@ class AvroValidator {
                        return array();
                case AvroSchema::FLOAT_TYPE:
                case AvroSchema::DOUBLE_TYPE:
-                       if ( !is_float($datum) && !is_int($datum) ) {
+                       if ( !is_float( $datum ) && !is_int( $datum ) ) {
                                return self::wrongType( 'float or integer', $datum );
                        }
                        return array();
                case AvroSchema::ARRAY_SCHEMA:
-                       if (!is_array($datum)) {
+                       if ( !is_array( $datum ) ) {
                                return self::wrongType( 'array', $datum );
                        }
                        $errors = array();
-                       foreach ($datum as $d) {
-                               $result = $this->validate( $schema->items(), $d );
+                       foreach ( $datum as $d ) {
+                               $result = self::getErrors( $schema->items(), $d );
                                if ( $result ) {
                                        $errors[] = $result;
                                }
                        }
-                       if ( $errors ) {
-                               return $errors;
-                       }
-                       return array();
+                       return $errors;
                case AvroSchema::MAP_SCHEMA:
-                       if (!is_array($datum)) {
+                       if ( !is_array( $datum ) ) {
                                return self::wrongType( 'array', $datum );
                        }
                        $errors = array();
-                       foreach ($datum as $k => $v) {
-                       if ( !is_string($k) ) {
+                       foreach ( $datum as $k => $v ) {
+                               if ( !is_string( $k ) ) {
                                        $errors[] = self::wrongType( 'string key', $k );
                                }
                                $result = self::getErrors( $schema->values(), $v );
@@ -119,7 +116,7 @@ class AvroValidator {
                        return $errors;
                case AvroSchema::UNION_SCHEMA:
                        $errors = array();
-                       foreach ($schema->schemas() as $schema) {
+                       foreach ( $schema->schemas() as $schema ) {
                                $result = self::getErrors( $schema, $datum );
                                if ( !$result ) {
                                        return array();
index 9441608..59350e6 100644 (file)
@@ -78,19 +78,19 @@ class BatchRowIterator implements RecursiveIterator {
        private $key;
 
        /**
-        * @param DatabaseBase $db         The database to read from
+        * @param IDatabase $db The database to read from
         * @param string       $table      The name of the table to read from
         * @param string|array $primaryKey The name or names of the primary key columns
         * @param integer      $batchSize  The number of rows to fetch per iteration
         * @throws MWException
         */
-       public function __construct( DatabaseBase $db, $table, $primaryKey, $batchSize ) {
+       public function __construct( IDatabase $db, $table, $primaryKey, $batchSize ) {
                if ( $batchSize < 1 ) {
                        throw new MWException( 'Batch size must be at least 1 row.' );
                }
                $this->db = $db;
                $this->table = $table;
-               $this->primaryKey = (array) $primaryKey;
+               $this->primaryKey = (array)$primaryKey;
                $this->fetchColumns = $this->primaryKey;
                $this->orderBy = implode( ' ASC,', $this->primaryKey ) . ' ASC';
                $this->batchSize = $batchSize;
@@ -169,7 +169,7 @@ class BatchRowIterator implements RecursiveIterator {
         * @return boolean True when the iterator is in a valid state
         */
        public function valid() {
-               return (bool) $this->current;
+               return (bool)$this->current;
        }
 
        /**
index a4257a5..e739be3 100644 (file)
@@ -71,7 +71,9 @@ class BatchRowUpdate {
         * @param RowUpdateGenerator $generator Generates single row updates
         *  based on the rows content
         */
-       public function __construct( BatchRowIterator $reader, BatchRowWriter $writer, RowUpdateGenerator $generator ) {
+       public function __construct(
+               BatchRowIterator $reader, BatchRowWriter $writer, RowUpdateGenerator $generator
+       ) {
                $this->reader = $reader;
                $this->writer = $writer;
                $this->generator = $generator;
index 04c00a3..377ed85 100644 (file)
@@ -37,11 +37,11 @@ class BatchRowWriter {
        protected $clusterName;
 
        /**
-        * @param DatabaseBase $db          The database to write to
+        * @param IDatabase $db The database to write to
         * @param string       $table       The name of the table to update
         * @param string|bool  $clusterName A cluster name valid for use with LBFactory
         */
-       public function __construct( DatabaseBase $db, $table, $clusterName = false ) {
+       public function __construct( IDatabase $db, $table, $clusterName = false ) {
                $this->db = $db;
                $this->table = $table;
                $this->clusterName = $clusterName;
diff --git a/includes/utils/FileContentsHasher.php b/includes/utils/FileContentsHasher.php
new file mode 100644 (file)
index 0000000..655c1d0
--- /dev/null
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Generate hash digests of file contents to help with cache invalidation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 FileContentsHasher {
+
+       /** @var BagOStuff */
+       protected $cache;
+
+       /** @var FileContentsHasher */
+       private static $instance;
+
+       /**
+        * Constructor.
+        */
+       public function __construct() {
+               $this->cache = ObjectCache::newAccelerator( 'hash' );
+       }
+
+       /**
+        * Get the singleton instance of this class.
+        *
+        * @return FileContentsHasher
+        */
+       public static function singleton() {
+               if ( !self::$instance ) {
+                       self::$instance = new self;
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * Get a hash of a file's contents, either by retrieving a previously-
+        * computed hash from the cache, or by computing a hash from the file.
+        *
+        * @private
+        * @param string $filePath Full path to the file.
+        * @param string $algo Name of selected hashing algorithm.
+        * @return string|bool Hash of file contents, or false if the file could not be read.
+        */
+       public function getFileContentsHashInternal( $filePath, $algo = 'md4' ) {
+               $mtime = MediaWiki\quietCall( 'filemtime', $filePath );
+               if ( $mtime === false ) {
+                       return false;
+               }
+
+               $cacheKey = wfGlobalCacheKey( __CLASS__, $filePath, $mtime, $algo );
+               $hash = $this->cache->get( $cacheKey );
+
+               if ( $hash ) {
+                       return $hash;
+               }
+
+               $contents = MediaWiki\quietCall( 'file_get_contents', $filePath );
+               if ( $contents === false ) {
+                       return false;
+               }
+
+               $hash = hash( $algo, $contents );
+               $this->cache->set( $cacheKey, $hash, 60 * 60 * 24 );  // 24h
+
+               return $hash;
+       }
+
+       /**
+        * Get a hash of the combined contents of one or more files, either by
+        * retrieving a previously-computed hash from the cache, or by computing
+        * a hash from the files.
+        *
+        * @param string|string[] $filePaths One or more file paths.
+        * @param string $algo Name of selected hashing algorithm.
+        * @return string|bool Hash of files' contents, or false if no file could not be read.
+        */
+       public static function getFileContentsHash( $filePaths, $algo = 'md4' ) {
+               $instance = self::singleton();
+
+               if ( !is_array( $filePaths ) ) {
+                       $filePaths = (array)$filePaths;
+               }
+
+               if ( count( $filePaths ) === 1 ) {
+                       return $instance->getFileContentsHashInternal( $filePaths[0], $algo );
+               }
+
+               sort( $filePaths );
+               $hashes = array_map( function ( $filePath ) use ( $instance, $algo ) {
+                       return $instance->getFileContentsHashInternal( $filePath, $algo ) ?: '';
+               }, $filePaths );
+
+               $hashes = implode( '', $hashes );
+               return $hashes ? hash( $algo, $hashes ) : false;
+       }
+}
index 666660a..9f52249 100644 (file)
@@ -659,7 +659,7 @@ class IP {
         * unusual representations may be added later.
         *
         * @param string $addr Something that might be an IP address
-        * @return string Valid dotted quad IPv4 address or null
+        * @return string|null Valid dotted quad IPv4 address or null
         */
        public static function canonicalize( $addr ) {
                // remove zone info (bug 35738)
diff --git a/includes/utils/MWCryptHash.php b/includes/utils/MWCryptHash.php
new file mode 100644 (file)
index 0000000..b46de60
--- /dev/null
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Utility functions for generating hashes
+ *
+ * This is based in part on Drupal code as well as what we used in our own code
+ * prior to introduction of this class, by way of MWCryptRand.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 MWCryptHash {
+       /**
+        * The hash algorithm being used
+        */
+       protected static $algo = null;
+
+       /**
+        * The number of bytes outputted by the hash algorithm
+        */
+       protected static $hashLength = array(
+               true => null,
+               false => null,
+       );
+
+       /**
+        * Decide on the best acceptable hash algorithm we have available for hash()
+        * @return string A hash algorithm
+        */
+       public static function hashAlgo() {
+               if ( !is_null( self::$algo ) ) {
+                       return self::$algo;
+               }
+
+               $algos = hash_algos();
+               $preference = array( 'whirlpool', 'sha256', 'sha1', 'md5' );
+
+               foreach ( $preference as $algorithm ) {
+                       if ( in_array( $algorithm, $algos ) ) {
+                               self::$algo = $algorithm;
+                               wfDebug( __METHOD__ . ': Using the ' . self::$algo . " hash algorithm.\n" );
+
+                               return self::$algo;
+                       }
+               }
+
+               // We only reach here if no acceptable hash is found in the list, this should
+               // be a technical impossibility since most of php's hash list is fixed and
+               // some of the ones we list are available as their own native functions
+               // But since we already require at least 5.2 and hash() was default in
+               // 5.1.2 we don't bother falling back to methods like sha1 and md5.
+               throw new DomainException( "Could not find an acceptable hashing function in hash_algos()" );
+       }
+
+       /**
+        * Return the byte-length output of the hash algorithm we are
+        * using in self::hash and self::hmac.
+        *
+        * @param boolean $raw True to return the length for binary data, false to
+        *   return for hex-encoded
+        * @return int Number of bytes the hash outputs
+        */
+       public static function hashLength( $raw = true ) {
+               $raw = (bool)$raw;
+               if ( is_null( self::$hashLength[$raw] ) ) {
+                       self::$hashLength[$raw] = strlen( self::hash( '', $raw ) );
+               }
+
+               return self::$hashLength[$raw];
+       }
+
+       /**
+        * Generate an acceptably unstable one-way-hash of some text
+        * making use of the best hash algorithm that we have available.
+        *
+        * @param string $data
+        * @param boolean $raw True to return binary data, false to return it hex-encoded
+        * @return string A hash of the data
+        */
+       public static function hash( $data, $raw = true ) {
+               return hash( self::hashAlgo(), $data, $raw );
+       }
+
+       /**
+        * Generate an acceptably unstable one-way-hmac of some text
+        * making use of the best hash algorithm that we have available.
+        *
+        * @param string $data
+        * @param string $key
+        * @param boolean $raw True to return binary data, false to return it hex-encoded
+        * @return string An hmac hash of the data + key
+        */
+       public static function hmac( $data, $key, $raw = true ) {
+               return hash_hmac( self::hashAlgo(), $data, $key, $raw );
+       }
+
+}
index f223790..53c77c2 100644 (file)
@@ -43,16 +43,6 @@ class MWCryptRand {
         */
        protected static $singleton = null;
 
-       /**
-        * The hash algorithm being used
-        */
-       protected $algo = null;
-
-       /**
-        * The number of bytes outputted by the hash algorithm
-        */
-       protected $hashLength = null;
-
        /**
         * A boolean indicating whether the previous random generation was done using
         * cryptographically strong random number generator or not.
@@ -156,7 +146,7 @@ class MWCryptRand {
                // loop to gather little entropy)
                $minIterations = self::MIN_ITERATIONS;
                // Duration of time to spend doing calculations (in seconds)
-               $duration = ( self::MSEC_PER_BYTE / 1000 ) * $this->hashLength();
+               $duration = ( self::MSEC_PER_BYTE / 1000 ) * MWCryptHash::hashLength();
                // Create a buffer to use to trigger memory operations
                $bufLength = 10000000;
                $buffer = str_repeat( ' ', $bufLength );
@@ -183,7 +173,7 @@ class MWCryptRand {
                        $iterations++;
                }
                $timeTaken = $currentTime - $startTime;
-               $data = $this->hash( $data );
+               $data = MWCryptHash::hash( $data );
 
                wfDebug( __METHOD__ . ": Clock drift calculation " .
                        "(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
@@ -203,7 +193,7 @@ class MWCryptRand {
                        // Initialize the state with whatever unstable data we can find
                        // It's important that this data is hashed right afterwards to prevent
                        // it from being leaked into the output stream
-                       $state = $this->hash( $this->initialRandomState() );
+                       $state = MWCryptHash::hash( $this->initialRandomState() );
                }
                // Generate a new random state based on the initial random state or previous
                // random state by combining it with clock drift
@@ -212,73 +202,6 @@ class MWCryptRand {
                return $state;
        }
 
-       /**
-        * Decide on the best acceptable hash algorithm we have available for hash()
-        * @throws MWException
-        * @return string A hash algorithm
-        */
-       protected function hashAlgo() {
-               if ( !is_null( $this->algo ) ) {
-                       return $this->algo;
-               }
-
-               $algos = hash_algos();
-               $preference = array( 'whirlpool', 'sha256', 'sha1', 'md5' );
-
-               foreach ( $preference as $algorithm ) {
-                       if ( in_array( $algorithm, $algos ) ) {
-                               $this->algo = $algorithm;
-                               wfDebug( __METHOD__ . ": Using the {$this->algo} hash algorithm.\n" );
-
-                               return $this->algo;
-                       }
-               }
-
-               // We only reach here if no acceptable hash is found in the list, this should
-               // be a technical impossibility since most of php's hash list is fixed and
-               // some of the ones we list are available as their own native functions
-               // But since we already require at least 5.2 and hash() was default in
-               // 5.1.2 we don't bother falling back to methods like sha1 and md5.
-               throw new MWException( "Could not find an acceptable hashing function in hash_algos()" );
-       }
-
-       /**
-        * Return the byte-length output of the hash algorithm we are
-        * using in self::hash and self::hmac.
-        *
-        * @return int Number of bytes the hash outputs
-        */
-       protected function hashLength() {
-               if ( is_null( $this->hashLength ) ) {
-                       $this->hashLength = strlen( $this->hash( '' ) );
-               }
-
-               return $this->hashLength;
-       }
-
-       /**
-        * Generate an acceptably unstable one-way-hash of some text
-        * making use of the best hash algorithm that we have available.
-        *
-        * @param string $data
-        * @return string A raw hash of the data
-        */
-       protected function hash( $data ) {
-               return hash( $this->hashAlgo(), $data, true );
-       }
-
-       /**
-        * Generate an acceptably unstable one-way-hmac of some text
-        * making use of the best hash algorithm that we have available.
-        *
-        * @param string $data
-        * @param string $key
-        * @return string A raw hash of the data
-        */
-       protected function hmac( $data, $key ) {
-               return hash_hmac( $this->hashAlgo(), $data, $key, true );
-       }
-
        /**
         * @see self::wasStrong()
         */
@@ -407,7 +330,7 @@ class MWCryptRand {
                                ": Falling back to using a pseudo random state to generate randomness.\n" );
                }
                while ( strlen( $buffer ) < $bytes ) {
-                       $buffer .= $this->hmac( $this->randomState(), mt_rand() );
+                       $buffer .= MWCryptHash::hmac( $this->randomState(), mt_rand() );
                        // This code is never really cryptographically strong, if we use it
                        // at all, then set strong to false.
                        $this->strong = false;
index 21c5709..dc95e75 100644 (file)
@@ -22,19 +22,19 @@ class ComplexNamespaceInputWidget extends \OOUI\Widget {
 
        /**
         * @param array $config Configuration options
-        * @param array $config['namespace'] Configuration for the NamespaceInputWidget dropdown with list
-        *     of namespaces
-        * @param string $config['namespace']['includeAllValue'] If specified, add a "all namespaces"
-        *     option to the dropdown, and use this as the input value for it
-        * @param array|null $config['invert'] Configuration for the "invert selection" CheckboxInputWidget. If
-        *     null, the checkbox will not be generated.
+        * @param array $config['namespace'] Configuration for the NamespaceInputWidget
+        *  dropdown with list of namespaces
+        * @param string $config['namespace']['includeAllValue'] If specified,
+        *  add an "all namespaces" option to the dropdown, and use this as the input value for it
+        * @param array|null $config['invert'] Configuration for the "invert selection"
+        *  CheckboxInputWidget. If null, the checkbox will not be generated.
         * @param array|null $config['associated'] Configuration for the "include associated namespace"
-        *     CheckboxInputWidget. If null, the checkbox will not be generated.
-        * @param array $config['invertLabel'] Configuration for the FieldLayout with label wrapping the
-        *     "invert selection" checkbox
+        *  CheckboxInputWidget. If null, the checkbox will not be generated.
+        * @param array $config['invertLabel'] Configuration for the FieldLayout with label
+        *  wrapping the "invert selection" checkbox
         * @param string $config['invertLabel']['label'] Label text for the label
-        * @param array $config['associatedLabel'] Configuration for the FieldLayout with label wrapping
-        *     the "include associated namespace" checkbox
+        * @param array $config['associatedLabel'] Configuration for the FieldLayout with label
+        *  wrapping the "include associated namespace" checkbox
         * @param string $config['associatedLabel']['label'] Label text for the label
         */
        public function __construct( array $config = array() ) {
@@ -102,7 +102,16 @@ class ComplexNamespaceInputWidget extends \OOUI\Widget {
                        $config,
                        array_intersect_key(
                                $this->config,
-                               array_fill_keys( array( 'namespace', 'invert', 'invertLabel', 'associated', 'associatedLabel' ), true )
+                               array_fill_keys(
+                                       array(
+                                               'namespace',
+                                               'invert',
+                                               'invertLabel',
+                                               'associated',
+                                               'associatedLabel'
+                                       ),
+                                       true
+                               )
                        )
                );
                return parent::getConfig( $config );
index 73ef54c..ea0ef9e 100644 (file)
@@ -19,8 +19,8 @@ class ComplexTitleInputWidget extends \OOUI\Widget {
         * Like TitleInputWidget, but the namespace has to be input through a separate dropdown field.
         *
         * @param array $config Configuration options
-        * @param array $config['namespace'] Configuration for the NamespaceInputWidget dropdown with list
-        *     of namespaces
+        * @param array $config['namespace'] Configuration for the NamespaceInputWidget dropdown
+        *  with list of namespaces
         * @param array $config['title'] Configuration for the TitleInputWidget text field
         */
        public function __construct( array $config = array() ) {
@@ -42,10 +42,13 @@ class ComplexTitleInputWidget extends \OOUI\Widget {
                $this->title = new TitleInputWidget( array_merge(
                        $config['title'],
                        array(
-                               // The inner TitleInputWidget shouldn't be infusable, only the ComplexTitleInputWidget itself can be.
+                               // The inner TitleInputWidget shouldn't be infusable,
+                               // only the ComplexTitleInputWidget itself can be.
                                'infusable' => false,
                                'relative' => true,
-                               'namespace' => isset( $config['namespace']['value'] ) ? $config['namespace']['value'] : null,
+                               'namespace' => isset( $config['namespace']['value'] ) ?
+                                       $config['namespace']['value'] :
+                                       null,
                        )
                ) );
 
index 8ac7014..5550a21 100644 (file)
@@ -19,12 +19,15 @@ class TitleInputWidget extends \OOUI\TextInputWidget {
        /**
         * @param array $config Configuration options
         * @param int|null $config['namespace'] Namespace to prepend to queries
-        * @param bool|null $config['relative'] If a namespace is set, return a title relative to it (default: true)
+        * @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)
         */
        public function __construct( array $config = array() ) {
                // Parent constructor
-               parent::__construct( array_merge( array( 'infusable' => true, 'maxLength' => 255 ), $config ) );
+               parent::__construct(
+                       array_merge( array( 'infusable' => true, 'maxLength' => 255 ), $config )
+               );
 
                // Properties, which are ignored in PHP and just shipped back to JS
                if ( isset( $config['namespace'] ) ) {
index 5dd4977..aac76c5 100644 (file)
                "maintenance/jsduck/external.js",
                "resources/src/mediawiki",
                "resources/src/mediawiki.action",
-               "resources/src/mediawiki.api",
                "resources/src/mediawiki.language",
                "resources/src/mediawiki.messagePoster",
-               "resources/src/mediawiki.page",
                "resources/src/mediawiki.special",
                "resources/src/mediawiki.toolbar",
                "resources/src/mediawiki.widgets",
index 1613536..50ed513 100644 (file)
@@ -34,6 +34,8 @@ if ( function_exists( 'mb_strtoupper' ) ) {
        mb_internal_encoding( 'UTF-8' );
 }
 
+use CLDRPluralRuleParser\Evaluator;
+
 /**
  * Internationalisation code
  * @ingroup Language
@@ -2549,10 +2551,13 @@ class Language {
         *
         * @param MWTimestamp $time
         * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
-        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
+        * @param User|null $user User the timestamp is being generated for
+        *  (or null to use main context's user)
         * @return string Formatted timestamp
         */
-       public function getHumanTimestamp( MWTimestamp $time, MWTimestamp $relativeTo = null, User $user = null ) {
+       public function getHumanTimestamp(
+               MWTimestamp $time, MWTimestamp $relativeTo = null, User $user = null
+       ) {
                if ( $relativeTo === null ) {
                        $relativeTo = new MWTimestamp();
                }
@@ -2587,7 +2592,9 @@ class Language {
         * @return string Human timestamp
         * @since 1.26
         */
-       private function getHumanTimestampInternal( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
+       private function getHumanTimestampInternal(
+               MWTimestamp $ts, MWTimestamp $relativeTo, User $user
+       ) {
                $diff = $ts->diff( $relativeTo );
                $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) -
                        (int)$relativeTo->timestamp->format( 'w' ) );
@@ -2678,7 +2685,7 @@ class Language {
                # Even with //IGNORE iconv can whine about illegal characters in
                # *input* string. We just ignore those too.
                # REF: http://bugs.php.net/bug.php?id=37166
-               # REF: https://bugzilla.wikimedia.org/show_bug.cgi?id=16885
+               # REF: https://phabricator.wikimedia.org/T18885
                MediaWiki\suppressWarnings();
                $text = iconv( $in, $out . '//IGNORE', $string );
                MediaWiki\restoreWarnings();
@@ -4968,7 +4975,7 @@ class Language {
         */
        public function getPluralRuleIndexNumber( $number ) {
                $pluralRules = $this->getCompiledPluralRules();
-               $form = CLDRPluralRuleEvaluator::evaluateCompiled( $number, $pluralRules );
+               $form = Evaluator::evaluateCompiled( $number, $pluralRules );
                return $form;
        }
 
index 7879309..78b3572 100644 (file)
@@ -539,27 +539,45 @@ class LanguageConverter {
         * @return string Namespace name for display
         */
        public function convertNamespace( $index, $variant = null ) {
+               if ( $index === NS_MAIN ) {
+                       return '';
+               }
+
                if ( $variant === null ) {
                        $variant = $this->getPreferredVariant();
                }
-               if ( $index === NS_MAIN ) {
-                       return '';
-               } else {
-                       // First check if a message gives a converted name in the target variant.
-                       $nsConvMsg = wfMessage( 'conversion-ns' . $index )->inLanguage( $variant );
-                       if ( $nsConvMsg->exists() ) {
-                               return $nsConvMsg->plain();
-                       }
-                       // Then check if a message gives a converted name in content language
-                       // which needs extra translation to the target variant.
+
+               $cache = ObjectCache::newAccelerator( CACHE_NONE );
+               $key = wfMemcKey( 'languageconverter', 'namespace-text', $index, $variant );
+               $nsVariantText = $cache->get( $key );
+               if ( $nsVariantText !== false ) {
+                       return $nsVariantText;
+               }
+
+               // First check if a message gives a converted name in the target variant.
+               $nsConvMsg = wfMessage( 'conversion-ns' . $index )->inLanguage( $variant );
+               if ( $nsConvMsg->exists() ) {
+                       $nsVariantText = $nsConvMsg->plain();
+               }
+
+               // Then check if a message gives a converted name in content language
+               // which needs extra translation to the target variant.
+               if ( $nsVariantText === false ) {
                        $nsConvMsg = wfMessage( 'conversion-ns' . $index )->inContentLanguage();
                        if ( $nsConvMsg->exists() ) {
-                               return $this->translate( $nsConvMsg->plain(), $variant );
+                               $nsVariantText = $this->translate( $nsConvMsg->plain(), $variant );
                        }
+               }
+
+               if ( $nsVariantText === false ) {
                        // No message exists, retrieve it from the target variant's namespace names.
                        $langObj = $this->mLangObj->factory( $variant );
-                       return $langObj->getFormattedNsText( $index );
+                       $nsVariantText = $langObj->getFormattedNsText( $index );
                }
+
+               $cache->set( $key, $nsVariantText, 60 );
+
+               return $nsVariantText;
        }
 
        /**
@@ -1092,13 +1110,13 @@ class LanguageConverter {
                        // text should be splited by ";" only if a valid variant
                        // name exist after the markup, for example:
                        //  -{zh-hans:<span style="font-size:120%;">xxx</span>;zh-hant:\
-                       //      <span style="font-size:120%;">yyy</span>;}-
+                       //      <span style="font-size:120%;">yyy</span>;}-
                        // we should split it as:
                        //  array(
-                       //        [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
-                       //        [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
-                       //        [2] => ''
-                       //       )
+                       //        [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
+                       //        [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
+                       //        [2] => ''
+                       //       )
                        $pat = '/;\s*(?=';
                        foreach ( $this->mVariants as $variant ) {
                                // zh-hans:xxx;zh-hant:yyy
index a81f17f..5a14003 100644 (file)
        'nv' => 'Diné bizaad', # Navajo
        'ny' => 'Chi-Chewa',    # Chichewa
        'oc' => 'occitan',              # Occitan
+       'olo' => 'Livvinкarjala',              # Livvi-Karelian
        'om' => 'Oromoo',               # Oromo
        'or' => 'ଓଡ଼ିଆ',              # Oriya
        'os' => 'Ирон', # Ossetic, bug 29091
index a96b0a9..bf09252 100644 (file)
@@ -42,8 +42,8 @@ class LanguageFi extends Language {
                        return $wgGrammarForms['fi'][$case][$word];
                }
 
-               # These rules are not perfect, but they are currently only used for site names so it doesn't
-               # matter if they are wrong sometimes. Just add a special case for your site name if necessary.
+               # These rules don't cover the whole language.
+               # They are used only for site names.
 
                # wovel harmony flag
                $aou = preg_match( '/[aou][^äöy]*$/i', $word );
index 226e313..60384a8 100644 (file)
@@ -24,7 +24,9 @@
 /**
  * Russian (русский язык)
  *
- * You can contact Alexander Sigachov (alexander.sigachov at Googgle Mail)
+ * You can contact:
+ * Alexander Sigachov (alexander.sigachov at Googgle Mail)
+ * Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)
  *
  * @ingroup Language
  */
@@ -44,63 +46,22 @@ class LanguageRu extends Language {
                        return $wgGrammarForms['ru'][$case][$word];
                }
 
-               # These rules are not perfect, but they are currently only used for Wikimedia
-               # site names so it doesn't matter if they are wrong sometimes.
-               # Just add a special case for your site name if necessary.
+               $grammarDataFile = __DIR__ . '/data/grammar.ru.json';
+               $grammarData = FormatJson::decode( file_get_contents( $grammarDataFile ), true );
+
+               if ( array_key_exists( $case, $grammarData ) ) {
+                       foreach ( array_keys( $grammarData[$case] ) as $form ) {
+                               if ( $form === '@metadata' ) {
+                                       continue;
+                               }
+
+                               $regex = "/$form/";
+
+                               if ( preg_match( $regex, $word ) ) {
+                                       $word = preg_replace( $regex, $grammarData[$case][$form], $word );
 
-               # substr doesn't support Unicode and mb_substr has issues,
-               # so break it to characters using preg_match_all and then use array_slice and join
-               $chars = array();
-               preg_match_all( '/./us', $word, $chars );
-               if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
-                       switch ( $case ) {
-                               case 'genitive': # родительный падеж
-                                       if ( join( '', array_slice( $chars[0], -1 ) ) === 'ь' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'я';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ия' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ии';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ка' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ки';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ти' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'тей';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ды' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'дов';
-                                       } elseif ( join( '', array_slice( $chars[0], -1 ) ) === 'д' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'да';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ник' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ника';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ные' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ных';
-                                       }
-                                       break;
-                               case 'dative': # дательный падеж
-                                       # stub
-                                       break;
-                               case 'accusative': # винительный падеж
-                                       # stub
-                                       break;
-                               case 'instrumental': # творительный падеж
-                                       # stub
-                                       break;
-                               case 'prepositional': # предложный падеж
-                                       if ( join( '', array_slice( $chars[0], -1 ) ) === 'ь' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'е';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ия' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ии';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ка' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ке';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ти' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'тях';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ды' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'дах';
-                                       } elseif ( join( '', array_slice( $chars[0], -1 ) ) === 'д' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'де';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ник' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'нике';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ные' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ных';
-                                       }
                                        break;
+                               }
                        }
                }
 
index 429d0a6..a2a8831 100644 (file)
@@ -44,28 +44,23 @@ class LanguageTyv extends Language {
                }
 
                // Set up some constants...
-               $allVowels = array( "е", "и", "э", "ө", "ү", "а", "ё", "о", "у", "ы",
-                       "ю", "я", "a", "e", "i", "o", "ö", "u", "ü", "y" );
-               $frontVowels = array( "е", "и", "э", "ө", "ү", "e", "i", "ö", "ü" );
-               $backVowels = array( "а", "ё", "о", "у", "ы", "ю", "я", "a", "o", "u", "y" );
-               $unroundFrontVowels = array( "е", "и", "э", "e", "i" );
-               $roundFrontVowels = array( "ө", "ү", "ö", "ü" );
-               $unroundBackVowels = array( "а", "ы", "я", "a", "y" );
-               $roundBackVowels = array( "ё", "о", "у", "ю", "o", "u" );
-               //$voicedPhonemes = array( "д", "б", "з", "ж", "г", "d", "b", "z", "g" );
-               $unvoicedPhonemes = array( "т", "п", "с", "ш", "к", "ч", "х", "t", "p", "s", "k", "x" );
-               $directiveUnvoicedStems = array( "т", "п", "с", "ш", "к", "ч", "х", "л",
-                       "м", "н", "ң", "t", "p", "s", "k", "x", "l", "m", "n", "ŋ" );
-               $directiveVoicedStems = array( "д", "б", "з", "ж", "г", "р", "й", "d", "b", "z", "g", "r", "j" );
+               $allVowels = array( "е", "и", "э", "ө", "ү", "а", "ё", "о", "у", "ы", "ю", "я" );
+               $frontVowels = array( "е", "и", "э", "ө", "ү" );
+               $backVowels = array( "а", "ё", "о", "у", "ы", "ю", "я" );
+               $unroundFrontVowels = array( "е", "и", "э" );
+               $roundFrontVowels = array( "ө", "ү" );
+               $unroundBackVowels = array( "а", "ы", "я" );
+               $roundBackVowels = array( "ё", "о", "у", "ю" );
+               $unvoicedPhonemes = array( "т", "п", "с", "ш", "к", "ч", "х" );
+               $directiveUnvoicedStems = array( "т", "п", "с", "ш", "к", "ч", "х", "л", "м", "н", "ң" );
+               $directiveVoicedStems = array( "д", "б", "з", "ж", "г", "р", "й" );
 
-               //$allSonants = array("л", "м", "н", "ң", "р", "й");
-               //$allNasals = array("м", "н", "ң");
-
-               //Put the word in a form we can play with since we're using UTF-8
+               // Put the word in a form we can play with since we're using UTF-8
                preg_match_all( '/./us', $word, $ar );
 
                // Here's the last letter in the word
                $wordEnding = $ar[0][count( $ar[0] ) - 1];
+
                // Here's an array with the order of the letters in the word reversed so
                // we can find a match quicker. *shrug*
                $wordReversed = array_reverse( $ar[0] );
@@ -81,6 +76,7 @@ class LanguageTyv extends Language {
                                        continue;
                                }
                        }
+
                        if ( $wordLastVowel !== null ) {
                                break;
                        } else {
@@ -102,7 +98,7 @@ class LanguageTyv extends Language {
                                                $word = implode( "", $ar[0] ) . "тың";
                                        } else {
                                        }
-                               } elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
+                               } elseif ( $wordEnding === "л" ) {
                                        if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
                                                $word = implode( "", $ar[0] ) . "дүң";
                                        } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
@@ -155,7 +151,7 @@ class LanguageTyv extends Language {
                                                $word = implode( "", $ar[0] ) . "ты";
                                        } else {
                                        }
-                               } elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
+                               } elseif ( $wordEnding === "л" ) {
                                        if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
                                                $word = implode( "", $ar[0] ) . "дү";
                                        } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
@@ -249,6 +245,7 @@ class LanguageTyv extends Language {
                        default:
                                break;
                }
+
                return $word;
        }
 }
index 5215da0..8261f11 100644 (file)
@@ -42,8 +42,8 @@ class LanguageUk extends Language {
                        return $wgGrammarForms['uk'][$case][$word];
                }
 
-               # These rules are not perfect, but they are currently only used for site names so it doesn't
-               # matter if they are wrong sometimes. Just add a special case for your site name if necessary.
+               # These rules don't cover the whole language.
+               # They are used only for site names.
 
                # join and array_slice instead mb_substr
                $ar = array();
@@ -51,40 +51,21 @@ class LanguageUk extends Language {
                if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
                        switch ( $case ) {
                                case 'genitive': # родовий відмінок
-                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' )
-                                               || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' )
-                                       ) {
-                                       } elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ь' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'я';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' ) {
+                                       if ( join( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ії';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ки';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'тей';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ди' ) {
+                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) === 'ти' ) {
+                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'т';
+                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) === 'ди' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'дів';
-                                       } elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' ) {
+                                       } elseif ( join( '', array_slice( $ar[0], -3 ) ) === 'ник' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
                                        }
                                        break;
-                               case 'dative':  # давальний відмінок
-                                       # stub
-                                       break;
                                case 'accusative': # знахідний відмінок
-                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' )
-                                               || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' )
-                                       ) {
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' ) {
+                                       if ( join( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ію';
                                        }
                                        break;
-                               case 'instrumental':  # орудний відмінок
-                                       # stub
-                                       break;
-                               case 'prepositional': # місцевий відмінок
-                                       # stub
-                                       break;
                        }
                }
                return $word;
@@ -99,7 +80,11 @@ class LanguageUk extends Language {
         */
        function commafy( $_ ) {
                if ( !preg_match( '/^\-?\d{1,4}(\.\d+)?$/', $_ ) ) {
-                       return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
+                       return strrev( (string)preg_replace(
+                               '/(\d{3})(?=\d)(?!\d*\.)/',
+                               '$1,',
+                               strrev( $_ )
+                       ) );
                } else {
                        return $_;
                }
diff --git a/languages/classes/data/grammar.ru.json b/languages/classes/data/grammar.ru.json
new file mode 100644 (file)
index 0000000..446163b
--- /dev/null
@@ -0,0 +1,51 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Alexander Sigachov (alexander.sigachov at Googgle Mail)",
+                       "Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)"
+               ],
+               "comment": "These rules don't cover the whole grammar of the language, and are intended only for names of languages and Wikimedia projects."
+       },
+       "genitive": {
+               "(.+)ь$": "$1я",
+               "(.+)ия$": "$1ии",
+               "(.+)ка$": "$1ки",
+               "(.+)ти$": "$1тей",
+               "(.+)ды$": "$1дов",
+               "(.+)д$": "$1да",
+               "(.+)ник$": "$1ника",
+               "(.+)ные$": "$1ных"
+       },
+       "prepositional": {
+               "(.+)ь$": "$1е",
+               "(.+)ия$": "$1ии",
+               "(.+)ка$": "$1ке",
+               "(.+)ти$": "$1тях",
+               "(.+)ды$": "$1дах",
+               "(.+)д$": "$1де",
+               "(.+)ник$": "$1нике",
+               "(.+)ные$": "$1ных"
+       },
+       "languagegen": {
+               "@metadata": "язык в родительном падеже: '(с) русского'",
+               "(.+)кий$": "$1кого",
+               "иврит$": "иврита",
+               "идиш$": "идиша",
+               "(.+)$": "$1"
+       },
+       "languageprep": {
+               "@metadata": "язык в предложном падеже: '(на) русском'",
+               "(.+)кий$": "$1ком",
+               "иврит$": "иврите",
+               "идиш$": "идише",
+               "(.+)$": "$1"
+       },
+       "languageadverb": {
+               "@metadata": "наречие с названием языка: 'по-русски'",
+               "(.+)кий$": "по-$1ки",
+               "иврит$": "на иврите",
+               "идиш$": "на идише",
+               "(идо|урду|хинди|эсперанто)$": "на $1",
+               "(.+)$": "на языке $1"
+       }
+}
index 5bab69a..3cbac2d 100644 (file)
        "searchbutton": "Mita",
        "go": "Jak u",
        "searcharticle": "Jak u",
-       "history": "Riwayat laman",
+       "history": "Riwayat miëng",
        "history_short": "Riwayat",
        "updatedmarker": "geuubah yôh seunaweue keuneulheueh lôn phôn kön",
        "printableversion": "Seunalén rakam",
        "site-atom-feed": "Umpeuën Atôm $1",
        "page-rss-feed": "Umpeuën RSS \"$1\"",
        "page-atom-feed": "Umpeuën Atom \"$1\"",
-       "red-link-title": "$1 (laman hana)",
+       "red-link-title": "$1 (miëng hana)",
        "sort-descending": "Peuurôt tren",
        "sort-ascending": "Peuurôt ék",
-       "nstab-main": "Laman",
+       "nstab-main": "Miëng",
        "nstab-user": "Ureuëng ngui",
        "nstab-media": "Laman media",
-       "nstab-special": "Laman kusuih",
+       "nstab-special": "Miëng kusuih",
        "nstab-project": "Laman buët",
        "nstab-image": "Beureukaih",
        "nstab-mediawiki": "Peusan",
        "nstab-template": "Seunaleuëk",
        "nstab-help": "Beunantu",
        "nstab-category": "Kawan",
+       "mainpage-nstab": "Ôn keuë",
        "nosuchaction": "Hana buët nyan",
        "nosuchactiontext": "Buët nyang geulakèë lé URL nyan hana sah. Droeneuh kadang salah neukeutik URL, atawa neuseutöt saboh neuhubông nyang hana beutôi. Hai nyoë kadang jeuët keu lageuëm saboh bug bak alat leumiëk nyang geungui lé {{SITENAME}}.",
        "nosuchspecialpage": "Hana laman kusuih lagèë nyan",
        "summary": "Éhtisa:",
        "subject": "Bhah/nan:",
        "minoredit": "Nyoë lôn andam bacut",
-       "watchthis": "Kalön laman nyoë",
-       "savearticle": "Keubah laman",
+       "watchthis": "Kalön miëng nyoë",
+       "savearticle": "Keubah miëng",
        "preview": "Eu dilèë",
        "showpreview": "Peuleumah hasé",
        "showdiff": "Peuleumah neuubah",
        "currentrev": "Geunantoë jinoë",
        "currentrev-asof": "Geunantoë barô bak $1",
        "revisionasof": "Geunantoë tiëp $1",
-       "revision-info": "Geunantoë tiëp $1; $2",
+       "revision-info": "Revisi per $1 lé {{GENDER:$6|$2}}$7",
        "previousrevision": "← Geunantoë awai",
        "nextrevision": "Geunantoë lheuëh nyan→",
        "currentrevisionlink": "Geunantoë jinoë",
        "viewprevnext": "Eu ($1 {{int:pipe-separator}} $2)($3)",
        "searchmenu-exists": "'''Na laman ngön nan \"[[:$1]]\" bak wiki nyoe.'''",
        "searchmenu-new": "<strong>Peugöt laman \"[[:$1]]\" bak wiki nyoë!</strong> {{PLURAL:$2|0=|Eu cit laman nyang geurumpok nibak meunita droëneuh.|Eu cit hasé mita nyang geurumpok.}}",
-       "searchprofile-articles": "Laman asoë",
+       "searchprofile-articles": "Miëng asoë",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Ban dum",
        "searchprofile-advanced": "Tingkat lanjut",
        "searchprofile-articles-tooltip": "Mita bak $1",
        "searchprofile-images-tooltip": "Mita beureukaih",
-       "searchprofile-everything-tooltip": "Mita ban dum laman asoë (rôh ôn marit)",
+       "searchprofile-everything-tooltip": "Mita ban dum miëng asoë (rôh ôn marit)",
        "searchprofile-advanced-tooltip": "Mita bak ruweuëng nan meupat-pat",
        "search-result-size": "$1 ({{PLURAL:$2|1 narit|$2 narit}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggeeta|$1 anggeeta}} ({{PLURAL:$2|1 aneuk kawan|$2 aneuk kawan}}, {{PLURAL:$3|1 beureukaih|$3 beureukaih}})",
        "recentchanges-summary": "Di yup nyoë nakeuh neuubah barô nyang na bak Wikipèdia nyoë.\nHareutoë: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = laman barô, '''u''' = neuandam ubeut, '''b''' = neuandam bot, (± ''bit'') = jeumeulah asoë meutamah/meukureuëng, → = neuandam bideuëng, ← = mohtasa otomatis.\n----",
        "recentchanges-noresult": "Hana neuubah lam lheuëng watèë nyoë nyang paih ngön syarat",
        "recentchanges-feed-description": "Seutöt neuubah barô lam wiki bak umpeuën nyoë.",
-       "recentchanges-label-newpage": "Neuandam nyoë jipeugöt laman barô",
+       "recentchanges-label-newpage": "Neuandam nyoë jipeugöt miëng barô",
        "recentchanges-label-minor": "Nyoe neuandam ubeut",
        "recentchanges-label-bot": "Neuandam nyoe geupubuet le bot",
        "recentchanges-label-unpatrolled": "Neuandam nyoe goh lom geukalon",
        "recentchangeslinked-toolbox": "Neuubah teukaw'èt",
        "recentchangeslinked-title": "Neuubah nyang meukaw'èt ngön $1",
        "recentchangeslinked-summary": "Nyoë nakeuh dapeuta neuubah nyang geupeugèt ban-ban nyoë keu on-on nyang meuhubông nibak ôn ka kusuih (atawa keu anggèëta kawan kusuih).\nÔn-ôn bak [[Special:Watchlist|keunalon droeneuh]] geucitak '''teubay'''.",
-       "recentchangeslinked-page": "Nan laman:",
+       "recentchangeslinked-page": "Nan miëng:",
        "recentchangeslinked-to": "Peuleumah neuubah nibak laman-laman nyang mupawôt ngön laman nyang geubri",
        "upload": "Peutamöng beureukaih",
        "uploadbtn": "Peutamong beureukaih",
        "filehist-filesize": "Rayek beureukah",
        "filehist-comment": "Seuneu'ôt",
        "imagelinks": "Seuneungui beureukaih",
-       "linkstoimage": "{{PLURAL:$1|laman}} di yup nyoë mupawôt u beureukaih nyoë:",
+       "linkstoimage": "{{PLURAL:$1|miëng}} di yup nyoë mupawôt u beureukaih nyoë:",
        "nolinkstoimage": "Hana laman nyang na meupawôt u beureukaih nyoë.",
        "sharedupload": "Beureukah nyoë dari $1 ngön kadang geunguy lé buët-buët la’én.",
        "sharedupload-desc-here": "Beureukaih nyoe nejih nibak $1 ngon kadang geunguy le proyek-proyek la'en.\nTeuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
        "mimesearch": "Mita MIME",
        "listredirects": "Dapeuta peuninah",
        "unusedtemplates": "Templat nyang hana geungui",
-       "randompage": "Laman baranggari",
+       "randompage": "Miëng baranggari",
        "randomredirect": "Peuninah saban sakri",
        "statistics": "Keunira",
        "doubleredirects": "Peuninah ganda",
        "protectedpages": "Laman nyang geulindông",
        "listusers": "Dapeuta ureuëng ngui",
        "usercreated": "{{GENDER:$3|Geupeugot}} bak $1 poh $2",
-       "newpages": "Laman barô",
+       "newpages": "Miëng barô",
        "newpages-username": "Ureuëng ngui:",
        "ancientpages": "Laman paléng awai",
        "move": "Pupinah",
        "sp-contributions-submit": "Mita",
        "whatlinkshere": "Peunawôt balék",
        "whatlinkshere-title": "Laman nyang mupawôt u $1",
-       "whatlinkshere-page": "Laman:",
+       "whatlinkshere-page": "Miëng:",
        "linkshere": "Laman-laman nyoë meupawôt u '''[[:$1]]''':",
        "nolinkshere": "Hana halaman nyang teukaw'et u '''[[:$1]]'''.",
        "isredirect": "laman peuninah",
        "block-log-flags-nocreate": "pumeugöt akun geupumaté",
        "movepagetext": "Formulir di yup nyoë geunguy keu jak ubah nan saboh ôn ngön jak peupinah ban dum data riwayat u nan barô. Nan nyang trép euntreuk jeuët keu ôn peupinah u nan nyang barô. Hubông u nan trép hana meu’ubah. Neupeupaseuti keu neupréksa peuninah ôn nyang reulöh atawa meuganda lheuëh neupinah. Droëneuh nyang mat tanggông jaweuëb keu neupeupaseuti meunyo hubông laju teusambông u ôn nyang patôt.\n\nBeu neuingat that meunyo ôn '''h’an''' jan geupeupinah meunyo ka na ôn nyang geunguy nan barô, keucuali meunyo ôn nyan soh atawa nakeuh ôn peuninah ngön hana riwayat andam. Nyoë areutijih Droëneuh jeuët neu’ubah nan ôn keulayi lagèë söt meunyo Droëneuh neupeugöt seunalah, ngön Droëneuh h‘an jeuët neutimpa ôn nyang ka na.\n'''INGAT'''\nNyoë jeuët geupeuakébat neu’ubah nyang h’an neuduga ngön kreuëh ngön bacah keu ôn nyang meuceuhu. Neupeupaseuti Droëneuh meuphôm akébat nibak buët nyoë sigohlom neulanjut.",
        "movepagetalktext": "Ôn peugah haba nyang na hubôngan euntreuk teupinah keudroë '''keucuali meunyo:'''\n\n*Saboh ôn peugah haba nyang hana soh ka na di yup nan barô, atawa\n*Droëneuh hana neubôh tanda cunténg bak kutak di yup nyoë\n\nLam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugabông ôn keudroë.",
-       "movearticle": "Peupinah laman:",
        "newtitle": "U nan barô:",
        "move-watch": "Kalön laman nyoë",
        "movepagebtn": "Peupinah laman",
        "movelogpage": "Log pinah",
        "movereason": "Choë:",
        "revertmove": "peuriwang",
-       "export": "Peuteubiët laman",
+       "export": "Peuteubiët miëng",
        "allmessages": "Peusan sistem",
        "allmessagesname": "Nan",
        "allmessagesdefault": "Naseukah pukok",
        "tooltip-pt-login": "Droëneuh geupadan keu tamong log, bah pih nyan hana geupeuwajéb.",
        "tooltip-pt-logout": "Teubiët",
        "tooltip-pt-createaccount": "Droëneuh geupadan keu neupeugöt saboh akun ngön neutamöng; bah pih nyan hana wajéb",
-       "tooltip-ca-talk": "Marit laman asoë",
-       "tooltip-ca-edit": "Droëneuh jeuët neuandam laman nyoë. Neungui tumbôi eu dilèë sigoh neukeubah.",
+       "tooltip-ca-talk": "Marit miëng asoë",
+       "tooltip-ca-edit": "Andam miëng nyoë",
        "tooltip-ca-addsection": "Puphôn beunagi barô",
        "tooltip-ca-viewsource": "Laman nyoë geulindông.\nDroëneuh jeuët neu’eu nèjih mantöng.",
-       "tooltip-ca-history": "Geunantoë awai nibak laman nyoë",
+       "tooltip-ca-history": "Geunantoë awai nibak miëng nyoë",
        "tooltip-ca-protect": "Peulindông laman nyoë",
        "tooltip-ca-delete": "Sampôh laman nyoë",
        "tooltip-ca-move": "Pupinah laman nyoë",
-       "tooltip-ca-watch": "Tamah laman nyoë u dapeuta kalön droëneuh",
+       "tooltip-ca-watch": "Tamah miëng nyoë u dapeuta kalön droëneuh",
        "tooltip-ca-unwatch": "Sampôh laman nyoë nibak dapeuta kalön droëneuh",
        "tooltip-search": "Mita {{SITENAME}}",
-       "tooltip-search-go": "Mita saboh laman ngon nan nyang peureuséh lagèë nyoë meunyo na",
-       "tooltip-search-fulltext": "Mita laman nyang na asoë lagèë nyoë",
+       "tooltip-search-go": "Mita saboh miëng ngon nan nyang peureuséh lagèë nyoë meunyo na",
+       "tooltip-search-fulltext": "Mita miëng nyang na asoë lagèë nyoë",
        "tooltip-p-logo": "Saweuë ôn keuë",
        "tooltip-n-mainpage": "Saweuë ôn keuë",
        "tooltip-n-mainpage-description": "Saweuë ôn keuë",
        "tooltip-n-portal": "Bhaih buët, peuë nyang jeuët neupubuët, pat keu mita sipeuë hai",
        "tooltip-n-currentevents": "Mita haba barô",
        "tooltip-n-recentchanges": "Dapeuta neuubah barô lam wiki.",
-       "tooltip-n-randompage": "Peudeuih laman baranggari",
+       "tooltip-n-randompage": "Peudeuih miëng baranggari",
        "tooltip-n-help": "Bak mita bantu.",
-       "tooltip-t-whatlinkshere": "Dapeuta ban dum laman wiki nyang mupawôt keunoë",
+       "tooltip-t-whatlinkshere": "Dapeuta ban dum miëng wiki nyang mupawôt keunoë",
        "tooltip-t-recentchangeslinked": "Neuubah barô lam laman nyang meupawôt nibak laman nyoë",
        "tooltip-feed-rss": "Umpeuën RSS keu laman nyoë",
-       "tooltip-feed-atom": "Umpeuën Atom keu laman nyoë",
+       "tooltip-feed-atom": "Umpeuën Atom keu miëng nyoë",
        "tooltip-t-contributions": "Dapeuta beuneuri ureuëng ngui nyoë",
        "tooltip-t-emailuser": "Peu'ét surat-e keu ureuëng ngui nyoë",
        "tooltip-t-upload": "Peutamong beureukaih",
-       "tooltip-t-specialpages": "Dapeuta ban dum laman kusuih",
-       "tooltip-t-print": "Seunalén rakam laman nyoë",
-       "tooltip-t-permalink": "Peunawôt teutap keu geunantoë laman nyoë",
-       "tooltip-ca-nstab-main": "Eu laman asoë",
-       "tooltip-ca-nstab-user": "Eu laman ureuëng ngui",
-       "tooltip-ca-nstab-special": "Nyoë nakeuh laman kusuih nyang h’an jeuët geuandam.",
+       "tooltip-t-specialpages": "Dapeuta ban dum miëng kusuih",
+       "tooltip-t-print": "Seunalén rakam miëng nyoë",
+       "tooltip-t-permalink": "Peunawôt teutap keu geunantoë miëng nyoë",
+       "tooltip-ca-nstab-main": "Eu miëng asoë",
+       "tooltip-ca-nstab-user": "Eu miëng ureuëng ngui",
+       "tooltip-ca-nstab-special": "Nyoë nakeuh miëng kusuih, ngön h’an jeuët geuandam.",
        "tooltip-ca-nstab-project": "Eu laman buët",
-       "tooltip-ca-nstab-image": "Eu laman beureukaih",
+       "tooltip-ca-nstab-image": "Eu miëng beureukaih",
        "tooltip-ca-nstab-template": "Eu seunaleuëk",
        "tooltip-ca-nstab-help": "Eu laman beunantu",
-       "tooltip-ca-nstab-category": "Eu laman kawan",
+       "tooltip-ca-nstab-category": "Eu miëng kawan",
        "tooltip-minoredit": "Bôh tanda keu nyoë sibagoë andam bacut",
        "tooltip-save": "Keubah neuubah Droëneuh",
        "tooltip-preview": "Peuleumah neuubah Droëneuh, neungui nyoë sigohlom neukeubah!",
        "tooltip-summary": "Pasoë éhtisa paneuk",
        "interlanguage-link-title": "$1 – $2",
        "simpleantispam-label": "Paréksa anti-spam.\n<strong>BÈK</strong> neupasoë!",
-       "pageinfo-toolboxlink": "Teuneurang laman",
+       "pageinfo-toolboxlink": "Teuneurang miëng",
        "previousdiff": "← Bida awai",
        "nextdiff": "Geunantoë lheuëh nyan →",
        "file-info-size": "$1 × $2 piksel, rayek beureukaih: $3, MIME jeunèh: $4",
        "exif-yresolution": "Rèsolusi buju",
        "exif-software": "Software geungui",
        "exif-exifversion": "Versi Exif",
+       "exif-colorspace": "Ruweuëng wareuna",
        "exif-datetimedigitized": "Uroë buleuën ngön watèë digital",
        "exif-orientation-1": "Biasa",
        "namespacesall": "ban dum",
        "duplicate-defaultsort": "'''Ingat:''' Gunci meuurot pukok \"$2\" jipeuhiro gunci meuurot pukok \"$1\" sigohlomjih.",
        "version": "Curak",
        "fileduplicatesearch-submit": "Mita",
-       "specialpages": "Laman kusuih",
+       "specialpages": "Miëng kusuih",
        "specialpages-note": "* Laman kusuih biasa.\n* <span class=\"mw-specialpagerestricted\">Laman kusuih geutheun.</span>",
        "specialpages-group-maintenance": "Beuneuri thèë plara",
        "specialpages-group-other": "La'én-la'én",
index 2b6bd58..5a8466f 100644 (file)
        "nstab-template": "Шапхъэ",
        "nstab-help": "IэпыIэгъу нэкIубгъу",
        "nstab-category": "Категорие",
+       "mainpage-nstab": "НэкӀубгъо шъхьаӀ",
        "nosuchaction": "Ащ фэдэ шIагъэ щыIэп",
        "nosuchspecialpage": "Афэдэ специал нэкIубгъо щыIэп",
        "error": "Къончагъэ",
        "cannotdelete-title": "НэкIубгъоу \"$1\" тегъэкIыгъэн лъэкIырэп",
        "badtitle": "ЦӀэ дэгъуэп",
        "badtitletext": "УзкIэупчIэрэ нэкIубгъом ыцIэр къуанчэ, е нэкIы, е бзэзэпыщэ е интервики гъэнэфагъэп.\nМыхъущт символ агъэфедагъэнкIи мэхъу.",
+       "title-invalid-characters": "УзыкIэупчIэрэ нэкIубгъуацIэм символ фыкъуагъэ хэт: \"$1\".",
        "viewsource": "Еплъ лъапсэм",
        "viewsource-title": "Еплъ лъапсэм $1 пае",
        "protectedpagetext": "ЕIэзэнхэм ыкIи нэмыкI шIэнмэ яягъэ къэмыкIынэу мы нэкIубгъор ухъумагъэу щыт.",
        "createaccounterror": "Аккаунт ублэн лъэкIыгъэп: $1",
        "noname": "НэбгырацIэ тэрэз итхагъэп.",
        "loginsuccesstitle": "ШIоу ухэхьагъ",
+       "nosuchusershort": "\"$1\", афэдэ цIэ зиIэу нэбгырэ щыIэп.\nТхыкIэр уплъэкIужь.",
        "nouserspecified": "НэбгырацIэр птхын фае.",
+       "login-userblocked": "Мы нэбгырэр блокыгъэ. Системэм хэхьашъущтэп.",
        "wrongpassword": "ШъэфгущыIэр тэрэзэп.\nДжыри зэ еплъ.",
        "wrongpasswordempty": "ШъэфгущыIэр нэкIы.\nДжыри зэ еплъ.",
        "passwordtooshort": "ШъэфгущыIэр мыхъуми {{PLURAL:$1|1 символ |символ $1}} хъун фае.",
+       "passwordtoolong": "ШъэфгущыIэр мыщ нахь кIыхьэ хъун лъэкIыщтэп: {{PLURAL:$1 символ|$1 символ}}.",
        "password-name-match": "Уи шъэфгущыIэр уи нэбгырацIэм фэдапэ хъущтэп.",
+       "password-login-forbidden": "Мы ныбгырацIэмрэ шъэфгущыIэмрэ бгъэфедэ хъужьыщтэп.",
        "mailmypassword": "Зэтедз шъэфгущыIэр",
        "noemailcreate": "Емэйл тэрэз птхын фае.",
        "mailerror": "Емэйл егъэхьыныр къуанчэ: $1",
        "passwordreset-emailsent": "ШъэфгущыIэм и зэтедзым пае емэйл агъэхьыгъ.",
        "passwordreset-emailsent-capture": "ШъэфгущыIэм изэтедз фэгъэхьыгъэ емэйлыр гъахьыгъэ, ычIэгъкIэ ар олъэгъу.",
        "changeemail": "Зэблэхъу емэйл адресыр",
+       "changeemail-no-info": "Мы нэкIубгъом занкIэу укIонэу уфаемэ, системэм ухэхьэгъэн фае.",
        "changeemail-oldemail": "Джырэ емэйл адрес:",
        "changeemail-newemail": "Емэйл адресыкIэр:",
        "changeemail-none": "(зи)",
        "upload-misc-error": "ЗэхэмышIыкIыгъэ илъхьан фыкъуагъэ",
        "upload-http-error": "HTTP фыкъуагъэ горэ хъугъэ: $1",
        "upload-dialog-title": "Файлыр илъхь",
-       "upload-dialog-error": "Фыкъуагъэ горэ хъугъэ",
        "upload-dialog-button-cancel": "Ыуж икӀ",
        "upload-dialog-button-done": "ЗэшIуэкIыгъэ",
        "upload-dialog-button-save": "Итх",
        "upload-dialog-button-upload": "Илъхь",
-       "upload-dialog-label-select-file": "Къыхэх файл",
-       "upload-dialog-label-infoform-title": "Къэбар",
-       "upload-dialog-label-infoform-name": "ЦIэ",
-       "upload-dialog-label-infoform-description": "АгурыбгъэIон",
-       "upload-dialog-label-usage-title": "Гъэфедэныгъэ",
-       "upload-dialog-label-usage-filename": "ФайлыцIэ",
+       "upload-process-error": "Фыкъуагъэ горэ хъугъэ",
+       "upload-form-label-select-file": "Къыхэх файл",
+       "upload-form-label-infoform-title": "Къэбар",
+       "upload-form-label-infoform-name": "ЦIэ",
+       "upload-form-label-infoform-description": "АгурыбгъэIон",
+       "upload-form-label-usage-title": "Гъэфедэныгъэ",
+       "upload-form-label-usage-filename": "ФайлыцIэ",
        "backend-fail-notexists": "Файлэу $1 щыIэп.",
        "backend-fail-delete": "Файлэу \"$1\" тегъэкIын лъэкIырэп.",
        "backend-fail-read": "Файлэу \"$1\" еплъын лъэкIырэп.",
index 906ef0c..13f4fb1 100644 (file)
        "mergehistory-go": "عرض التعديلات القابلة للدمج",
        "mergehistory-submit": "دمج المراجعات",
        "mergehistory-empty": "لا مراجعات يمكن دمجها.",
-       "mergehistory-success": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح في [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من $1 تم دمجها بنجاح في [[:$2]].",
        "mergehistory-fail": "غير قادر على عمل دمج التاريخ، من فضلك أعد التحقق من محددات الصفحة والزمن.",
        "mergehistory-no-source": "الصفحة المصدر $1 غير موجودة.",
        "mergehistory-no-destination": "الصفحة الهدف $1 غير موجودة.",
index d1a8fd4..ccb628d 100644 (file)
@@ -22,7 +22,8 @@
                        "아라",
                        "Macofe",
                        "Fwolff",
-                       "Oesjaar"
+                       "Oesjaar",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Onderstreep skakels.",
        "nstab-template": "Sjabloon",
        "nstab-help": "Hulpblad",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Voorblad",
        "nosuchaction": "Ongeldige aksie",
        "nosuchactiontext": "Die opdrag in die URL is ongeldig.\nU het moontlik 'n tikfout gemaak of 'n ongeldige skakel gevolg.\nDit kan ook dui op 'n fout in die sagteware van {{SITENAME}}.",
        "nosuchspecialpage": "Ongeldige spesiale bladsy",
        "invalid-content-data": "Ongeldige inhoud",
        "content-not-allowed-here": "\"$1\" word nie op bladsy [[$2]] toegelaat nie.",
        "editwarning-warning": "As u hierdie bladsy verlaat, verloor u moontlik al die wysigings wat u aangebring het.\nIndien u aangemeld is, kan u hierdie waarskuwing in die \"Wysigings\"-afdeling van u voorkeure afskakel.",
+       "editpage-notsupportedcontentformat-title": "Inhoudsformaat word nie ondersteun nie",
        "content-model-wikitext": "Wikiteks",
        "content-model-text": "eenvoudige teks",
        "content-model-javascript": "JavaScript",
        "mergehistory-go": "Wys versmeltbare wysigings",
        "mergehistory-submit": "Versmelt weergawes",
        "mergehistory-empty": "Geen weergawes kan versmelt word nie.",
-       "mergehistory-success": "$3 {{PLURAL:$3|weergawe|weergawes}} van [[:$1]] is suksesvol versmelt met [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|weergawe|weergawes}} van $1 is suksesvol versmelt met [[:$2]].",
        "mergehistory-fail": "Kan nie geskiedenis versmelt nie, kontroleer asseblief die bladsy- en tydinstellings.",
        "mergehistory-no-source": "Bronbladsy $1 bestaan nie.",
        "mergehistory-no-destination": "Bestemmingsbladsy $1 bestaan nie.",
        "upload-too-many-redirects": "Die URL bevat te veel aansture",
        "upload-http-error": "'n HTTP-fout het voorgekom: $1",
        "upload-copy-upload-invalid-domain": "Gekopieerde oplaaie word nie vanuit die domein toegelaat nie.",
+       "upload-dialog-title": "Laai lêer op",
+       "upload-dialog-button-cancel": "Kanselleer",
+       "upload-dialog-button-done": "Gedoen",
+       "upload-dialog-button-save": "Stoor",
+       "upload-dialog-button-upload": "Oplaai",
+       "upload-process-error": "'n Fout het voorgekom",
+       "upload-process-warning": "'n Waarskuwing is uitgereik",
+       "upload-form-label-select-file": "Kies lêer",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Naam",
+       "upload-form-label-infoform-description": "Beskrywing",
+       "upload-form-label-usage-title": "Gebruik",
+       "upload-form-label-usage-filename": "Lêernaam",
        "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.",
        "filerevert-legend": "Maak lêer ongedaan",
        "filerevert-intro": "U is besig om die lêer '''[[Media:$1|$1]]''' terug te rol tot die [$4 weergawe op $2, $3]",
        "filerevert-comment": "Rede:",
-       "filerevert-defaultcomment": "Teruggerol na die weergawe van $1, $2",
+       "filerevert-defaultcomment": "Teruggerol na die weergawe van $1, $2 ($3)",
        "filerevert-submit": "Rol terug",
        "filerevert-success": "'''[[Media:$1|$1]]''' is teruggerol na die [$4 weergawe op $2, $3].",
        "filerevert-badversion": "Daar is geen vorige plaaslike weergawe van die lêer vir die gespesifiseerde tydstip nie.",
        "pager-older-n": "{{PLURAL:$1|ouer 1|ouer $1}}",
        "suppress": "Toesig",
        "querypage-disabled": "Hierdie spesiale bladsy is afgeskakel om werkverrigting te verbeter (bediener is oorlaai).",
+       "apihelp-no-such-module": "Module \"$1\" nie gevind nie.",
        "booksources": "Boekbronne",
        "booksources-search-legend": "Soek vir boekbronne",
        "booksources-search": "Soek",
        "rollback-success": "Wysigings deur $1 is teruggerol.\nDie laaste weergawe van $2 is teruggeplaas.",
        "sessionfailure-title": "Sessie het gefaal",
        "sessionfailure": "Dit lyk of daar 'n probleem met u sessie is.\nHierdie aksie is gekanselleer omdat dit 'n veiligheidsrisiko is (moontlike kaping van u sessie).\nGaan een bladsy terug, herlaai die bladsy en probeer dan weer.",
+       "changecontentmodel-reason-label": "Rede:",
        "protectlogpage": "Beskermingboekstaaf",
        "protectlogtext": "Hieronder is 'n lys van veranderinge wat aan die beveilig van bladsye aangebring is.\nSien die [[Special:ProtectedPages|lys van beveiligde bladsye]] vir alle bladsye wat tans operasioneel beveilig is.",
        "protectedarticle": "het [[$1]] beskerm",
        "movepagetext": "ie vorm hier onder hernoem 'n bladsy en skuif die hele wysigingsgeskiedenis na die nuwe naam.\nDie ou bladsy sal vervang word met 'n aanstuurblad na die nuwe titel.\n'''Skakels na die ou bladsytitel sal nie outomaties verander word nie; maak seker dat [[Special:DoubleRedirects|dubbele aanstuurverwysings]] en [[Special:BrokenRedirects|stukkende aansture]] nie voorkom nie deur die \"wat skakel hierheen\"-funksie na die skuif te gebruik.''' Dit is u verantwoordelikheid om seker te maak dat skakels steeds wys na waarheen hulle behoort te gaan.\n\nLet daarop dat 'n bladsy '''nie''' geskuif sal word indien daar reeds 'n bladsy met dieselfde titel bestaan nie, tensy dit leeg of 'n aanstuurbladsy is en geen wysigingsgeskiedenis het nie. Dit beteken dat u 'n bladsy kan terugskuif na sy ou titel indien u 'n fout gemaak het, maar u kan nie 'n bestaande bladsy oorskryf nie.\n\n<b>WAARSKUWING!</b>\nHierdie kan 'n drastiese en onverwagte verandering vir 'n gewilde bladsy wees;\nmaak asseblief seker dat u die gevolge van hierdie aksie verstaan voordat u voortgaan. Gebruik ook die ooreenstemmende besprekingsbladsy om oorleg te pleeg met ander bydraers.",
        "movepagetext-noredirectfixer": "Die vorm hier onder hernoem 'n bladsy en skuif sy hele wysigingsgeskiedenis na die nuwe naam.\nDie ou bladsy sal vervang word met 'n aanstuurblad na die nuwe titel.\nWees asseblief op die uitkyk vir vir [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|stukkende aansture]].\nDit is u verantwoordelikheid om seker te maak dat skakels steeds wys na waarheen hulle behoort te gaan.\n\nLet daarop dat 'n bladsy '''nie''' geskuif sal word indien daar reeds 'n bladsy met dieselfde titel bestaan nie, tensy dit leeg of 'n aanstuurbladsy is en geen wysigingsgeskiedenis het nie. Dit beteken dat u 'n bladsy kan terugskuif na sy ou titel indien u 'n fout begaan het, maar u kan nie 'n bestaande bladsy oorskryf nie.\n\n<b>WAARSKUWING!</b>\nHierdie kan 'n drastiese en onverwagte verandering vir 'n gewilde bladsy wees;\nmaak asseblief seker dat u die gevolge van hierdie aksie verstaan voordat u voortgaan.",
        "movepagetalktext": "Die ooreenstemmende besprekingsblad sal outomaties saam geskuif word, '''tensy:'''\n*'n Besprekengsblad met die nuwe naam reeds bestaan, of\n*U die keuse hier onder deselekteer.\n\nIndien wel sal u self die blad moet skuif of versmelt (indien nodig).",
-       "movearticle": "Skuif bladsy",
        "moveuserpage-warning": "'''Waarskuwing:''' U gaan 'n gebruikersblad skuif.\nLet daarop dat slegs die bladsy geskuif sal word. Die gebruiker self sal ''nie'' hernoem word ''nie''.",
        "movenologintext": "U moet 'n geregistreerde gebruiker wees en [[Special:UserLogin|ingeteken]]\nwees om 'n bladsy te skuif.",
        "movenotallowed": "U het nie regte om bladsye te skuif nie.",
        "tooltip-ca-nstab-main": "Bekyk die inhoudbladsy",
        "tooltip-ca-nstab-user": "Bekyk die gebruikerbladsy",
        "tooltip-ca-nstab-media": "Bekyk die mediabladsy",
-       "tooltip-ca-nstab-special": "Hierdie is 'n spesiale bladsy; u kan dit nie wysig nie",
+       "tooltip-ca-nstab-special": "Hierdie is 'n spesiale bladsy wat nie wysig kan word nie",
        "tooltip-ca-nstab-project": "Bekyk die projekbladsy",
        "tooltip-ca-nstab-image": "Bekyk die lêerbladsy",
        "tooltip-ca-nstab-mediawiki": "Bekyk die stelselboodskap",
        "version-entrypoints-header-url": "URL",
        "version-libraries-library": "Biblioteek",
        "version-libraries-version": "Weergawe",
+       "version-libraries-license": "Lisensie",
+       "version-libraries-description": "Beskrywing",
+       "version-libraries-authors": "Outeurs",
        "redirect": "Aanstuur volgens lêer, gebruiker, bladsy of weergawenommer",
        "redirect-legend": "Aanstuur na 'n lêer of bladsy",
        "redirect-summary": "Hierdie spesiale bladsy stuur aan na 'n lêer (as 'n lêernaam verskaf word), 'n bladsy (as 'n weergawe-nommer verskaf word) of 'n gebruikersblad (as 'n gebruiker-ID verskaf word).",
        "tags-tag": "Etiketnaam",
        "tags-display-header": "Weergawe in wysigingslyste",
        "tags-description-header": "Volledige beskrywing van betekenis",
+       "tags-source-header": "Bron",
        "tags-active-header": "Aktief?",
        "tags-hitcount-header": "Geëtiketteerde veranderings",
+       "tags-actions-header": "Aksies",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nee",
+       "tags-source-none": "Nie meer in gebruik nie",
        "tags-edit": "wysig",
+       "tags-delete": "skrap",
+       "tags-activate": "aktiveer",
+       "tags-deactivate": "deaktiveer",
        "tags-hitcount": "$1 {{PLURAL:$1|wysiging|wysigings}}",
+       "tags-create-reason": "Rede:",
+       "tags-create-submit": "Skep",
+       "tags-delete-reason": "Rede:",
+       "tags-activate-reason": "Rede:",
+       "tags-activate-submit": "Aktiveer",
+       "tags-deactivate-reason": "Rede:",
+       "tags-edit-existing-tags-none": "''Geen''",
+       "tags-edit-reason": "Rede:",
        "comparepages": "Vergelyk bladsye",
        "compare-page1": "Bladsy 1",
        "compare-page2": "Bladsy 2",
        "rightsnone": "(geen)",
        "revdelete-summary": "redigeringsopsomming",
        "feedback-adding": "U terugvoer word op die bladsy geplaas...",
+       "feedback-back": "Terug",
        "feedback-bugcheck": "Gaaf! Kontroleer of dit nie dalk een van die [$1 bekende foute] is nie.",
        "feedback-bugnew": "Ek het gekontroleer. Rapporteer 'n nuwe fout.",
        "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-subject": "Onderwerp:",
        "feedback-submit": "Dien in",
        "feedback-thanks": "Dankie! U terugvoer is op die bladsy \"[$2 $1]\" geplaas.",
+       "feedback-thanks-title": "Baie dankie!",
        "searchsuggest-search": "Soek",
        "searchsuggest-containing": "bevat...",
        "api-error-badaccess-groups": "U word nie toegelaat om lêers te laai op hierdie wiki.",
        "api-error-badtoken": "Interne fout: slegte teken.",
        "api-error-copyuploaddisabled": "Oplaai via URL is gedeaktiveer op hierdie bediener.",
-       "api-error-duplicate": "Daar {{PLURAL:$1|is al [$2 'n lêer]|is al [$2 lêers]}} met dieselfde inhoud op die wiki.",
-       "api-error-duplicate-archive": "Daar {{PLURAL:$1|was [$2 'n ander lêer]|was [$2 ander lêers]}} op hierdie webtuiste met dieselfde inhoud, maar {{PLURAL:$1|dit is|dit is}} geskrap.",
-       "api-error-duplicate-archive-popup-title": "Duplikaat{{PLURAL:$1|lêer|lêers}} wat al verwyder is.",
-       "api-error-duplicate-popup-title": "Duplikaat{{PLURAL:$1|lêer|lêers}}",
+       "api-error-duplicate": "Daar {{PLURAL:$1|is al 'n lêer|is al lêers}} met dieselfde inhoud op die wiki.",
+       "api-error-duplicate-archive": "Daar {{PLURAL:$1|was 'n ander lêer|was ander lêers}} op hierdie webtuiste met dieselfde inhoud, maar {{PLURAL:$1|dit is|dit is}} geskrap.",
        "api-error-empty-file": "Die lêer wat u probeer oplaai is leeg.",
        "api-error-emptypage": "Die skep van leë nuwe bladsye word nie toegelaat nie.",
        "api-error-fetchfileerror": "Interne fout: Iets het verkeerd gegaan met die haal van die lêer.",
        "mediastatistics-header-executable": "Uitvoerbare lêers",
        "mediastatistics-header-archive": "Gekompakteerde lêers",
        "json-error-syntax": "Sintaksfout",
+       "headline-anchor-title": "Skakel na die afdeling",
        "special-characters-group-latin": "Latyns",
        "special-characters-group-latinextended": "Latyns uitgebreid",
        "special-characters-group-ipa": "IFA",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "mw-widgets-dateinput-no-date": "Geen datum gekies nie",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
+       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "mw-widgets-titleinput-description-new-page": "bladsy bestaan nog nie",
+       "mw-widgets-titleinput-description-redirect": "aanstuur na $1"
 }
index 3b8eee3..77d5e69 100644 (file)
@@ -7,7 +7,8 @@
                        "Mdupont",
                        "아라",
                        "Ammartivari",
-                       "Olsi"
+                       "Olsi",
+                       "Kosovastar"
                ]
        },
        "tog-underline": "Nënvizoji vegzat",
        "nohistory": "Nuk ka histori redaktimesh për këtë faqe.",
        "currentrev": "Versioni i tanishëm",
        "currentrev-asof": "Redaktimi aktual i datës $1",
-       "revisionasof": "Versioni i $1",
+       "revisionasof": "Versioni i datës $1",
        "revision-info": "Versioni me $1 nga $2",
        "previousrevision": "← Verzion ma i vjetër",
        "nextrevision": "Redaktimi mâ i ri →",
        "mergehistory-go": "Trego redaktimet e bashkueshme",
        "mergehistory-submit": "Bashko versionet",
        "mergehistory-empty": "Nuk ka versione të bashkueshme.",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versione}} të [[:$1]] janë bashkuar me sukses në [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versione}} të $1 janë bashkuar me sukses në [[:$2]].",
        "mergehistory-fail": "Nuk munda të bashkoj historikun, ju lutem kontrolloni përzgjedhjen e faqes dhe të kohës.",
        "mergehistory-no-source": "Faqja e burimit $1 nuk ekziston.",
        "mergehistory-no-destination": "Faqja mbledhëse $1 nuk ekzsiton.",
        "block-log-flags-nocreate": "krijimi i llogarive âsht pamundësue",
        "movepagetext": "Me formularin e maposhtëm mund ta ndërrosh titullin e faqes, tue zhvendosë krejt prapavijën e saj te titulli i ri.\n\nTitulli i vjetër do të bahet faqe përcjellëse te titulli e ri.\n\nMundesh t'i freskosh automatikisht përcjelljet që tregojnë në titullin e kryehershëm.\n\nNëse zgjedhë mos me i freskue, sigurohu që i ke kontrollue [[Special:DoubleRedirects|përcjelljet e dyfishta]] apo [[Special:BrokenRedirects|të damtueme]].\n\nTi je përgjegjës që vegzat me çue atje ku duhet.\n\n\nVeneroje që faqja '''nuk''' do të zhvendoset nëse nji faqe me të njejtin titull tashma ekziston, përveç nëse asht e shprazët apo vetëm përcjellëse dhe nuk ka histori të redaktimit.\n\nKjo domethanë që mund ta rikthesh titullin e faqes aty ku ka qenë nëse ke ba gabim dhe nuk mund ta mbishkruesh nji faqe ekzistuese.\n\n\n'''Kujdes!'''\n\nKy mund të jetë ndryshim drastik dhe i papritun për nji faqe të popullarizueme;\n\ntë lutem, sigurohu që i ke parasysh pasojat para se të vazhdosh.",
        "movepagetalktext": "Faqja e diskutimit që lidhet me këtë faqe do të zhvendoset automatikisht '''përveç:'''\n*Nëse ekziston nji faqe e diskutimit nën titullin e ri, apo\n*E shêjoni të pazgjedhun kutinë e mâposhtme.\n\nNë këto raste, duheni me i bashkue manualisht këto faqe nëse dëshironi.",
-       "movearticle": "Zhvendose faqen",
        "newtitle": "Te titulli i ri",
        "move-watch": "Mbikqyre kët faqe",
        "movepagebtn": "Zhvendose faqen",
index 1a649c8..720a77c 100644 (file)
@@ -8,7 +8,8 @@
                        "Romaine",
                        "Solomon",
                        "Teferra",
-                       "아라"
+                       "아라",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "በመያያዣ ስር አስምር",
        "mergehistory-go": "መዋሐድ የሚችሉ እትሞች ይታዩ",
        "mergehistory-submit": "እትሞቹን ለማዋሐድ",
        "mergehistory-empty": "ምንም ዕትም ማዋሐድ አይቻልም።",
-       "mergehistory-success": "ከ[[:$1]] $3 {{PLURAL:$3|እትም|እትሞች}} ወደ [[:$2]] መዋሐዱ ተከናወነ።",
+       "mergehistory-done": "ከ$1 $3 {{PLURAL:$3|እትም|እትሞች}} ወደ [[:$2]] መዋሐዱ ተከናወነ።",
        "mergehistory-fail": "የታሪክ መዋሐድ አይቻልም፤ እባክዎ የገጽና የጊዜ ግቤቶች እንደገና ይመለከቱ።",
        "mergehistory-no-source": "መነሻው ገጽ $1 አይኖርም።",
        "mergehistory-no-destination": "መድረሻው ገጽ $1 አይኖርም።",
        "move-page-legend": "የሚዛወር ገጽ",
        "movepagetext": "ከታች የሚገኘው ማመልከቻ ተጠቅመው የገጹ ስም መለወጥ ይችላሉ፤ የቀድሞው ገፅ ታሪክ ደግሞ ሙሉ በሙሉ ወደ አዲሱ ይዘዋወራል።\nየቀድሞው ርዕስ ለአዲሱ ገፅ እንደ መምሪያ ወይም መጠቆሚያ ገፅ በመሆን ያገለግላይ።\nእርስዎ ከትክክለኛውንና ከዋናው ገፅ ጋር በቀጥታ እንዲገናኝ ማድረግና ማስተካከል ይችላሉ\nይህ አንዳይሆን ከመረጡ ደግሞ ወይ [[Special:DoubleRedirects|double]] አልያም [[Special:BrokenRedirects|broken redirects]] መምረጥዎን እርግጠኛ ይሁኑ።\nነገር ግን በስርአት መቆራኘታቸውን ማረጋገጥና እርግጠኛ የመሆን አላፊነትና ግዴታ አለብዎት።\n\nልብ ይበሉ፦ አዲስ ለሰጡት ርዕስ ተመሳሳይ ርዕስ ያለው ሌላ ገጽ ቀድሞ ካለ እናም ገፁ ባዶ ካልሆነ መይም ለሌላ ገፅ መምሪያ ካልሆነ አልያም ምንም ታሪክ የሌለው\nካልሆነ በስተቀር ገጽን ወደዚያ ለማዛወር '''የማይቻል''' ነው።\nይህ ማለት ደግሞ ገፅ ቀድሞ ይጠራበት ወደነበረበት ቦታ መመልስ ይችላሉ ነገር ግን ቀድሞ በነበረ ገፅ ላይ ደርበው መፃፍ ግን አይችሉም\n\n'''ማስጠንቀቂያ፦'''\nበጣም ለተወደደ ወይም ብዙ ጊዜ ለሚነበብ ገጽ እንዲህ ያለ ለውጥ ማድረግ አደገኛና ከፍተኛ ጥንቃቄን የሚጠይቅ ነው። ስለዚህ እባክዎ ለውጥ ከማድረግዎ በፊት ሂደቱን መሚገባ እንደተረዱት እንግጠኛ ይሁኑ።",
        "movepagetalktext": "አብዛኛው ጊዜ፣ ከዚሁ ገጽ ጋራ የሚገናኘው የውይይት ገጽ አንድላይ ይዛወራል፤ '''ነገር ግን፦'''\n\n* ገጹን ወደማይመሳስል ክፍለ-ዊኪ (ለምሳሌ Mediawiki:) ቢያዛውሩት፤\n* ባዶ ያልሆነ ውይይት ገጽ ቅድሞ ቢገኝ፤ ወይም\n* እታች ከሚገኘውን ሳጥን ምልክቱን ካጠፉ፤\n:\n:ከነውይይቱ ገጽ አንድላይ አይዛወሩም። የዚያን ጊዜ የውይይቱን ገጽ ለማዛወር ከወደዱ በእጅ ማድረግ ያስፈልግዎታል።",
-       "movearticle": "የቆየ አርእስት፡",
        "movenologintext": "ገጽ ለማዛወር [[Special:UserLogin|በብዕር ስም መግባት]] ይኖርብዎታል።",
        "movenotallowed": "በዚህ ዊኪ ገጾችን ለማዛወር ፈቃድ የለዎም።",
        "movenotallowedfile": "ፋይልን ለማዛወር ፈቃድ የለዎም።",
        "api-error-badaccess-groups": "እርስዎ በዚህ ውኪ ላይ ፋይል እንድሊኩ አልተፈቀደም።",
        "api-error-badtoken": "የውስጥ ስህተት: መጥፎ ጥቅል።",
        "api-error-copyuploaddisabled": "በሰነድ አድራሻ መላክ በዚህ አቅራቢ ላይ አልተፈቀደም።",
-       "api-error-duplicate": "በዚህ ድረ ገጽ ላይ የዚህ ዓይነት ይዞታ {{PLURAL:$1| [$2 ያለው ፋይል አለ።] | [$2 ያላቸው ፍይሎች አሉ።]}}",
-       "api-error-duplicate-popup-title": "አንድ አይነት {{PLURAL:$1|ፋይል|ፋይሎች}}",
+       "api-error-duplicate": "በዚህ ድረ ገጽ ላይ የዚህ ዓይነት ይዞታ {{PLURAL:$1| ያለው ፋይል አለ። | ያላቸው ፍይሎች አሉ።}}",
        "api-error-empty-file": "የላኩት ፋይል ባዶ ነበር።",
        "api-error-fetchfileerror": "የውስጥ ስህተት: ፍይሉ ሲመጣ ችግር ተፈጠረ።",
        "api-error-file-too-large": "የላኩት ፋይል በጣም ትልቅ ነበር።",
index 3351302..fdd7e56 100644 (file)
@@ -13,7 +13,8 @@
                        "아라",
                        "Macofe",
                        "Carlos Cristia",
-                       "MarcoAurelio"
+                       "MarcoAurelio",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Subrayar os vinclos:",
        "mergehistory-go": "Amostrar edicions fusionables",
        "mergehistory-submit": "Fusionar versions",
        "mergehistory-empty": "No puede fusionar-se garra revisión.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisión|revisions}} de [[:$1]] {{PLURAL:$3|fusionata|fusionatas}} correctament con [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisión|revisions}} de $1 {{PLURAL:$3|fusionata|fusionatas}} correctament con [[:$2]].",
        "mergehistory-fail": "No s'ha puesto fusionar os dos historials, por favor comprebe a pachina y os parametros de tiempo.",
        "mergehistory-no-source": "A pachina d'orichen $1 no existe.",
        "mergehistory-no-destination": "A pachina de destino $1 no existe.",
        "filerevert-legend": "Revertir fichero",
        "filerevert-intro": "Ye revertindo '''[[Media:$1|$1]]''' a la [$4 versión de $3, $2].",
        "filerevert-comment": "Razón:",
-       "filerevert-defaultcomment": "Revertito t'a versión de $1, $2",
+       "filerevert-defaultcomment": "Revertito t'a versión de $1, $2 ($3)",
        "filerevert-submit": "Revertir",
        "filerevert-success": "S'ha revertito '''[[Media:$1|$1]]''' a la [$4 versión de $3, $2].",
        "filerevert-badversion": "No bi ha garra versión antiga d'o fichero con ixa calendata y hora.",
        "movepagetext": "Fendo servir o formulario siguient se cambiará o nombre d'a pachina, tresladando tot o suyo historial t'o nuevo nombre.\nO títol anterior se tornará en una reendrecera ta o nuevo títol.\nPuede esviellar automaticament as reendreceras que plegan ta o títol orichinal.\nSi s'estima más de no fer-lo, asegure-se de no deixar [[Special:DoubleRedirects|reendreceras doples]] u [[Special:BrokenRedirects|trencatas]].\nYe a suya responsabilidat d'asegurar-se que os vinclos continan endrezando t'a on que habrían de fer-lo.\n\nRemere que a pachina '''no''' se renombrará si ya existe una pachina con o nuevo títol, si no ye que estase una pachina vueda u una ''reendrecera'' sin historial.\nIsto significa que podrá tresladar una pachina ta o suyo títol orichinal si ha feito una error, pero no podrá escribir dencima d'una pachina ya existent.\n\n'''¡PARE CUENTA!'''\nIste puede estar un cambio drastico e inasperato ta una pachina popular;\npor favor, asegure-se d'entender as conseqüencias que tendrá ista acción antes de seguir enta debant.",
        "movepagetext-noredirectfixer": "Fendo servir o formulario siguient se cambiará o nombre d'a pachina, tresladando tot o suyo historial t'o nuevo nombre.\nO títol anterior se tornará en una reendrecera ta o nuevo títol.\nAsegure-se de no deixar [[Special:DoubleRedirects|reendreceras doples]] u [[Special:BrokenRedirects|trencatas]].\nYe a suya responsabilidat d'asegurar-se que os vinclos continan endrezando ent'a on que habrían de fer-lo.\n\nRemere que a pachina '''no''' se renombrará si ya existe una pachina con o nuevo títol, de no estar que fuese una pachina vueda u una ''reendrecera'' sin historial.\nIsto significa que podrá tresladar una pachina ta o suyo titol orichinal si ha feito una error, pero no podrá escribir dencima d'una pachina ya existent.\n\n'''¡PARE CUENTA!'''\nIste puede estar un cambio drastico e inasperato ta una pachina popular;\npor favor, asegure-se d'entender as conseqüencias que tendrá ista acción antes de seguir enta debant.",
        "movepagetalktext": "A pachina de descusión asociata será tresladata automaticament '''de no estar que:'''\n\n*Ya exista una pachina de descusión no vueda con o nombre nuevo, u\n*Desactive a caixeta d'abaixo.\n\nEn ixos casos, si lo deseya, habrá de tresladar u combinar manualment o conteniu d'a pachina de descusión.",
-       "movearticle": "Tresladar pachina:",
        "moveuserpage-warning": "'''Pare cuenta:''' ye en momentos de tresladar una pachina d'usuario. Pare cuenta en que nomás a pachina será tresladada peor l'usuario '''no''' será renombrau.",
        "movenologintext": "Amenista estar un usuario rechistrato y [[Special:UserLogin|aber-se identificato encetando una sesión]] ta tresladar una pachina.",
        "movenotallowed": "No tiene premisos ta tresladar pachinas.",
        "api-error-badaccess-groups": "No puetz cargar fichers en iste wiki.",
        "api-error-badtoken": "Error interna: Simbolo incorrecto.",
        "api-error-copyuploaddisabled": "A puyada por URL ye desactivada en iste servidor.",
-       "api-error-duplicate": "Ya existe{{PLURAL:$1| [$2 unatro fichero]|[$2 belatros fichers]}} en o puesto con o mesmo conteniu.",
-       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existiba [$2 unatro fichero]|existiban [$2 atros fichers]}} en o puesto con o mesmo conteniu, pero {{PLURAL:$1|estió|estioron}} {{PLURAL:$1|eliminau|eliminaus}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fichero|Fichers}} {{PLURAL:$1|duplicau|duplicaus}} que ya s'han eliminau",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fichero|Fichers}} {{PLURAL:$1|duplicau|duplicaus}}",
+       "api-error-duplicate": "Ya existe {{PLURAL:$1|unatro fichero|belatros fichers}} en o puesto con o mesmo conteniu.",
+       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existiba unatro fichero|existiban atros fichers}} en o puesto con o mesmo conteniu, pero {{PLURAL:$1|estió eliminau|estioron eliminaus}}.",
        "api-error-empty-file": "O fichero que ninvió yera vuedo.",
        "api-error-emptypage": "No se permite a creyación de pachinas nuevas en blanco.",
        "api-error-fetchfileerror": "Error interna: Bella cosa salió malament mientres s'obteneba o fichero.",
index 1ecde6a..66d452e 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Angpradesh",
                        "Vinitutpal",
-                       "아라"
+                       "아라",
+                       "Samyo"
                ]
        },
        "tog-underline": " कड़ी अधोरेखित करना:",
        "tog-hidepatrolled": "निगरानी मॆं करलॊ गेलॊ संपादनॊ कॆ हाल के बदलावॊ मॆं नै देखाबॊ",
        "tog-newpageshidepatrolled": "निगरानी वाला पन्ना कॆ नया पन्ने वाला सूची मॆं नै देखाबॊ",
        "tog-extendwatchlist": "ध्यान सूची मॆं सब्भे बदलाव दर्शाबॊ, सिर्फ हाले के नै",
-       "tog-usenewrc": "हाल à¤®à¥\86à¤\82 à¤¹à¥\8bलà¥\8a à¤µà¤°à¥\8dधित à¤¬à¤¦à¤²à¤¾à¤µ (à¤\9cावासà¥\8dà¤\95à¥\8dरà¥\80पà¥\8dà¤\9f à¤\95à¥\87 à¤\9cरà¥\82रत à¤\9bà¥\88)",
+       "tog-usenewrc": "हाल à¤®à¤\82à¥\91 à¤¹à¥\8bलऽ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनऽ à¤\86रà¥\82 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¤\82à¥\91 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनऽ à¤\95à¥\91 à¤ªà¥\83षà¥\8dठ à¤\85नà¥\81सार à¤¸à¤®à¥\82हऽ à¤®à¤\82à¥\91 à¤¬à¤¾à¤\81à¤\9fऽ",
        "tog-numberheadings": "शीर्षक स्वयं-क्रमांकित करॊ",
-       "tog-showtoolbar": "एडिट टूलबार दर्शाबॊ (जावास्क्रीप्ट)",
-       "tog-editondblclick": "दू-बार क्लीक करी कॆ पन्ना संपादित करॊ (जावास्क्रीप्ट)",
-       "tog-editsectiononrightclick": "विभाग शीर्षक पर दायाँ क्लीक करीकॆ संपादन करै के अनुमती दॆ (जावास्क्रीप्ट)",
-       "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": "हमरà¥\8a à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\86à¤\82 à¤¦à¤°à¥\8dà¤\9c़ à¤ªà¤¨à¥\8dना à¤¬à¤¦à¤²à¤²à¤¾ à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤¹à¤®à¤°à¤¾ à¤\87-मà¥\87ल à¤\95रà¥\8a",
+       "tog-enotifwatchlistpages": "हमरऽ à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¤\82à¥\91 à¤¦à¤°à¥\8dà¤\9c़ à¤ªà¤¨à¥\8dना à¤\86रà¥\82 à¤«à¤¾à¤\87ल à¤¬à¤¦à¤²à¤²à¤¾ à¤ªà¤° à¤¹à¤®à¤°à¤¾ à¤\87-मà¥\87ल à¤\95रऽ",
        "tog-enotifusertalkpages": "हमरॊ सदस्य वार्ता पृष्ठ पर बदलाव होला सॆं हमरा इ-मेल करॊ",
-       "tog-enotifminoredits": "तनी-मनी बदलावॊ लेली भी हमरा इ-मेल भेजॊ",
+       "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-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": "मंगलवार",
        "thursday": "गुरुवार",
        "friday": "शुक्रवार",
        "saturday": "शनिचर",
+       "sun": "रवि",
+       "mon": "सोम",
+       "tue": "मंगल",
+       "wed": "बुध",
+       "thu": "गुरू",
+       "fri": "शुक्र",
+       "sat": "शनि",
        "january": "जनवरी",
        "february": "फ़रवरी",
        "march": "मार्च",
        "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\" à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 लेख",
+       "category_header": "\"$1\" à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¤\82à¥\91 लेख",
        "subcategories": "उपविभाग",
-       "hidden-categories": "{{PLURAL:$1|छुपैलॊ श्रेणी|छुपैलॊ श्रेणी सीनी}}",
-       "category-subcat-count": "{{PLURAL:$2|इ श्रेणी मॆं सिर्फ निम्नलिखित उपश्रेणी छै|इ श्रेणी मॆं निम्नलिखित {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणी सीनी}} छै, कुल उपश्रेणी सीनी $2}}",
-       "category-article-count": "{{PLURAL:$2|इ श्रेणी मॆं सिर्फ निम्नलिखित लेख छै.|इ श्रेणी मॆं निम्नलिखित {{PLURAL:$1|लेख छै |$1 लेख सीनी छै.}}, कुल लेख $2 }}",
-       "listingcontinuesabbrev": "आगे.",
-       "newwindow": "(नया विंडो मॆं खुलै छै)",
+       "category-media-header": "\"$1\" श्रेणी मं॑ मीडिया.",
+       "category-empty": "<em>इ श्रेणी मं॑ इ समय कोय पृष्ठ या मीडिया नै छै.</em>",
+       "hidden-categories": "{{PLURAL:$1|छुपैलऽ श्रेणी|छुपैलऽ श्रेणी सीनी}}",
+       "hidden-category-category": "छुपैलऽ गेलऽ श्रेणी सीनी",
+       "category-subcat-count": "{{PLURAL:$2|इ श्रेणी मं॑ सिर्फ निम्नलिखित उपश्रेणी छै|इ श्रेणी मं॑ निम्नलिखित {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणी सीनी}} छै, कुल उपश्रेणी सीनी $2}}",
+       "category-subcat-count-limited": "इ श्रेणी मं॑ निम्नलिखित {{PLURAL:$1|उपश्रेणी छै|$1 उपश्रेणी सब छै}}.",
+       "category-article-count": "{{PLURAL:$2|इ श्रेणी मं॑ सिर्फ निम्नलिखित लेख छै.|इ श्रेणी मं॑ निम्नलिखित {{PLURAL:$1|लेख छै |$1 लेख सीनी छै.}}, कुल लेख $2 }}",
+       "category-article-count-limited": "निम्नलिखित {{PLURAL:$1|पृष्ठ|$1 पृष्ठ सब}} इ श्रेणी मं॑ छै.",
+       "category-file-count": "{{PLURAL:$2|इ श्रेणी मं॑ खाली निम्न फ़ाइल शामिल छै|निम्न  {{PLURAL:$1|फ़ाइल छै|$1 फ़ाइल सब छै}} इ श्रेणी मं॑, पूरे $2 मं॑ स॑.}}",
+       "category-file-count-limited": "इ श्रेणी मं॑ निम्नलिखित {{PLURAL:$1|फ़ाइल छै।|फ़ाइल सब छै।}}",
+       "listingcontinuesabbrev": "जारी",
+       "index-category": "अनुक्रमित पन्ना",
+       "noindex-category": "असूचीबद्ध पन्ना",
+       "broken-file-category": "टूटलऽ फ़ाइल कड़ी वाला पन्ना",
+       "about": "हमरा बारे मं॑॑",
+       "article": "सम्पर्क पन्ना",
+       "newwindow": "(नया विंडो म॑ खुलै छै)",
        "cancel": "निरस्त",
-       "mytalk": "हमरॊ बात",
+       "moredotdotdot": "आरू...",
+       "morenotlisted": "इ सूची पूर्ण नै छै.",
+       "mypage": "पन्ना",
+       "mytalk": "वार्ता",
+       "anontalk": "इ आई॰पी लेली वार्ता",
        "navigation": "भ्रमण",
+       "and": "&#32;आरू",
        "qbfind": "खोजॊ",
+       "qbbrowse": "ब्राउज़",
+       "qbedit": "संपादन",
+       "qbpageoptions": "इ पन्ना",
+       "qbmyoptions": "हमरऽ पन्ना",
+       "faq": "अक्सर पूछलऽ जाबै वाला प्रश्न",
+       "faqpage": "Project:अक्सर पूछलऽ जाबै वाला सवाल",
+       "actions": "क्रिया",
+       "namespaces": "नामस्थान",
+       "variants": "संस्करण",
+       "navigation-heading": "दिशानिर्देशक सूची",
        "errorpagetitle": "त्रुटि",
-       "returnto": "लà¥\8cà¤\9fà¥\8a $1.",
-       "tagline": "{{SITENAME}} à¤\95à¥\87रà¥\8a à¤¬à¤¾à¤°à¥\87 à¤®à¥\86à¤\82",
+       "returnto": "लà¥\8cà¤\9fऽ $1.",
+       "tagline": "{{SITENAME}} à¤\95à¥\87रऽ à¤¬à¤¾à¤°à¥\87 à¤®à¤\82à¥\91",
        "help": "सहायता",
-       "search": "à¤\96à¥\8bà¤\9cà¥\8a",
+       "search": "à¤\96à¥\8bà¤\9cऽ",
        "searchbutton": "खोज",
+       "go": "चलऽ",
        "searcharticle": "जा",
        "history": "पन्ना के इतिहास",
        "history_short": "इतिहास",
-       "printableversion": "छापै योग्य उद्धरण",
+       "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": "साधनपेटी",
+       "toolbox": "उपकरण",
+       "userpage": "सदस्य पन्ना देखऽ",
+       "projectpage": "प्रोजेक्ट पन्ना देखऽ",
+       "imagepage": "फाइल पन्ना देखऽ",
+       "mediawikipage": "सन्देश पृष्ठ देखऽ",
+       "templatepage": "साँचा पृष्ठ देखऽ",
+       "viewhelppage": "सहायता पृष्ठ देखऽ",
+       "categorypage": "श्रेणी पन्ना देखऽ",
+       "viewtalkpage": "चर्चा देखऽ",
        "otherlanguages": "इतर भाषा",
-       "redirectedfrom": "($1 à¤¸à¥\86à¤\82 à¤­à¥\87à¤\9cनà¥\8a à¤\97à¥\87लà¥\8a)",
+       "redirectedfrom": "($1 à¤¸à¥\91 à¤­à¥\87à¤\9cलऽ à¤\97à¥\87लऽ)",
        "redirectpagesub": "पुन: निर्देशित पन्ना",
+       "redirectto": "क॑ अनुप्रेषित:",
        "lastmodifiedat": "$1 के $2 पर इ पन्ना पर अन्तिम बार परिवर्तन भेलै.",
-       "jumpto": "हिन्नॆ जा:",
-       "jumptonavigation": "भ्रमण करॊ",
-       "jumptosearch": "खोजै लॆ चलॊ",
-       "aboutsite": "{{SITENAME}} केरॊ बारे मॆं",
+       "viewcount": "इ पृष्ठ {{PLURAL:$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 के तहत उपलब्ध छै.",
+       "copyright": "सामग्री $1 केरऽ अधीन उपलब्ध छै जब तलक अलग सं॑ उल्लेख नै करलऽ गेलऽ हुअ॑",
        "copyrightpage": "{{ns:project}}:सर्वाधिकार",
+       "currentevents": "हाल केरऽ घटना",
+       "currentevents-url": "Project:हाल के घटना",
        "disclaimers": "अस्वीकरण",
        "disclaimerpage": "Project:साधारण अस्वीकरण",
-       "edithelp": "संपादन मॆं सहायता",
+       "edithelp": "संपादन मं॑ सहायता",
+       "helppage-top-gethelp": "मदद",
        "mainpage": "मुख्य पृष्ठ",
+       "mainpage-description": "मुखपृष्ठ",
+       "policy-url": "Project:नीति",
+       "portal": "सामुदायिक पोर्टल",
+       "portal-url": "Project:सामुदायिक पोर्टल",
        "privacy": "गोपनीयता नीति",
        "privacypage": "Project:गोपनीयता नीति",
        "badaccess": "अनुमति त्रुटि",
-       "retrievedfrom": "\"$1\" सॆं लेलॊ गेलॊ",
+       "badaccess-group0": "जोन क्रिया के अनुरोध तोंय करले छो ओकरऽ संचालित करै के अनुमति तोरा लगाँ नै छौं.",
+       "badaccess-groups": "तोंय जे क्रिया अजमैल॑ छहो वू खाली {{PLURAL:$2|$1 समूह|$1 समूह सब}} केरऽ सदस्य ही कर॑ सकै छै.",
+       "versionrequired": "मीडीयाविकी केरऽ $1 अवतरण ज़रूरी छै",
+       "versionrequiredtext": "इ पन्ना प्रयोग करै लेली मीडियाविकी केरऽ $1 अवतरण ज़रूरी छै.\nदेखऽ [[Special:Version|अवतरण पृष्ठ]]",
+       "ok": "ठीक छै",
+       "retrievedfrom": "\"$1\" सं॑ लेलऽ गेलऽ",
        "youhavenewmessages": "तोरा लेली छै $1  ($2)",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|तोरा लेली}} $1 {{PLURAL:$3|दोसरऽ यूजर|$3 यूजर सीनी}} ($2).",
+       "youhavenewmessagesmanyusers": "($2) यूजर मं॑ सं॑ तोरा लेली $1",
+       "newmessageslinkplural": "{{PLURAL:$1|एगो नया सन्देश|999=नया सन्देश सब}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|पिछला|999=पिछला सब}} बदलाव",
+       "youhavenewmessagesmulti": "$1 पर तोरा लेली नया संदेश छै",
        "editsection": "संपादन",
        "editold": "संपादन",
+       "viewsourceold": "स्रोत देखऽ",
        "editlink": "संपादन",
-       "viewsourcelink": "सà¥\8dरà¥\8bत à¤¦à¥\87à¤\96à¥\8a.",
+       "viewsourcelink": "सà¥\8dरà¥\8bत à¤¦à¥\87à¤\96ऽ.",
        "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 à¤\95à¥\87रà¥\8a अणु फ़ीड",
+       "site-atom-feed": "$1 à¤\95à¥\87रऽ अणु फ़ीड",
        "page-rss-feed": "$1 केरॊ आरएसएस फ़ीड",
        "page-atom-feed": "\"$1\" अणु फ़ीड",
        "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वैध विशेष पृष्ठऽ के सूची [[Special:SpecialPages|{{int:specialpages}}]] पर देखलऽ जाब॑ सकै छै.",
+       "error": "त्रुटि",
+       "databaseerror": "डाटाबेस त्रुटि",
+       "databaseerror-text": "त्रुटिपूर्ण डाटाबेस अनुरोध  होलऽ छै.\nसंभवतः सॉफ़्टवेयर मं॑ गड़बड़ी छै.",
+       "databaseerror-textcl": "डाटाबेस अनुरोध मं॑ त्रुटि होलऽ छै.",
+       "databaseerror-query": "अनुरोध: $1",
+       "databaseerror-function": "फ़ंक्शन: $1",
+       "databaseerror-error": "त्रुटि: $1",
+       "laggedslavemode": "'''चेतावनी:''' इ पृष्ठ अद्यतनीत जानकारी-युक्त नै होय के आशंका छै.",
+       "readonly": "डाटाबेस म॑ ताला छै",
+       "enterlockreason": "लॉक करै के कारण बताबऽ, साथ ही लॉक खुलै केरऽ समय के अनुमानित आकलन द॑",
+       "readonlytext": "शायद मेंटेनन्स चलतें डाटाबेस नया संपादन आरू अन्य बदलावऽ सें लॉक करलऽ गेलऽ छै, जेकरऽ बाद इ सामान्य स्थिति मं॑ आबी जाना चाहियऽ.\n\nजोन प्रबंधक न॑ इ लॉक करन॑ रहै हुनी इ कारण बतैने छै: $1",
        "missing-article": "आँकड़ाकोष मॆं $2 के अंदर कहीं भी \"$1\" नै मिललै.\n\nआमतौर पर मिटैलॊ जाय चुकलॊ पन्ना के इतिहास कड़ी के इस्तेमाल करला पर ऐसनॊ होय छै.\n\nअगर ऐसनॊ नै छै, तॆ शायद आपनॆ तंत्रांश केरॊ त्रुटि खोजी लेनॆ छियॊ.\nकृपया पता समेत [[Special:ListUsers/sysop|administrator]] कॆ ऐकरॊ ब्यौरा दहॊ.",
        "missingarticle-rev": "(आवृत्ती#: $1)",
-       "badtitletext": "आपनॆ द्वारा आग्रहत लेख केरॊ शीर्षक अयोग्य, ख़ाली या गलती सॆं जुडलॊ आंतर-भाषिय या आंतर-विकि शीर्षक छेकै . एकरा मॆ एक या एक सॆं ज्यादा ऐनहॊ कॅरेक्टर छै जे शीर्षक मॆं इस्तेमाल नै करलॊ जाबॆ सकॆ छै.",
-       "viewsource": "स्रोत देखॊ",
+       "missingarticle-diff": "(अंतर: $1, $2)",
+       "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस सर्वर केरऽ बराबर अपडेट हुऐ तलक मुख्य डाटाबेस सर्वर लॉक होय गेलऽ छै.",
+       "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": "आपन॑ द्वारा आग्रहत लेख केरऽ शीर्षक अयोग्य, ख़ाली या गलती स॑ जुडल॑ आंतर-भाषिय या आंतर-विकि शीर्षक छेकै . एकरा म॑ एक या एक स॑ जादा ऐन्हऽ कॅरेक्टर छै जे शीर्षक मं॑ इस्तेमाल नै करलऽ जाब॑ सकै छै.",
+       "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": "निवेदित पन्ना शीर्षक बहुत लम्बा छै. एकरा यू०टी०एफ़० कोडिंग मं॑ $1 {{PLURAL:$1|बाइट|बाइट्स}} स॑ बढ़लऽ नै होना चाहियऽ आरू एखरा यू०टी०एफ़०-८ एनकोडिंग मं॑ होना चाहियऽ.",
+       "title-invalid-leading-colon": "निवेदित पन्ना के शीर्षक प्रारंभ म॑ अवैध कोलन रखै छै.",
+       "perfcached": "नीचें देलऽ डेटा कैशे मेमोरी स॑ लेलऽ गेलऽ छै., इ लेली हुये सकै छै कि इ पूरा तरह सं॑ अपडेट नै होलऽ हुअ॑. कैशे मेमोरी मं॑ अधिकतम {{PLURAL:$1|एगो  नतीजा|$1 जादा नतीजा}} उपलब्ध छै.",
+       "perfcachedts": "नीचें देलऽ डेटा कैशे करलऽ गेलऽ छै जे कि अंतिम दफा $1 अपडेट होलै. कैशे मेमोरी मं॑ अधिकतम {{PLURAL:$4|एगो  नतीजा|$4 जादा नतीजा}} उपलब्ध छै.",
+       "querypage-no-updates": "इ पन्ना के नवीनीकरण करना मना छै. अभी यहाँकरऽ डाटा क॑ ताज़ा नै करलऽ जाब॑ सकै छै.",
+       "viewsource": "स्रोत देखऽ",
+       "viewsource-title": "$1 लेली स्रोत देखऽ",
+       "actionthrottled": "कार्य समाप्त करलऽ गेलै",
+       "protectedpagetext": "इ पन्ना संपादन आरू अन्य कार्यो स॑ सुरक्षित रखलऽ गेलऽ छै.",
+       "viewsourcetext": "आपनै इ पन्ना केरौ स्त्रोत क देखै आरू कापी करै सकै छियै.",
+       "protectedinterface": "इ पन्ना इ विकी के सॉफ़्टवेयर क॑ इंटरफ़ेस पाठ दै छै, आरू एखरऽ गलत प्रयोग स॑ बचाबै लेली सुरक्षित करी देलऽ गेलऽ छै.\nसब्भे विकि लेली अनुवाद जोड़ै या बदलै लेली कृपया मीडियाविकि केरऽ क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] केर प्रयोग करऽ.",
+       "editinginterface": "<strong>चेतावनी:</strong> आपनै एगो ऐसनौ पन्ना क बदली रहलौ छियै जे सॉफ़्टवेयर केरौ इंटरफ़ेस पाठ प्रदान करै छै।\nइ पन्ना क॑ बदलला स अन्य सदस्यो केरौ प्रदर्शित इंटरफ़ेस केरौ शक्लोसूरत म बदलाव ऐतै ।",
        "yourname": "सदस्यनाम:",
+       "userlogin-yourname": "यूजरनाम",
+       "userlogin-yourname-ph": "अपनऽ सदस्यनाम लिखऽ",
        "yourpassword": "कूटशब्द :",
+       "userlogin-yourpassword": "कूटशब्द (पासवर्ड)",
+       "userlogin-yourpassword-ph": "आपनऽ पासवर्ड डालऽ",
+       "createacct-yourpassword-ph": "कूटशब्द दर्ज करऽ",
+       "createacct-yourpasswordagain": "कूटशब्द केरऽ पुष्टि करऽ",
+       "createacct-yourpasswordagain-ph": "कूटशब्द पुनः लिखऽ",
        "remembermypassword": "इ कंप्यूटर पर हमरॊ लॉग-इन सूचना याद रखॊ (अधिकतम $1 {{PLURAL:$1|दिन|दिन}} लेली)",
+       "userlogin-remembermypassword": "हमरा लॉगिन रखऽ",
        "login": "लॉग इन",
        "nav-login-createaccount": "सत्रारंभ / खाता खोलॊ",
        "userlogin": "लॉग इन / खाता बनाबॊ",
        "logout": " सत्रांत (लॉग आउट)",
        "userlogout": "सत्रांत (लॉग आउट)",
+       "userlogin-noaccount": "आपन॑ क॑ खाता नै छै?",
+       "userlogin-joinproject": "{{SITENAME}} सं॑ जुड़ऽ",
        "nologinlink": "एगो खाता बनाबॊ",
+       "createaccount": "नवीन खाता बनाबऽ",
+       "userlogin-resetpassword-link": "पासवर्ड भुलाय गेल्हो की ?",
+       "userlogin-helplink2": "लॉग-इन सथें सहायता",
+       "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
+       "createacct-email-ph": "अपनऽ ई-मेल पता लिखऽ",
+       "createacct-captcha": "सुरक्षा जाँच",
+       "createacct-imgcaptcha-ph": "उपरोक्त पाठ लिखऽ",
+       "createacct-submit": "आपनऽ खाता बनाबऽ",
+       "createacct-benefit-heading": "आपने ऐन्हऽ लोगऽ द्वारा बनैलऽ गेलऽ {{SITENAME}} छै .",
+       "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|योगदानकर्ता}}",
        "mailmypassword": "इमेल द्वारा नया कूटशब्द भेजॊ",
+       "loginlanguagelabel": "भाषा: $1",
+       "pt-login": "लॉग इन",
+       "pt-login-button": "लॉग-इन",
+       "pt-createaccount": "खाता बनाबऽ",
+       "pt-userlogout": "सत्रांत (लॉग आउट)",
+       "passwordreset": "कूटशब्द रीसेट",
        "bold_sample": "मोटा पाठ",
-       "bold_tip": "मà¥\8bà¤\9fà¥\87 अक्षर",
+       "bold_tip": "मà¥\8bà¤\9fा अक्षर",
        "italic_sample": "तिरछा अक्षर",
        "italic_tip": "तिरछा अक्षर",
        "link_sample": "कड़ी शीर्षक",
        "link_tip": "आंतरिक कड़ी",
        "extlink_sample": "http://www.example.com कड़ी शीर्षक",
-       "extlink_tip": "बाहरà¥\80 à¤\95ड़à¥\80 (à¤\89पसरà¥\8dà¤\97 http:// à¤\9cरà¥\82र à¤²à¤\97ाबà¥\8a)",
+       "extlink_tip": "बाहरà¥\80 à¤\95ड़à¥\80 (à¤\89पसरà¥\8dà¤\97 http:// à¤\9cरà¥\82र à¤²à¤\97ाबऽ)",
        "headline_sample": "शीर्षक",
        "headline_tip": "द्वितीय-स्तर शीर्षक",
-       "nowiki_sample": "à¤\85पà¥\8dरारà¥\82पित à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¯à¤¹à¤¾à¤\81 à¤¡à¤¾à¤²à¥\8a",
-       "nowiki_tip": "विà¤\95ि à¤ªà¥\8dरारà¥\82पण à¤¨à¤\9c़रà¤\82दाà¤\9c़ à¤\95रà¥\8a",
+       "nowiki_sample": "à¤\85पà¥\8dरारà¥\82पित à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¯à¤¹à¤¾à¤\81 à¤¡à¤¾à¤²à¤½",
+       "nowiki_tip": "विà¤\95ि à¤ªà¥\8dरारà¥\82पण à¤¨à¤\9c़रà¤\82दाà¤\9c़ à¤\95रऽ",
        "image_tip": "संलग्न संचिका",
        "media_tip": "फाईल लिंक",
        "sig_tip": "आपनॆ के हस्ताक्षर व समय",
-       "hr_tip": "हà¥\89रिà¤\9dà¥\89à¤\82à¤\9fल à¤²à¤¾à¤\88न (à¤\95म à¤\87सà¥\8dतà¥\87माल à¤\95रà¥\8a)",
+       "hr_tip": "हà¥\89रिà¤\9dà¥\89à¤\82à¤\9fल à¤²à¤¾à¤\88न (à¤\95म à¤\87सà¥\8dतà¥\87माल à¤\95रऽ)",
        "summary": "सारांश:",
        "subject": "विषय/शीर्षक",
-       "minoredit": "à¤\87 à¤\8fà¤\97à¥\8a à¤\9bà¥\8bà¤\9fा परिवर्तन छेकै",
-       "watchthis": "à¤\87 à¤ªà¤¨à¥\8dना à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¡à¤¾à¤²à¥\8a",
-       "savearticle": "पनà¥\8dना à¤¸à¤\81à¤\9cà¥\8bवà¥\8a",
+       "minoredit": "à¤\87 à¤\8fà¤\97ऽ à¤\9bà¥\8bà¤\9fऽ परिवर्तन छेकै",
+       "watchthis": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\91 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¤\82à¥\91 à¤¡à¤¾à¤²à¤½",
+       "savearticle": "पनà¥\8dना à¤¸à¤\81à¤\9cà¥\8bवऽ",
        "preview": "पूर्वावलोकन",
-       "showpreview": "पà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤¦à¥\87à¤\96ाबà¥\8a",
-       "showdiff": "बदलाव à¤¦à¥\87à¤\96ाबà¥\8a",
-       "anoneditwarning": "'''सावधान:''' आपनॆ लॉग-इन नै करनॆ छियै. इ पृष्ठ के संपादन इतिहास मॆं आपनॆ के आइ.पी. पता अंकित करलॊ जैतै.",
+       "showpreview": "à¤\9dलà¤\95 à¤¦à¥\87à¤\96ाबऽ",
+       "showdiff": "बदलाव à¤¦à¥\87à¤\96ाबऽ",
+       "anoneditwarning": "<strong>सावधान:</strong> आपन॑ लॉग-इन नै करन॑ छियै. जों आपन॑ सम्पादन करै छियै त॑ इ पृष्ठ के संपादन इतिहास मं॑ आपने के आइ.पी. पता अंकित करलऽ जैतै. जों आपन॑ <strong>[$1 लॉगिन]</strong> करै छियै अथवा <strong>[$2 खाता बनाबै छियै]</strong> त॑ अन्य सुविधा के साथ-साथ आपन॑ क॑ संपादनऽ केरऽ श्रेय आपन॑ केरऽ सदस्यनाम पर देलऽ जैतै.",
        "summary-preview": "सारांश पूर्वावलोकन:",
+       "loginreqlink": "लॉग-इन",
        "newarticle": "(नया)",
        "newarticletext": "आपनॆ जे लेख चाहै छियै वू अखनी तलक लिखलॊ नै गेलॊ छै. इ लेख लिखै लेली नीचे टाइप करॊ. सहायता लेली [$1 ऐन्जां] क्लीक करॊ.\n\nजों आपनॆ यहां पर गलती सॆं आबी गेलॊ छियै तॆ आपनॊ ब्राउज़र कॆ बॅक (back) पर क्लीक करॊ.",
-       "noarticletext": "\nHindi (hi)फ़िलहाल इस पन्ने पर कोई सामग्री नहीं है।\nआपनॆ अन्य पन्ना मॆं [[Special:Search/{{PAGENAME}}|इ सामग्री के खोज]] करॆ सकॆ छियै,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित चिट्ठा मॆं खोज करॆ सकै छियै],\nया [{{fullurl:{{FULLPAGENAME}}|action=edit}} इ पन्ना कॆ संपादित करॆ सकॆ छियै]</span>.",
+       "noarticletext": "\nHindi (hi)फ़िलहाल इ पन्ना पर कोनो सामग्री नै छै.\nआपन॑ अन्य पन्ना मं॑ [[Special:Search/{{PAGENAME}}|इ सामग्री के खोज]] कर॑ सकै छियै,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित चिट्ठा मं॑ खोज कर॑ सकै छियै],\nया [{{fullurl:{{FULLPAGENAME}}|action=edit}} इ पन्ना क॑ संपादित कर॑ सक॑ छियै]</span>.",
+       "noarticletext-nopermission": "\nफ़िलहाल इ पन्ना पर कोय सामग्री नै छै.\nआपने अन्य पन्ना म॑ [[Special:Search/{{PAGENAME}}|इ सामग्री केरऽ खोज]] कर॑ सकै छियै,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित चिट्ठा मं॑ खोज कर॑ सकै छियै],\nया फेरू [{{fullurl:{{FULLPAGENAME}}|action=edit}} इ पन्ना क॑ संपादित कर॑ सकै छियै]</span>.",
        "previewnote": "'''याद रखॊ, इ केवल एगॊ झलक छेकै आरू अभी तलक सुरक्षित  नै करलॊ गेलॊ छै!'''",
-       "editing": "$1 केरॊ सम्पादन चली रहलॊ छै.",
+       "editing": "$1 केरऽ सम्पादन चली रहलऽ छै.",
+       "creating": "$1 बनाबऽ",
        "editingsection": "$1 सम्पादन (अनुभाग)",
        "copyrightwarning": "कृपया ध्यान दहॊ कि {{SITENAME}} कॆ करलॊ गेलॊ सब्भॆ योगदान $2 के शर्तों के तहत होतै (अधिक जानकारी लेली $1 देखॊ)।\nअगर आप योगदान कॆ लगातार बदलतॆं आरू पुनः वितरित होतॆं नै देखॆ सकॆ छियै तॆ यहाँ योगदान नै करॊ. <br />\nआपनॆ इ भी प्रमाणित करी रहलॊ छियै कि इ आपनॆ खुद लिखनॆ छियै या जनार्पीत या कोनो अन्य मुक्त स्रोत सॆं प्रतिलिपित करलॊ गेलॊ छै. '''सर्वाधिकारयुक्त लेखॊ कॆ, बिना अनुमति के, यहाँ नै डालॊ!'''",
        "templatesused": " {{PLURAL:$1|Template|Templates}} इ पृष्ठ पर प्रयुक्त साँचा:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} इ झलक मॆ प्रयुक्त साँचा:",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(अर्ध-सुरक्षीत)",
-       "hiddencategories": "इ लेख निम्नलिखित {{PLURAL:$1|1 छुपैलॊ श्रेणी मॆ|$1 छुपैलॊ श्रेणी मॆ}} छै:",
-       "permissionserrorstext-withaction": "आपनॆकॆ $2 केरॊ अनुमति नै छै, निम्नलिखित {{PLURAL:$1|कारण लेली|कारणॊ लेली}}:",
-       "viewpagelogs": "इ पन्ना के लॉग देखॊ",
-       "currentrev-asof": "$1 केरॊ समय के संस्करण",
-       "revisionasof": "$1 केरॊ संस्करण",
-       "previousrevision": "पुरानॊ संशोधन",
+       "hiddencategories": "इ लेख निम्नलिखित {{PLURAL:$1|1 छुपैलऽ श्रेणी म॑|$1 छुपैलऽ श्रेणी म॑}} छै:",
+       "permissionserrorstext-withaction": "आपन॑क॑ $2 केरऽ अनुमति नै छै, निम्नलिखित {{PLURAL:$1|कारण लेली|कारणऽ लेली}}:",
+       "moveddeleted-notice": "इ पन्ना हटाय देलऽ गेलऽ छै.\nपन्ना हटाबै केरऽ लॉग संदर्भ लेली नीचें देलऽ गेलऽ छै.",
+       "viewpagelogs": "इ पन्ना केरऽ लॉग देखॊ",
+       "currentrev-asof": "$1 केरऽ समय के संस्करण",
+       "revisionasof": "$1 केरऽ संस्करण",
+       "revision-info": "{{GENDER:$6|$2}}$7 द्वारा $1 ऐन्हऽ संशोधन",
+       "previousrevision": "पुरानऽ संशोधन",
        "nextrevision": "नया संशोधन →",
        "currentrevisionlink": "हाल के संशोधन",
        "cur": "चालू",
        "history-fieldset-title": "इतिहास के विचरण करॊ",
        "histfirst": "बहुत पहिले के",
        "histlast": "एकदम हाल के",
-       "rev-delundel": "दिखाबॊ/छुपाबॊ",
+       "rev-delundel": "दिखाब/छुपाबऽ",
        "revdel-restore": "दृश्यता बदलॊ",
        "revertmerge": "अलग करॊ",
-       "history-title": "\"$1\" के अवतरण इतिहास",
+       "history-title": "\"$1\" केरऽ अवतरण इतिहास",
+       "difference-title": "\"$1\" केरऽ संशोधनऽ के बीच फरक",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "च़यन करलॊ अवतरणों मॆं फर्क देखियै",
-       "editundo": "पूर्ववत करॊ",
+       "editundo": "पूर्ववत करऽ",
+       "diff-multi-sameuser": "({{PLURAL:$1|एगऽ मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधन}} एक्के यूजर द्वारा नै दिखलैलऽ गेलऽ)",
        "searchresults": "खोज परिणाम",
        "searchresults-title": "\"$1\" लेली खोज परिणाम",
        "notextmatches": "कोनो पन्ना मॆं इ सामग्री नै मिललै.",
        "prevn": "पिछला {{PLURAL:$1|$1}}",
        "nextn": "अगला {{PLURAL:$1|$1}}",
-       "viewprevnext": "देख़ॊ ($1 {{int:pipe-separator}} $2) ($3)",
+       "nextn-title": "अगला $1 {{PLURAL:$1|नतीजा|जादा नतीजा}}",
+       "shown-title": "हर पन्ना प॑ $1 {{PLURAL:$1|result|results}} दिखाबऽ",
+       "viewprevnext": "देख़ऽ ($1 {{int:pipe-separator}} $2) ($3)",
+       "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-redirect": "($1 à¤\95à¥\86 अनुप्रेषित)",
+       "search-redirect": "($1 à¤\95à¥\91 अनुप्रेषित)",
        "search-section": "(विभाग $1)",
-       "search-suggest": "à¤\95à¥\80 à¤\86पनà¥\86 के मतलब $1 छै ?",
+       "search-suggest": "à¤\95à¥\80 à¤\86पनà¥\91 के मतलब $1 छै ?",
        "search-interwiki-caption": "अन्य प्रकल्प",
        "search-interwiki-default": "$1 के रिज़ल्ट:",
        "search-interwiki-more": "(आरू)",
+       "searchall": "सब्भे",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> मं॑ स॑ <strong>$1</strong> परिणाम|<strong>$3</strong> मं॑ स॑ परिणाम <strong>$1 - $2</strong>}}",
+       "search-nonefound": "आपन॑ के खोज सं॑ मेल खैतें कोय परिणाम नै मिललै",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नामस्थानॊ मॆ खोजॊ:",
        "preferences": "वरीयता",
-       "mypreferences": "हमरà¥\8a à¤µà¤°à¥\80यता",
+       "mypreferences": "वरीयता",
        "group-sysop": "प्रचालक",
        "grouppage-sysop": "{{ns:project}}:प्रचालक",
-       "newuserlogpage": "नया सदस्यॊ के सूची",
+       "right-writeapi": "लेखन API के प्रयोग करऽ",
+       "newuserlogpage": "नयऽ सदस्यऽ के सूची",
        "rightslog": "सदस्य अधिकार सूची",
        "action-edit": " ई पन्ना के सम्पादन करॊ",
        "nchanges": "$1 {{PLURAL:$1|बदलाव|बदलाव}}",
-       "recentchanges": "हाल मॆं होलॊ बदलाव",
-       "recentchanges-legend": "हाल केरॊ परिवर्तन संबंधी विकल्प",
+       "enhancedrc-history": "इतिहास",
+       "recentchanges": "हाल मं॑ होलऽ बदलाव",
+       "recentchanges-legend": "हाल केरऽ परिवर्तन संबंधी विकल्प",
+       "recentchanges-summary": "इस विकि पर हाल मं॑ होलऽ बदलाव इ पन्ना पर देखलऽ जाब॑ सकै छै.",
        "recentchanges-feed-description": "इ फ़ीड मॆ होय वाला विकि पर हाल मॆ होलॊ बदलाव देखियै.",
-       "rclistfrom": "$3 $2 सॆं नया बदलाव देखलाबॊ",
-       "rcshowhideminor": "छोटॊ बदलाव $1",
+       "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|नया पन्ना के सूची]] क॑ भी देखऽ)",
+       "rclistfrom": "$3 $2 सं॑ नया बदलाव देखलाबऽ",
+       "rcshowhideminor": "छोटऽ बदलाव $1",
+       "rcshowhideminor-show": "देखाबऽ",
+       "rcshowhideminor-hide": "छुपाबऽ",
        "rcshowhidebots": "बोट सीनी $1",
-       "rcshowhideliu": "लॉग्ड इन सदस्यॊ के बदलाव $1",
-       "rcshowhideanons": "अनामक सदस्यॊ के बदलाव $1",
-       "rcshowhidemine": "हमरॊ बदलाव $1",
-       "rclinks": "पिछला $2 दिना मॆं होलॊ $1 बदलाव देखियै.<br />$3",
+       "rcshowhidebots-show": "देखाबऽ",
+       "rcshowhidebots-hide": "छुपाबऽ",
+       "rcshowhideliu": "पंजीकृत सदस्य $1",
+       "rcshowhideliu-hide": "छुपाबऽ",
+       "rcshowhideanons": "$1 अनामक सदस्यऽ",
+       "rcshowhideanons-show": "देखाबऽ",
+       "rcshowhideanons-hide": "छुपाबऽ",
+       "rcshowhidemine": "हमरऽ संपादन $1",
+       "rcshowhidemine-show": "देखाबऽ",
+       "rcshowhidemine-hide": "छुपाबऽ",
+       "rclinks": "पिछला $2 दिना मं॑ होलऽ $1 बदलाव देखियै.<br />$3",
        "diff": "अंतर",
        "hist": "इतिहास",
-       "hide": "à¤\9bà¥\81पाबà¥\8a",
-       "show": "दà¥\87à¤\96ाबà¥\8a",
+       "hide": "à¤\9bà¥\81पाबऽ",
+       "show": "दà¥\87à¤\96ाबऽ",
        "minoreditletter": " छो.",
-       "newpageletter": "न",
-       "boteditletter": "बो",
+       "newpageletter": "न.",
+       "boteditletter": "बो.",
+       "rc-change-size-new": "बदलाव केरऽ बाद $1 {{PLURAL:$1|बाइट}}",
        "rc-enhanced-expand": "विस्तृत जानकारी देखाबॊ (ऐकरा लेली जावास्क्रिप्ट चाहियॊ)",
        "rc-enhanced-hide": "विस्तृत जानकारी छिपाबॊ",
        "recentchangeslinked": "इ पृष्ठ संबंधी बदलाव",
-       "recentchangeslinked-title": "\"$1\" मॆं होलॊ बदलाव",
-       "recentchangeslinked-summary": "कोनो पन्ना के हवाले कत्तॆ भी पन्ना मौजूद हुऎ सकॆ छै, इ सूची उ पन्ना (या कोनो श्रेणी के सदस्यॊ) मॆं होलॊ हाल के बदलाव देखाबै छै.\n[[Special:Watchlist|आपनॆ के ध्यानसूची]] मॆं मौजूद पन्ना '''मोटा''' अक्षरॊ मॆं दिखतै.",
+       "recentchangeslinked-toolbox": "इ पृष्ठ संबंधी बदलाव",
+       "recentchangeslinked-title": "\"$1\" म॑ होलऽ बदलाव",
+       "recentchangeslinked-summary": "कोनो पन्ना के हवाले कत्त॑ भी पन्ना मौजूद हुअ॑ सकै छै, इ सूची उ पन्ना (या कोनो श्रेणी के सदस्यऽ) मं॑ होलऽ हाल के बदलाव देखाबै छै.\n[[Special:Watchlist|आपन॑ के ध्यानसूची]] मं॑ मौजूद पन्ना '''मोटा''' अक्षरऽ मं॑ दिखतै.",
        "recentchangeslinked-page": "पृष्ठ नाम:",
-       "recentchangeslinked-to": "à¤\90à¤\95रà¥\8a à¤¬à¤¦à¤²à¤¾ à¤®à¥\86à¤\82 à¤¦à¥\87लà¥\8a à¤ªà¤¨à¥\8dना à¤¸à¥\80नà¥\80 à¤¸à¥\86à¤\82 à¤\9cà¥\81डलà¥\8a à¤ªà¤¨à¥\8dना à¤¸à¥\80नà¥\80 à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤¦à¤¿à¤\96लाबà¥\8a",
+       "recentchangeslinked-to": "à¤\90à¤\95रऽ à¤¬à¤¦à¤²à¤¾ à¤®à¤\82à¥\91 à¤¦à¥\87लऽ à¤ªà¤¨à¥\8dना à¤¸à¥\80नà¥\80 à¤¸à¥\91 à¤\9cà¥\81डलऽ à¤ªà¤¨à¥\8dना à¤¸à¥\80नà¥\80 à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤¦à¤¿à¤\96लाबऽ",
        "upload": "फाईल अपलोड",
        "uploadlogpage": "अपलोड सूची",
+       "filedesc": "सारांश",
+       "license-header": "लाइसेन्सिंग",
+       "imgfile": "फाइल",
+       "file-anchor-link": "फ़ाइल",
        "filehist": "फाइल के इतिहास",
-       "filehist-help": "सà¤\82à¤\9aिà¤\95ा à¤ªà¥\81रानà¥\8a à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\95à¥\88नà¥\8dहà¥\8a à¤¦à¤¿à¤\96à¥\88 à¤°à¤¹à¥\88 à¤\87 à¤\9cानà¥\88 à¤²à¥\87लà¥\80 à¤µà¤¾à¤\82à¤\9bित à¤¦à¤¿à¤¨à¤¾à¤\82à¤\95/समय à¤ªà¤° à¤\9aà¤\9fà¤\95ा à¤²à¤\97ाबà¥\8a.",
+       "filehist-help": "सà¤\82à¤\9aिà¤\95ा à¤ªà¥\81रानऽ à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\95à¥\88नà¥\8dहऽ à¤¦à¤¿à¤\96à¥\88 à¤°à¤¹à¥\88 à¤\87 à¤\9cानà¥\88 à¤²à¥\87लà¥\80 à¤µà¤¾à¤\82à¤\9bित à¤¦à¤¿à¤¨à¤¾à¤\82à¤\95/समय à¤ªà¤° à¤\9aà¤\9fà¤\95ा à¤²à¤\97ाबऽ.",
        "filehist-current": "मौजूदा",
        "filehist-datetime": "तारीख/समय",
        "filehist-thumb": "थम्बनेल",
-       "filehist-thumbtext": "$1 à¤\95à¥\87रà¥\8a समय के संस्करण के अँगूठाकार प्रारूप",
+       "filehist-thumbtext": "$1 à¤\95à¥\87रऽ समय के संस्करण के अँगूठाकार प्रारूप",
        "filehist-user": "सदस्य",
        "filehist-dimensions": "आयाम",
        "filehist-comment": "टिप्पणी",
-       "imagelinks": "फाईल लिंक",
-       "linkstoimage": "निम्नोक्त {{PLURAL:$1|पन्ने|$1 पन्ना सीनी}} मॆं इ संचिका के हवाले छै:",
+       "imagelinks": "फ़ाइल केरऽ उपयोग",
+       "linkstoimage": "निम्नोक्त {{PLURAL:$1|पन्ने|$1 पन्ना सीनी}} मं॑ इ संचिका के हवाले छै:",
+       "nolinkstoimage": "इ फ़ाइल स॑ कोय पन्ना नै जुड़ै छै.",
        "sharedupload": "ई फाईल $1 सॆ छै आरू संभवतः अन्य परियोजना भी एकरॊ इस्तेमाल करी रहलॊ होतै.",
+       "sharedupload-desc-here": "इ फ़ाइल $1 स॑ छेकै आरू अन्य परियोजना द्वारा भी प्रयोग करलऽ जाब॑ सकै छै.\nवहाँ पर एकरऽ [$2 फ़ाइल विवरण पृष्ठ] मं॑ मौजूद विवरण निम्नांकित छै.",
        "uploadnewversion-linktext": "इ फाईल के नया संस्करण अपलॊड करॊ",
+       "upload-disallowed-here": "आपन॑ इ फ़ाइल क॑ अधिलेखित नै कर॑ सकै छो",
+       "randompage": "कोय्यो पन्ना",
        "statistics": "आँकड़ा",
        "nbytes": "{{PLURAL:$1|बाइट|बाइट}}",
-       "nmembers": "{{PLURAL:$1|एगॊ सदस्य|$1 सदस्य}}",
+       "nmembers": "$1 {{PLURAL:$1|सदस्य|जादा सदस्य}}",
        "prefixindex": "इ उपसर्ग वाल सब्भे पन्ना",
        "newpages": "नया पन्ना",
        "move": "स्थानांतरण",
        "movethispage": "इ पन्ना स्थानांतरित करॊ",
        "pager-newer-n": "{{PLURAL:$1|नया 1|नया सीनी $1}}",
-       "pager-older-n": "{{PLURAL:$1|पà¥\81राना 1|पà¥\81रानà¥\8a सीनी $1}}",
+       "pager-older-n": "{{PLURAL:$1|पà¥\81रानऽ 1|पà¥\81रानऽ सीनी $1}}",
        "booksources": "पुस्तक स्रोत",
-       "booksources-search-legend": "पुस्तक स्रोत खोजॊ",
+       "booksources-search-legend": "पुस्तक स्रोत खोजऽ",
+       "booksources-search": "खोजऽ",
        "log": "लॉग सूची",
        "allpages": "सब्भे पन्ना",
        "prevpage": "पिछला पन्ना ($1)",
        "allpagesfrom": "देलॊ गेलॊ अक्षर सॆं आरंभ होयवाला लेख दर्शाबॊ:",
        "allpagesto": "ऐना समाप्त होय वाला पन्ना दिखाबॊ:",
        "allarticles": "सब्भे पन्ना",
-       "allpagessubmit": "चलॊ",
+       "allpagessubmit": "चलऽ",
+       "categories": "श्रेणी",
        "linksearch": "बाहरी कड़ी",
        "listgrouprights-members": "(सदस्य सूची)",
        "emailuser": "इ सदस्य कॆ ई-मेल भेजॊ",
        "watchlist": "हमरॊ ध्यानसूची",
-       "mywatchlist": "हमरà¥\8a à¤§à¥\8dयानसà¥\82à¤\9aà¥\80",
+       "mywatchlist": "ध्यानसूची",
        "addedwatchtext": "\"[[:$1]]\" आपनॆके [[Special:Watchlist|ध्यानसूची]] मॆं \"<nowiki>$1</nowiki>\" केरॊ समावेश करी देलॊ गेलॊ छै.\nभविष्य मॆं इ पन्ना तथा इ पन्ने केरॊ वार्ता मॆं होय वाला बदलाव आपनॆकॆ ध्यानसूची मॆं दिखतै तथा [[Special:RecentChanges|हाल मॆं होलॊ बदलावॊ के सूची]] मॆं ई पन्ना बोल्ड दिखतै ताकि  आपनॆ आसानी सॆं एकरॊ ध्यान रखॆ सकियै.\n\n<p>अगर आपनॆकॆ इ पन्ना कॆ अपनॊ ध्यानसूची सॆं निकालना छै तॆ [[Special:RecentChanges|टटका परिवर्तन]] पर क्लिक करॊ.",
        "removedwatchtext": "\"[[:$1]]\" नामक पन्ना कॆ आपनॆ के [[Special:Watchlist|ध्यानसूची]] सॆं हटाय देलॊ गेलॊ छै.",
-       "watch": "धà¥\8dयान à¤°à¤\96à¥\8a",
+       "watch": "धà¥\8dयान à¤°à¤\96ऽ",
        "watchthispage": "ई पन्ना ध्यानसूची में डालॊ",
        "unwatch": "ध्यान हटाबॊ",
        "watchlist-details": "वार्ता पन्ना केरॊ अलावा {{PLURAL:$1|$1 पन्ना|$1 पन्ने}} आपने के ध्यानसूची मॆं छै.",
        "delete-toobig": "इ पन्ना केरॊ संपादन इतिहास $1 सॆं अधिक {{PLURAL:$1|संस्करण|संस्करण}} होला के वजह सॆं बहुत बड़ा छै.\n{{SITENAME}} के अनपेक्षित रूप सॆं बंद होला सॆं रोकै लेली ऐसनॊ पन्ना कॆ हटाबै के अनुमति नै छै.",
        "delete-warning-toobig": "इस लेख केरॊ संपादन इतिहास काफ़ी लंबा चौड़ा छै, ऐकरॊ $1 सॆं अधिक {{PLURAL:$1|संस्करण|संस्करण}} छै.\nएकरा हटैला सॆं {{SITENAME}} के आँकड़ाकोष के गतिविधियॊ मॆं व्यवधान आबॆ सकॆ छै;\nकृपया सोची समझी कॆ आगू बढ़ॊ.",
        "rollback": "संपादन पीछू लॆ जाय",
-       "rollback_short": "पूर्ववत करॊ",
-       "rollbacklink": "वापस लॆ",
+       "rollbacklink": "वापस ल॑",
+       "rollbacklinkcount": "रोलबैक $1 {{PLURAL:$1|संपादन|संपादन सब}}",
        "rollbackfailed": "पूर्ववत स्थिति निष्फल",
        "cantrollback": "पुराना अवतरण पूर्ववत नै करॆ सकॆ छियै;\nइ पन्ना के आखिरी योगदानकर्ता इ लेख के एकमात्र लेखक छेकै.",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा करलॊ गेलॊ  [[:$1]] के पिछला संपादन कॆ वापस पुरानॊ स्थिति पर नै लानलॊ जाबॆ सकॆ छै;\nकोय आरू इ बीच या तॆ इ पन्ना कॆ फिर सॆं संपादित करी देनॆ छै या पहले ही पन्ना पुरानॊ स्थिति पर लानलॊ जाय चुकलॊ छै.\n\nइ पन्ना के ताज़ातरीन संपादन [[User:$3|$3]] ([[User talk:$3|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) नॆ करनॆ छै.",
        "undeletelink": "देखॊ/पुनर्स्थापित करॊ",
        "namespace": "नामस्थान:",
        "invert": "विपरीत प्रवरण",
+       "tooltip-invert": "चयनित नामस्थान (आरू संबद्ध नामस्थान जों जाँच) के भीतर पृष्ठऽ मं॑ करलऽ गेलऽ  परिवर्तन छुपाबै लेली इ बक्सा क॑ चिह्नित करऽ",
+       "namespace_association": "सम्बद्ध नामस्थान",
+       "tooltip-namespace_association": "भी बात या विषय नाम स्थान चयनित नाम स्थान केरऽ साथ जुड़लऽ क॑ शामिल करै लेली इ बक्सा क॑ चिह्नित करऽ.",
        "blanknamespace": "(मुख्य)",
-       "contributions": "सदस्य योगदान",
+       "contributions": "{{GENDER:$1|सदस्य}} योगदान",
        "contributions-title": "$1 लेली सदस्यॊ के योगदान",
-       "mycontris": "हमरà¥\8a à¤¯à¥\8bà¤\97दान",
+       "mycontris": "योगदान",
        "contribsub2": "$1 लेली ($2)",
        "uctop": "(उपर)",
-       "month": "à¤\87 à¤®à¤¹à¤¿à¤¨à¤¾ à¤¸à¥\86à¤\82 (à¤\86रà¥\82 à¤ªà¥\81रानà¥\8a):",
-       "year": "à¤\87 à¤¸à¤¾à¤² à¤¸à¥\86à¤\82 (à¤\86रà¥\82 à¤ªà¥\81रानà¥\8a):",
+       "month": "à¤\87 à¤®à¤¹à¤¿à¤¨à¤¾ à¤¸à¥\91 (à¤\86रà¥\82 à¤ªà¥\81रानà¥\91):",
+       "year": "à¤\87 à¤¸à¤¾à¤² à¤¸à¥\91 (à¤\86रà¥\82 à¤ªà¥\81रानऽ):",
        "sp-contributions-newbies": "सिर्फ नया सदस्यॊ के योगदान दर्शाबॊ",
        "sp-contributions-blocklog": "ब्लॉक सूची",
        "sp-contributions-search": "योगदान लेली खोज",
        "sp-contributions-username": "आईपी एड्रेस या सदस्यनाम:",
        "sp-contributions-submit": "खोज",
        "whatlinkshere": "एन्जां की जुड़तै",
-       "whatlinkshere-title": "$1 à¤¸à¥\86à¤\82 à¤\9cà¥\81ड़लà¥\8a पन्ना",
+       "whatlinkshere-title": "$1 à¤¸à¤\82à¥\91 à¤\9cà¥\81ड़लऽ पन्ना",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere": "नà¥\80à¤\9aà¥\87 à¤\95à¥\87 à¤¸à¤¬ à¤ªà¤¨à¥\8dना '''[[:$1]]''' à¤¸à¥\86à¤\82 à¤\9cà¥\81ड़लà¥\8a:",
+       "linkshere": "नà¥\80à¤\9aà¥\87 à¤\95à¥\87 à¤¸à¤¬ à¤ªà¤¨à¥\8dना '''[[:$1]]''' à¤¸à¥\91 à¤\9cà¥\81ड़लऽ:",
        "isredirect": "पुन: निर्दिष्ट पन्ना",
-       "istemplate": "मिलाबà¥\8a",
-       "isimage": "तसà¥\8dवà¥\80र लिंक",
+       "istemplate": "मिलाबऽ",
+       "isimage": "फाà¤\87ल लिंक",
        "whatlinkshere-prev": "{{PLURAL:$1|पिछला|पिछला सीनी $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|अगला|अगला $1}}",
        "whatlinkshere-links": "← लिंक",
        "blockip": "अवरोधित करॊ",
        "ipboptions": "२ घंटा:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ता:2 weeks,१ महिना:1 month,३ महिना:3 months,६ महिना:6 months,१ साल:1 year,अनंत:infinite",
        "ipblocklist": "अवरोधित आईपी पता व सदस्यनाम",
-       "blocklink": "à¤\85वरà¥\8bधित à¤\95रà¥\8a",
+       "blocklink": "à¤\85वरà¥\8bधित à¤\95रऽ",
        "unblocklink": "अवरोध हटाएँ (अनब्लॉक)",
        "change-blocklink": "ब्लॉक बदलॊ",
        "contribslink": "योगदान",
        "block-log-flags-nocreate": "खाता निर्माण पर रोक",
        "movepagetext": "नीचॆं देलॊ पर्चा पन्ना के नाम बदली देतै, ऐकरॊ सारा इतिहास भी नयॊ नाम सॆं दिखना शुरू होय जैतै.\nपुराना शीर्षक नया नाम कॆ अनुप्रेषित करी लेतै.\nमूल शीर्षक दन्नॆ जाय वाला अग्रेषणॊ कॆ आपनॆ स्वचालित रूपॊ सॆं बदलॆ सकॆ छियै.\nयदि आपनॆ ऐन्हॊ नै करै छियै तॆ कृपया [[Special:DoubleRedirects|दोहरा]] पुनर्निर्देशण या [[Special:BrokenRedirects|टूटलॊ पुनर्निर्देशन]] लेली ज़रूर जाँच करॊ.\nकड़ी सीनी सही जगह इंगित करी रहलॊ छै, ई सुनिश्चित करना आपनॆ कॆ जिम्मेदारी छै.\n\nअगर नयॊ शीर्षक के लेख पहलै सॆं छै तॆ स्थानांतरण '''नै''' होतै. पर अगर नयॊ शीर्षक वाला लेख खाली छै अथवा कहीं आरू अनुप्रेषित करै छियै आरू साथ ही ओकरॊ पुरानॊ संस्करण नै छै तॆ स्थानांतरण होय जैतै.\nएकरॊ मतलब कि यदि आपनॆ सॆं गलती हो जाय तॆ आपनॆ वापस पुरानॊ नाम पर इ पन्ना कॆ स्थानांतरण करॆ सकॆ छियै, आरू साथ ही आपनॆ कोनॊ मौजूदा पन्ना के बदले ई स्थानांतरण नै करॆ सकॆ छियै.\n\n'''चेतावनी!'''\nयदि पन्ना काफ़ी लोकप्रिय छै तॆ ओकरा लेली ई एक बहुत बड़ा व अकस्मात् परिवर्तन हुऎ सकॆ छै;\nआगू बढ़ला सॆं पहले अंजाम अच्छा सॆं समझी लॆ.\n\n'''सूचना!'''\nस्थानांतरण करला सॆं कोय भी महत्वपूर्ण लेख मॆं अनपेक्षित बदलाव हुऎ सकॆ छै\nआपनॆ सॆं अनुरोध छै कि आपनॆ एकरॊ परिणाम जानी लियै.",
        "movepagetalktext": "संबंधित वार्ता पृष्ठ ऐकरॊ साथ स्थानांतरीत नै होतै '''अगर:'''\n* आपनॆ पन्ना दोसरॊ नामस्थान मॆं स्थानांतरीत करी रहलॊ छहॊ.\n* इ नाम के वार्ता पृष्ठ पहलॆ सॆं बनलॊ छै, या\n* नीचॆं देलॊ गेलॊ चेक बॉक्स आपनॆ निकाली देनॆ छियै.\n\nइ मामला मॆं आपनॆकॆ स्वयं इ पन्ना जोडै लॆ पड़तै.",
-       "movearticle": "पन्ना केरॊ स्थानांतरण",
        "newtitle": "नया शीर्षक दन्नॆ:",
        "move-watch": "ध्यान रखॊ स्रोत आरू लक्ष्य फाइल के",
        "movepagebtn": "पन्ना स्थांतरण करॊ",
        "movelogpage": "स्थानांतरण सूची",
        "movereason": "कारण:",
        "revertmove": "पुरानॊ अवतरण पर लॆ चलॊ (रिवर्ट)",
-       "export": "पनà¥\8dना à¤\95à¥\86 à¤¨à¤¿à¤°à¥\8dयात à¤\95रà¥\8a",
-       "thumbnail-more": "बड़ा à¤\95रà¥\8a",
-       "tooltip-pt-userpage": "à¤\86पनà¥\86 के प्रयोक्ता पन्ना",
-       "tooltip-pt-mytalk": "à¤\86पनà¥\86 के वार्ता पन्ना",
-       "tooltip-pt-preferences": "à¤\86पनà¥\86 के वरीयता",
-       "tooltip-pt-watchlist": "à¤\86पनà¥\86 à¤\95à¥\87 à¤§à¥\8dयान à¤¦à¥\87लà¥\8a पन्ना के सूची",
-       "tooltip-pt-mycontris": "à¤\86पनà¥\86 à¤\95à¥\87 à¤¯à¥\8bà¤\97दानà¥\8a के सूची",
-       "tooltip-pt-login": "à¤\86पनà¥\86 à¤¸à¥\86à¤\82 सत्रारंभ करै के गुज़ारिश छै; लेकिन इ अनिवार्य नै छै.",
+       "export": "पनà¥\8dना à¤\95à¥\91 à¤¨à¤¿à¤°à¥\8dयात à¤\95रऽ",
+       "thumbnail-more": "बड़ा à¤\95रऽ",
+       "tooltip-pt-userpage": "à¤\86पनà¥\91 के प्रयोक्ता पन्ना",
+       "tooltip-pt-mytalk": "à¤\86पनà¥\91 के वार्ता पन्ना",
+       "tooltip-pt-preferences": "à¤\86पनà¥\91 के वरीयता",
+       "tooltip-pt-watchlist": "à¤\86पनà¥\91 à¤\95à¥\87 à¤§à¥\8dयान à¤¦à¥\87लऽ पन्ना के सूची",
+       "tooltip-pt-mycontris": "à¤\86पनà¥\91 à¤\95à¥\87 à¤¯à¥\8bà¤\97दानऽ के सूची",
+       "tooltip-pt-login": "à¤\86पनà¥\91 à¤¸à¤\82à¥\91 सत्रारंभ करै के गुज़ारिश छै; लेकिन इ अनिवार्य नै छै.",
        "tooltip-pt-logout": "सत्रांत",
-       "tooltip-ca-talk": "सामग्री पन्ना केरॊ बारे मॆं वार्तालाप",
-       "tooltip-ca-edit": "आपनॆ इ पन्ना बदलॆ सकै छौ, कृपया बदलाव संजोवै सॆं पहलॆ झलक देखॊ.",
-       "tooltip-ca-addsection": "नया विभाग शुरू करॊ",
-       "tooltip-ca-viewsource": "इ पन्ना सुरक्षित छै आपनॆ एकरॊ स्रोत देखॆ सकै छियै.",
-       "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": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¥\8dथानाà¤\82तरित à¤\95रà¥\8a",
-       "tooltip-ca-watch": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\86 à¤\86पनà¥\8a à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\86à¤\82 à¤¡à¤¾à¤²à¥\8a",
+       "tooltip-ca-move": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¥\8dथानाà¤\82तरित à¤\95रऽ",
+       "tooltip-ca-watch": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\91 à¤\86पनऽ à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¤\82à¥\91 à¤¡à¤¾à¤²à¤½",
        "tooltip-ca-unwatch": "इ पन्ना कॆ आपनॊ ध्यानसूची सॆं हटाबॊ.",
-       "tooltip-search": "{{SITENAME}} में खोजॊ",
-       "tooltip-search-go": "अगर इ शीर्षक के पन्ना छै तॆ ओकरा पॆ चलॊ",
-       "tooltip-search-fulltext": "इ वाक्यांश कॆ पन्ना मॆं खोजॊ",
-       "tooltip-n-mainpage": "मुखपृष्ठ पॆ जा",
-       "tooltip-n-mainpage-description": "मुख्य पन्ना पर पधारॊ",
-       "tooltip-n-portal": "प्रकल्प के बारे मेँ, आपनॆ की करॆ सकॆ छियै, मदद कहाँ से लेभॆ",
-       "tooltip-n-currentevents": "हाल के घटना के पृष्ठभूमि प्राप्त करॊ.",
-       "tooltip-n-recentchanges": "विकि मॆं हाल मॆं होलॊ बदलावॊ के फ़ेहरिस्त",
+       "tooltip-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": "मदत à¤®à¤¿à¤²à¥\88 à¤\95à¥\87रà¥\8a à¤ à¤¿à¤\95ानà¥\8a",
-       "tooltip-t-whatlinkshere": "यहाà¤\81à¤\95रà¥\8a à¤¹à¤µà¤¾à¤²à¤¾ à¤¦à¥\88 à¤µà¤¾à¤²à¤¾ à¤¸à¤¬à¤­à¥\86 à¤µà¤¿à¤\95ि à¤ªà¤¨à¥\8dना à¤\95à¥\87 सूची",
-       "tooltip-t-recentchangeslinked": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¥\87 à¤\9cà¥\81ड़लà¥\8a à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¹à¥\8bलà¥\8a à¤¹à¤¾à¤² à¤\95à¥\87 बदलाव",
+       "tooltip-n-help": "मदत à¤®à¤¿à¤²à¥\88 à¤\95à¥\87रऽ à¤ à¤¿à¤\95ानऽ",
+       "tooltip-t-whatlinkshere": "यहाà¤\81à¤\95रà¥\91 à¤¹à¤µà¤¾à¤²à¤¾ à¤¦à¥\88 à¤µà¤¾à¤²à¤¾ à¤¸à¤¬à¥\8dभà¥\87 à¤µà¤¿à¤\95ि à¤ªà¤¨à¥\8dना à¤\95à¥\87रऽ सूची",
+       "tooltip-t-recentchangeslinked": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¥\91 à¤\9cà¥\81ड़लऽ à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¹à¥\8bलऽ à¤¹à¤¾à¤² à¤\95à¥\87रऽ बदलाव",
        "tooltip-feed-rss": "इ पन्ना के आरएसएस फ़ीड",
        "tooltip-feed-atom": "इ पन्ना के अणु फ़ीड",
-       "tooltip-t-contributions": "à¤\87 à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤¯à¥\8bà¤\97दान à¤\95à¥\87रà¥\8a सूची देखियै",
+       "tooltip-t-contributions": "à¤\87 à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤¯à¥\8bà¤\97दान à¤\95à¥\87रऽ सूची देखियै",
        "tooltip-t-emailuser": "इस सदस्य कॆ इमेल भेजॊ",
-       "tooltip-t-upload": "फाà¤\88ल à¤²à¤¾à¤¦à¥\8a (अपलोड )",
-       "tooltip-t-specialpages": "à¤\96़ास à¤ªà¤¨à¥\8dना à¤\95à¥\87रà¥\8a सूची",
+       "tooltip-t-upload": "फाà¤\88ल à¤²à¤¾à¤¦à¤½ (अपलोड )",
+       "tooltip-t-specialpages": "à¤\96़ास à¤ªà¤¨à¥\8dना à¤\95à¥\87रऽ सूची",
        "tooltip-t-print": "इ पन्ना के छापे लायक संस्करण.",
        "tooltip-t-permalink": "इ पन्ना के संसोधन खातिर स्थायी लिंक",
-       "tooltip-ca-nstab-main": "सामà¤\97à¥\8dरà¥\80 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96à¥\8a",
+       "tooltip-ca-nstab-main": "सामà¤\97à¥\8dरà¥\80 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96ऽ",
        "tooltip-ca-nstab-user": "सदस्य पन्ना देखियै",
-       "tooltip-ca-nstab-special": "à¤\87 à¤\8fà¤\97à¥\8a à¤\96ास à¤ªà¤¨à¥\8dना à¤\9bà¥\88, à¤\86पनà¥\86 à¤\8fà¤\95रा à¤¬à¤¦à¤²à¥\86 à¤¨à¥\8b सकै छियै.",
+       "tooltip-ca-nstab-special": "à¤\87 à¤\8fà¤\97ऽ à¤\96ास à¤ªà¤¨à¥\8dना à¤\9bà¥\88, à¤\86पनà¥\91 à¤\8fà¤\95रा à¤¬à¤¦à¤²à¥\91 à¤¨à¥\88 सकै छियै.",
        "tooltip-ca-nstab-project": "प्रोजेक्ट पन्ना देखियै",
-       "tooltip-ca-nstab-image": "फाà¤\87ल à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96à¥\8a",
-       "tooltip-ca-nstab-template": "à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f à¤¦à¥\87à¤\96ियà¥\87à¤\82",
-       "tooltip-ca-nstab-category": "शà¥\8dरà¥\87णà¥\80 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96à¥\8a",
+       "tooltip-ca-nstab-image": "फाà¤\87ल à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96ऽ",
+       "tooltip-ca-nstab-template": "à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f à¤¦à¥\87à¤\96ियà¥\88",
+       "tooltip-ca-nstab-category": "शà¥\8dरà¥\87णà¥\80 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96ऽ",
        "tooltip-minoredit": "ऐकरा छोटा बदलाव के तौर पर दर्ज करॊ",
-       "tooltip-save": "à¤\86पनà¥\8a à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\86 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95रà¥\8a",
-       "tooltip-preview": "à¤\86पनà¥\8a à¤¬à¤¦à¤²à¤¾à¤µà¥\8a à¤\95à¥\87 à¤\9dलà¤\95 à¤¦à¥\87à¤\96à¥\8a, à¤\95à¥\83पया à¤¸à¤\81à¤\9cà¥\8bला à¤¸à¥\86à¤\82 à¤ªà¤¹à¤¿à¤¨à¥\88 à¤\90à¤\95रà¥\8a à¤\87सà¥\8dतà¥\87माल à¤\95रà¥\8a !",
-       "tooltip-diff": "à¤\87 à¤ªà¤¾à¤ à¥\8dय à¤®à¥\86à¤\82 à¤\86पनà¥\8a à¤¦à¥\8dवारा à¤\95रलà¥\8a à¤¬à¤¦à¤²à¤¾à¤µ à¤¦à¥\87à¤\96à¥\8a.",
+       "tooltip-save": "à¤\86पनऽ à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\91 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95रऽ",
+       "tooltip-preview": "à¤\86पनऽ à¤¬à¤¦à¤²à¤¾à¤µà¤½ à¤\95à¥\87 à¤\9dलà¤\95 à¤¦à¥\87à¤\96ऽ, à¤\95à¥\83पया à¤¸à¤\81à¤\9cà¥\8bला à¤¸à¤\82à¥\91 à¤ªà¤¹à¤¿à¤¨à¥\88 à¤\90à¤\95रऽ à¤\87सà¥\8dतà¥\87माल à¤\95रऽ.",
+       "tooltip-diff": "à¤\87 à¤ªà¤¾à¤ à¥\8dय à¤®à¤\82à¥\91 à¤\86पनà¥\91 à¤¦à¥\8dवारा à¤\95रलऽ à¤¬à¤¦à¤²à¤¾à¤µ à¤¦à¥\87à¤\96ऽ.",
        "tooltip-compareselectedversions": "इ पन्ना के चुनलॊ अवतरणॊ मॆं फर्क देखाबॊ.",
        "tooltip-watch": "इ पन्ना कॆ आपनॊ ध्यानसूची मॆं डालॊ.",
-       "tooltip-rollback": " \"वापस लॆ चलॊ\" इ पन्ना के पिछला योगदाता के बदलाव एक्के चटका में ग़ायब करी दै छै.",
-       "tooltip-undo": "\"पुरानॊ स्थिति पर लानॊ\" इ बदलाव कॆ वापस लॆ जाय कॆ संपादन पर्चा कॆ झलक रीति मॆं दिखलाबै छै.\nएकरॊ जरिया सारांश मॆं पुरानॊ स्थिति मॆं लानै के कारण लिखलॊ जाबॆ पारॆ.",
+       "tooltip-rollback": " \"वापस ल॑ चलऽ\" इ पन्ना के पिछला योगदाता के बदलाव एक्के चटका मं॑ ग़ायब करी दै छै.",
+       "tooltip-undo": "\"पुरानऽ स्थिति पर लानऽ\" इ बदलाव क॑ वापस ल॑ जाय क॑ संपादन पर्चा क॑ झलक रीति म॑ दिखलाबै छै.\nएकरऽ जरिया सं॑ सारांश मं॑ पुरानऽ स्थिति मं॑ लानै के कारण लिखलऽ जाब॑ पार॑.",
+       "tooltip-summary": "एक संक्षिप्त सारांश दर्ज करऽ",
+       "simpleantispam-label": "स्पैम-विरोधी जाँच.\nएकरा म॑ इ <strong>नै</strong> भरऽ!",
+       "pageinfo-toolboxlink": "पृष्ठ सूचना",
        "previousdiff": " पुराना संपादन",
        "nextdiff": "टटका संपादन",
        "file-info-size": "$1 × $2 चित्रतत्व, संचिका के आकार: $3, MIME प्रकार: $4",
-       "file-nohires": "सà¥\86à¤\82 ज्यादा रिज़ोल्यूशन उपलब्ध नै छै.",
+       "file-nohires": "सà¥\91 ज्यादा रिज़ोल्यूशन उपलब्ध नै छै.",
        "svg-long-desc": "SVG फ़ाईल, साधारणत: $1 × $2 पीक्सेल्स, फ़ाईल केरॊ आकार: $3",
        "show-big-image": "संपूर्ण रिजोल्यूशन",
+       "show-big-image-preview": "इ पूर्वावलोकन के आकार:  $1 ।",
+       "show-big-image-other": "अन्य  {{PLURAL:$2| resolution|resolutions}}:$1",
+       "show-big-image-size": "$1 × $2  पिक्सेल",
        "bad_image_list": "फोर्मेट निम्न अनुसार छै:\nखाली सूची सामग्री (* सॆं शुरु होय वाला पंक्ति ) चुनलॊ जैतै.\nपंक्ति पर पहिला लिंक एगो खराब फाईल के साथ जुड़ल होना चाहियॊ.\nकोय भी बाद वाला लिंक ओही पंक्ति पर अईला पर ओकरा अपवाद मानलॊ जैतै, अर्थात वू पन्ना जेकरॊ अंदर इ फाईल जुङलॊ हुऎ सकॆ छै.",
        "metadata": "मेटाडाटा",
-       "metadata-help": "à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤®à¥\86 à¤\85तिरिà¤\95à¥\8dत à¤\9cानà¤\95ारà¥\80 à¤\9bà¥\88, à¤¹à¥\81à¤\8e à¤¸à¤\95à¥\86 à¤\9bà¥\88 à¤\95ि à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤¬à¤¨à¤¾à¤¬à¥\88 à¤®à¥\86à¤\82 à¤\87सà¥\8dतà¥\87माल à¤\95रलà¥\8a à¤\97à¥\87लà¥\8a à¤¸à¥\8dà¤\95à¥\88नर à¤\85थवा à¤\95à¥\88मरा à¤¸à¥\86à¤\82 à¤\87 à¤ªà¥\8dरापà¥\8dत à¤¹à¥\8bलà¥\8a à¤¹à¥\81à¤\92. à¤\85à¤\97र à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤¬à¤¦à¤²à¥\80 à¤¦à¥\87लà¥\8a à¤\97à¥\87लà¥\8a à¤\9bà¥\88 à¤¤à¥\86 à¤\88 à¤\9cानà¤\95ारà¥\80 à¤¨à¤¯à¤¾ à¤«à¤¼à¤¾à¤\88ल à¤¸à¥\86à¤\82 मेल नै खाबै के आशंका छै.",
+       "metadata-help": "à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤®à¤\82à¥\91 à¤\85तिरिà¤\95à¥\8dत à¤\9cानà¤\95ारà¥\80 à¤\9bà¥\88, à¤¹à¥\81à¤\85à¥\91 à¤¸à¤\95à¥\88 à¤\9bà¥\88 à¤\95ि à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤¬à¤¨à¤¾à¤¬à¥\88 à¤®à¤\82à¥\91 à¤\87सà¥\8dतà¥\87माल à¤\95रलऽ à¤\97à¥\87लऽ à¤¸à¥\8dà¤\95à¥\88नर à¤\85थवा à¤\95à¥\88मरा à¤¸à¤\82à¥\91 à¤\87 à¤ªà¥\8dरापà¥\8dत à¤¹à¥\8bलऽ à¤¹à¥\81à¤\85à¥\91. à¤\9cà¥\8bà¤\82 à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤¬à¤¦à¤²à¥\80 à¤¦à¥\87लऽ à¤\97à¥\87लऽ à¤\9bà¥\88 à¤¤à¥\91 à¤\88 à¤\9cानà¤\95ारà¥\80 à¤¨à¤¯à¤¾ à¤«à¤¼à¤¾à¤\88ल à¤¸à¤\82à¥\91 मेल नै खाबै के आशंका छै.",
        "metadata-expand": "अतिरिक्त जानकारी दिखाबॊ",
        "metadata-collapse": "विस्तारित जानकारी छुपाबॊ",
-       "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",
+       "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-orientation": "अभिविन्यास",
+       "exif-xresolution": "होरिज़ॉंटल रिज़ोल्यूशन",
+       "exif-yresolution": "व्हर्टिकल रिज़ोल्यूशन",
+       "exif-datetime": "फ़ाईल बदलाव दिनांक आरू समय",
+       "exif-make": "कैमेरा उत्पादक",
+       "exif-model": "कैमेरा मॉडेल",
+       "exif-software": "इस्तेमाल करलऽ गेलऽ सॉफ्टवेयर",
+       "exif-exifversion": "Exif अवतरण",
+       "exif-colorspace": "रंगांकन (कलर स्पेस)",
+       "exif-datetimeoriginal": "डाटा बनाबै के दिनांक आरू समय",
+       "exif-datetimedigitized": "डिजिटाईज़िंग केरऽ दिनांक आरू समय",
+       "exif-orientation-1": "सामान्य",
        "namespacesall": "सब्भे",
        "monthsall": "सब्भे",
        "watchlisttools-view": "प्रासंगिक बदलाव देखॊ",
        "watchlisttools-edit": "ध्यानसूची देखॊ आरू संपादित करॊ.",
        "watchlisttools-raw": "अनिर्मित ध्यानसूची देखॊ एवम्‌ संपादित करॊ",
-       "specialpages": "खास पन्ना"
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|वार्ता]])",
+       "specialpages": "खास पन्ना",
+       "tag-filter": "[[Special:Tags|चिप्पी]] छननी:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग}}]]: $2)",
+       "logentry-delete-delete": "$1 न॑ पृष्ठ $3 {{GENDER:$2|हटाय}} देलकै",
+       "logentry-move-move": "$1 न॑ $3 पृष्ठ $4 पर {{GENDER:$2|स्थानांतरित}} करलकै",
+       "logentry-newusers-create": "यूजर खाता $1 {{GENDER:$2|बनैलऽ गेलै}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|अपलोड}} $3",
+       "searchsuggest-search": "खोजऽ"
 }
index ad3d672..a400c98 100644 (file)
@@ -53,7 +53,8 @@
                        "Macofe",
                        "Yahya Sakhnini",
                        "Mervat Salman",
-                       "Shbib Al-Subaie"
+                       "Shbib Al-Subaie",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "nstab-template": "قالب",
        "nstab-help": "صفحة مساعدة",
        "nstab-category": "تصنيف",
+       "mainpage-nstab": "الصفحة الرئيسية",
        "nosuchaction": "لا يوجد فعل كالذي طلبت",
        "nosuchactiontext": "الفعل المحدد بواسطة المسار غير صحيح.\nربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت رابطا غير صحيح.\nو قد يكون مرجع هذا علة في {{SITENAME}}.",
        "nosuchspecialpage": "لا توجد صفحة خاصة بهذا الاسم",
        "mergehistory-go": "عرض التعديلات القابلة للدمج",
        "mergehistory-submit": "دمج المراجعات",
        "mergehistory-empty": "لا مراجعات يمكن دمجها.",
-       "mergehistory-success": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح في [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من $1 تم دمجها بنجاح في [[:$2]].",
        "mergehistory-fail": "غير قادر على عمل دمج التاريخ، من فضلك أعد التحقق من محددات الصفحة والزمن.",
        "mergehistory-fail-toobig": "لا يمكن إجراء دمج التاريخ بسبب تجاوز حدود عدد المراجعات المنقولة {{PLURAL:$1|المراجعة الواحدة|المراجعتين|$1 مراجعات|$1 مراجعة}}.",
        "mergehistory-no-source": "الصفحة المصدر $1 غير موجودة.",
        "upload-http-error": "صودف خطأ HTTP: $1",
        "upload-copy-upload-invalid-domain": "رفع النسخ غير متاح من هذا الموقع",
        "upload-dialog-title": "رفع الملف",
-       "upload-dialog-error": "حدث خطأ",
-       "upload-dialog-warning": "حدث تنبيه",
        "upload-dialog-button-cancel": "إلغاء",
        "upload-dialog-button-done": "تم",
        "upload-dialog-button-save": "احفظ",
        "upload-dialog-button-upload": "رفع",
-       "upload-dialog-label-select-file": "اختر ملفا",
-       "upload-dialog-label-infoform-title": "التفاصيل",
-       "upload-dialog-label-infoform-name": "الاسم",
-       "upload-dialog-label-infoform-description": "الوصف",
-       "upload-dialog-label-usage-title": "الاستخدام",
-       "upload-dialog-label-usage-filename": "اسم الملف",
+       "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 غير موجود.",
        "filerevert-legend": "استرجع الملف",
        "filerevert-intro": "أنت تسترجع '''[[Media:$1|$1]]''' [$4 لنسخة بتاريخ $2، $3].",
        "filerevert-comment": "السبب:",
-       "filerevert-defaultcomment": "استرجع للنسخة بتاريخ $2، $1",
+       "filerevert-defaultcomment": "استرجع للنسخة بتاريخ $2، $1 ($3)",
        "filerevert-submit": "استرجع",
        "filerevert-success": "'''[[Media:$1|$1]]''' تم استرجاعها [$4 للنسخة بتاريخ $3، $2].",
        "filerevert-badversion": "لا توجد نسخة محلية سابقة لهذا الملف بالتاريخ المعطى.",
        "unusedimages": "ملفات غير مستخدمة",
        "wantedcategories": "تصنيفات مطلوبة",
        "wantedpages": "صفحات مطلوبة",
+       "wantedpages-summary": "قائمة بالصفحات غير الموجودة التي لديها أكثر وصلات لها، باستثناء الصفحات التي تحويلات فقط تصل إليها. لقائمة بالصفحات غير الموجودة التي توجد تحويلات تصل إليها، انظر [[{{#special:BrokenRedirects}}|قائمة التحويلات المكسورة]].",
        "wantedpages-badtitle": "عنوان غير صحيح في مجموعة النتائج: $1",
        "wantedfiles": "ملفات مطلوبة",
        "wantedfiletext-cat": "الملفات التالية مستعملة ولكن لا وجود لها. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة. بالإضافة، أي صفحات تتضمن الملفات الغير موجودة تم سردها في [[:$1]].",
        "movepagetext": "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى الاسم الجديد.\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": "صفحة النقاش المرفقة سيتم نقلها كذلك، '''إلا في حالة''':\n* توجد صفحة نقاش غير فارغة تحت العنوان الجديد، أو\n* قمت بإزالة اختيار الصندوق بالأسفل.\n\nوفي هذه الحالات، يجب عليك نقل أو دمج محتويات الصفحة يدويا، إذا رغب في ذلك.",
-       "movearticle": "انقل الصفحة:",
        "moveuserpage-warning": "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم لن يعاد تسميته.'''",
        "movecategorypage-warning": "<strong>تحذير:</strong> أنت على وشك نقل صفحة التصنيف إلى عنوان جديد؛ <em>لن</em> تنقل الصفحات المندرجة تحت التصنيف إلى العنوان الجديد.",
        "movenologintext": "يجب أن تكون مستخدماً مسجلاً وأن  [[Special:UserLogin|تسجل دخولك]] لكي تنقل صفحة.",
        "version-entrypoints-header-url": "المسار",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath مسار المقالات]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath مسار السكريبت]",
-       "version-libraries": "مكتبات مثبته",
+       "version-libraries": "مكتبات مثبتة",
        "version-libraries-library": "المكتبة",
        "version-libraries-version": "الإصدارة",
        "version-libraries-license": "الترخيص",
        "logentry-newusers-create2": "أنشأ $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-rights-rights": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3 من $4 إلى $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3",
        "logentry-rights-autopromote": "تمت تلقائيا ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من  $4 إلى $5",
        "api-error-badaccess-groups": "لا يسمح لك بتحميل الملفات إلى هذه الويكي.",
        "api-error-badtoken": "خطأ داخلي: رمز مميز غير صحيح.",
        "api-error-copyuploaddisabled": "تم تعطيل تحميل من رابط على هذا الخادم.",
-       "api-error-duplicate": "هناك {{PLURAL:$1|هو [$2 ملف آخر [|كذلك]$2 بعض الملفات الأخرى]}} مسبقاً على الموقع بنفس المضمون.",
-       "api-error-duplicate-archive": "هناك {{PLURAL:$1|كان [$2 ملف آخر] |كذلك [$2 بعض الملفات الأخرى]}} مسبقاً على الموقع بنفس المضمون، ولكن {{PLURAL:$1|أنه تم | إجراء}} الحذف لها.",
-       "api-error-duplicate-archive-popup-title": "تكرار {{PLURAL:$1|ملف|ملفات}} قد تم حذفه مسبقاً",
-       "api-error-duplicate-popup-title": "ارفع {{PLURAL:$1|الملف|الملف|الملفين|الملفات|الملفات|الملفات}}",
+       "api-error-duplicate": "هناك {{PLURAL:$1|هو ملف آخر|كذلك$2 بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون.",
+       "api-error-duplicate-archive": "هناك {{PLURAL:$1|كان ملف آخر |كذلك بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون، ولكن {{PLURAL:$1|أنه تم | إجراء}} الحذف لها.",
        "api-error-empty-file": "كان ملف الذي قمت بإرسال فارغة.",
        "api-error-emptypage": "إنشاء صفحات فارغة جديدة، غير مسموح به.",
        "api-error-fetchfileerror": "خطأ داخلي: قد حدث خطأ أثناء إحضار الملف.",
index 9d4f6c4..e3c175d 100644 (file)
        "mergehistory-go": "wrri ṫ-ṫĝdilaṫ lli yṣlaḫ ṫndamj",
        "mergehistory-submit": "dmj lmorajaat",
        "mergehistory-empty": "ḫṫṫa moṛajaĝaṫ ma ymkn ṫdmj.",
-       "mergehistory-success": "$3 {{PLURAL:$3|l-moṛajaĝa|maṛajaĝa}} d-[[:$1]] ṫdmjaṫ b-najaḫ f-[[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|l-moṛajaĝa|maṛajaĝa}} d-$1 ṫdmjaṫ b-najaḫ f-[[:$2]].",
        "mergehistory-no-source": "ṣfḫṫ l-ṃṣḍṛ $1 ma kayna-ċ.",
        "mergehistory-no-destination": "ṣfḫṫ l-hadaf $1 ma kayna-ċ.",
        "mergehistory-invalid-source": "ṣfḫṫ l-ṃṣḍṛ ĥaṣ ṫkon ĝonwan ṣḫiḫ.",
        "move-page-legend": "Neqqel ṣ-ṣefḫa",
        "movepagetext": "Ila sṫeĝmelṫi l-formulér li l-ṫeḫṫ, ċi ṣefḫa ġadi ṫĝawed ṫṫsemma o ġadi ṫneqqel ṫ-ṫariĥ kollo le s-smiya j-jdida.\nL-Ĝonwan l-qdim ġadi iwelli ṣefḫa jdida li ġadi ṫḫowwlek le l-ĝonwan j-jdid.\nImken lek ṫjedded otomaṫikiyan ṫ-ṫeḫwilaṫ li kayddiw le l-ĝonwan l-'aṣli.\nIla ma bġiṫiċ, ṫ'ekked ma ṫeḫḍi kolla [[Special:DoubleRedirects|dobl-ṫeḫwila]] ola koll [[Special:BrokenRedirects|ṫ-ṫeḫwilaṫ l-mherrsin]].\nRak mes'ol baċ ṫraqeb ila l-lyanaṫ baqyin kayddiw le l-maḫel fin ĥaṣṣhom iddiwek.\n\nLaḫed belli ṣ-ṣefḫa '''ma ġadiċ''' ṫṫneqqel ila fayeṫ kayna ċi ṣefḫa be had l-ĝonwan, illa ila kaneṫ ĥawya ola ċi ṫeḫwil ma ĝendo ḫṫa ṫariĥ dyal ṫeĝdilaṫ fayeṫ.\nMeĝniyṫha imken lek ṫĝawed ṫrejjeĝ l-ĝonwan l-'aṣli ila konṫi ġletṫi, o ma imken lekċ ṫekṫeb ĝla ṣefḫa mojoda.\n\n'''Ĝendak!'''\nImken hadċi y'eddi ṫeġyiraṫ hammin ila kaneṫ ċi ṣefḫa kayqrawha n-nas bezzaf;\nĜafak kon mṫ'ekked belli nṫa ĝaref ċno kaṫdir qbel ma ṫebda ay ḫaja.",
        "movepagetalktext": "Ila kaneṫ ċi ṣefḫa dyal n-niqaċ mĝaha, ġadi ṫĝawed ṫṫsemma otomaṫikiyan '''illa ila:'''\n* neqqelṫi ṣ-ṣefḫa le maḫel de s-smiyaṫ weḫdaĥor, ola\n* ṣefḫa dyal n-niqaċ ma ĥawyaċ msemmya bḫal bḫal, ola\n* brekṫi ĝla l-ĝalama li men l-ṫeḫṫ.",
-       "movearticle": "Neqqel ṣ-ṣefḫa",
        "movenotallowed": "ma ĝndek-ċ l-heqq ṫneqqel ṣ-ṣfaḫi.",
        "movenotallowedfile": "ma ĝndekċ l-heqq ṫnqqel l-milffaṫ.",
        "cant-move-user-page": "Ma ĝendekċ l-ḫeqq ṫneqqel ṣ-ṣefḫaṫ r-ra'isiyya.",
index 301dcc8..360a696 100644 (file)
@@ -9,7 +9,8 @@
                        "Ouda",
                        "Ramsis II",
                        "아라",
-                       "Oldstoneage"
+                       "Oldstoneage",
+                       "Macofe"
                ]
        },
        "tog-underline": "حط خط تحت اللينكات:",
        "mergehistory-go": "عرض التعديلات اللى ممكن تتدمج",
        "mergehistory-submit": "دمج النسخ",
        "mergehistory-empty": "مافيش مراجعات ممكن دمجها.",
-       "mergehistory-success": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح فى [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من $1 تم دمجها بنجاح فى [[:$2]].",
        "mergehistory-fail": "مش قادر يعمل دمج للتاريخ، لو سمحت تتأكد تانى من محددات الصفحة والزمن.",
        "mergehistory-no-source": "الصفحة المصدر $1  مش موجودة.",
        "mergehistory-no-destination": "الصفحه الهدف $1 مش موجوده.",
        "filerevert-legend": "استرجع الملف",
        "filerevert-intro": "أنت بترجع '''[[Media:$1|$1]]''' [$4 للنسخةاللى بتاريخ $2، $3].",
        "filerevert-comment": "السبب:",
-       "filerevert-defaultcomment": "رجع النسخة اللى بتاريخ $2، $1",
+       "filerevert-defaultcomment": "رجع النسخة اللى بتاريخ $2، $1 ($3)",
        "filerevert-submit": "استرجع",
        "filerevert-success": "'''[[Media:$1|$1]]''' اترجعت [$4 للنسخةاللى بتاريخ $2، $3].",
        "filerevert-badversion": "مافيش نسخة محلية قديمة  للملف دا بالتاريخ المتقدم",
        "move-page-legend": "انقل الصفحة",
        "movepagetext": "لو استعملت النموذج ده ممكن تغير اسم الصفحه، و تنقل تاريخها للاسم الجديد.\nهاتبتدى تحويله من العنوان القديم للصفحه بالعنوان الجديد.\nلكن،  الوصلات فى الصفحات اللى بتتوصل بالصفحه دى مش ها تتغيير؛  اتأكد من ان مافيش  [[Special:BrokenRedirects|وصلات مقطوعه]] ، أو [[Special:DoubleRedirects|وصلات متتاليه]] ، للتأكد من أن المقالات تتصل مع بعضها بشكل مناسب.\n\nلاحظ ان الصفحه مش هاتتنقل لو كان فيه صفحه بالاسم الجديد، إلا إذا كانت صفحة فاضيه، أو صفحة تحويل، ومالهاش تاريخ. و ده معناه أنك مش ها تقدر تحط صفحه مكان صفحه، كمان ممكن ارجاع الصفحه لمكانها فى حال تم النقل بشكل غلط.\n\n'''تحذير!'''\nنقل الصفحه ممكن يكون له اثار كبيرة، وتغييرات مش متوقعه بالنسبة للصفحات المشهوره. من فضلك  اتأكد من فهم عواقب نقل الصفحات قبل ما تقوم بنقل الصفحه.",
        "movepagetalktext": "صفحة المناقشه بتاعة المقاله هاتتنقل برضه، لو كانت موجوده. لكن صفحة المناقشه '''مش''' هاتتنقل فى الحالات دى:\n* نقل الصفحة عبر نطاقات  مختلفه.\n*فيه  صفحة مناقشه موجوده تحت العنوان الجديد للمقاله.\n* لو انت شلت اختيار نقل صفحة المناقشه .\n\nوفى الحالات  دى، لو عايز  تنقل صفحة المناقشه  لازم تنقل أو تدمج محتوياتها  يدويا.",
-       "movearticle": "انقل الصفحه:",
        "moveuserpage-warning": "'''خد بالك:''' انت ح تعمل نقل لصفحه بتاعة يوزر. لو سمحت تعمل حسابك ان الصفحه هى بس اللى ح تتنقل و اسم اليوزر''مش'' ح يتغير.",
        "movenologintext": "لازم تكون يوزر متسجل و تعمل [[Special:UserLogin|دخول]] علشان تنقل الصفحة.",
        "movenotallowed": "ماعندكش الصلاحية لنقل الصفحات.",
index f8a88f2..0bd054a 100644 (file)
@@ -18,7 +18,8 @@
                        "Aftabuzzaman",
                        "Macofe",
                        "IKHazarika",
-                       "Dibya Dutta"
+                       "Dibya Dutta",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "সংযোগসমূহ অধোৰেখিত কৰক:",
        "createacct-captcha": "সুৰক্ষা পৰীক্ষা",
        "createacct-imgcaptcha-ph": "ওপৰত দেখা পোৱা পাঠ্য লিখক",
        "createacct-submit": "আপোনাৰ একাউণ্ট সৃষ্টি কৰক",
-       "createacct-another-submit": "à¦\86ন à¦\8fà¦\9fা à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰà¦\95",
+       "createacct-another-submit": "একাউণ্ট সৃষ্টি কৰক",
        "createacct-benefit-heading": "আপোনাৰ দৰে মানুহেই {{SITENAME}} তৈয়াৰ কৰিছে",
        "createacct-benefit-body1": "{{PLURAL:$1|সম্পাদনা}}",
        "createacct-benefit-body2": "{{PLURAL:$1|পৃষ্ঠা|পৃষ্ঠাসমূহ}}",
        "createacct-benefit-body3": "শেহতীয়া {{PLURAL:$1|অৱদানকাৰী|অৱদানকাৰীসকল}}",
        "badretype": "আপুনি দিয়া গুপ্ত শব্দ দুটা মিলা নাই।",
+       "usernameinprogress": "এই সদস্য নামৰ এটা একাউণ্ট ইতিমধ্যে সৃষ্টি কৰি থকা হৈছে।\nঅনুগ্ৰহ কৰি ক্ষন্তেক অপেক্ষা কৰক।",
        "userexists": "আপুনি দিয়া সদস্যনাম আগৰে পৰাই ব্যৱহাৰ হৈ আছে।\nঅনুগ্ৰহ কৰি বেলেগ সদস্যনাম এটা নিৰ্বাচন কৰক।",
        "loginerror": "প্ৰৱেশ সমস্যা",
        "createacct-error": "একাউণ্ট সৃষ্টিত ত্ৰুটি",
        "passwordreset-emailtext-ip": "কোনোবাই (IP ঠিকনা $1 ৰ পৰা সম্ভৱতঃ আপুনিয়েই) {{SITENAME}} ($4) ৰ বাবে আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ অনুৰোধ জনাইছিল। ইমেইল ঠিকনাটোৰ লগত এই সদস্যৰ {{PLURAL:$3|একাউণ্ট|একাউণ্টবোৰ}} জড়িত হৈ আছে ।\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": "à¦\8fà¦\96ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\89দà§\8dধাৰ à¦\87-মà§\87à¦\87ল à¦ªà¦ à¦¿à¦\93ৱা à¦¹à§\88à¦\9bà§\87।",
+       "passwordreset-emailsent": "à¦\8fà¦\87à¦\9fà§\8b à¦\86পà§\8bনাৰ à¦\8fà¦\95াà¦\89ণà§\8dà¦\9fৰ à¦ªà¦\9eà§\8dà¦\9cà§\80à¦\95à§\83ত à¦\87-মà§\87à¦\87ল à¦ à¦¿à¦\95না à¦¹à¦¯à¦¼à¦¨à§\87, à¦¹à¦¯à¦¼ à¦¯à¦¦à¦¿ à¦\8fà¦\9fা à¦\97à§\81পà§\8dতশবà§\8dদ à¦\89দà§\8dধাৰ à¦\87-মà§\87à¦\87ল à¦ªà¦ à¦¿à¦\93ৱা à¦¹'ব।",
        "passwordreset-emailsent-capture": "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে, এইখন তলত দেখা পাব।",
        "passwordreset-emailerror-capture": "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল, কিন্তু {{GENDER:$2|সদস্যজনলৈ}} পঠিয়াব পৰা নগ'ল। সেইখন তলত দেখুওৱা হৈছে: $1",
-       "changeemail": "ই-মেইল ঠিকনা সলনি কৰক",
-       "changeemail-text": "আপোনাৰ ই-মেইল ঠিকনা সলাবলৈ এই প্ৰপত্ৰখন পূৰাওক । এই সালসলনি নিশ্চিত কৰিবলৈ আপোনাৰ গুপ্তশব্দ দিব লাগিব ।",
+       "changeemail": "à¦\87-মà§\87à¦\87ল à¦ à¦¿à¦\95না à¦¸à¦²à¦¨à¦¿ à¦¨à¦¾à¦\87বা à¦¬à¦¿à¦²à§\8bপ à¦\95ৰà¦\95",
+       "changeemail-text": "আপোনাৰ ই-মেইল ঠিকনা সলাবলৈ এই প্ৰপত্ৰখন পূৰাওক। এই সালসলনি নিশ্চিত কৰিবলৈ আপোনাৰ গুপ্তশব্দ দিব লাগিব। যদি আপুনি আপোনাৰ একাউণ্টৰ লগত কোনো ই-মেইল ঠিকনা সংযোজন কৰিব নিবিচাৰে, তেনে নতুন ই-মেইল ঘৰটো খালি ৰাখক।",
        "changeemail-no-info": "এই পৃষ্ঠাটোত প্ৰৱেশাধিকাৰ পাবলৈ আপুনি লগ্‌ ইন কৰিব লাগিব।",
        "changeemail-oldemail": "বৰ্তমানৰ ই-মেইল ঠিকনা:",
        "changeemail-newemail": "নতুন ই-মেইল ঠিকনা:",
        "readonlywarning": "'''সতৰ্কবাণী: চোৱা-চিতাৰ হেতু এই তথ্যকোষ বন্ধ কৰি ৰখা হৈছে, গতিকে আপুনি এই মূহুৰ্তত আপোনাৰ সম্পাদনা সাঁচিব নোৱাৰিব।'''\nআপুনি লেখাটো টেক্সট-ফাইলত কপী-পে'ষ্ট কৰি পিছলৈ ব্যৱহাৰৰ বাবে সাঁচি ৰাখিব পাৰে।\n\nতথ্যকোষ বন্ধ কৰি ৰখা প্ৰশাসকজনে এই ব্যাখ্যা দিছে: $1",
        "protectedpagewarning": "'''সতৰ্কবাণী: এই পৃষ্ঠা বন্ধ ৰখা হৈছে; কেৱল প্ৰশাসকৰৰ মৰ্যদাৰ সদস্যইহে সম্পাদনা কৰিব পাৰিব ।'''\nআপোনাৰ সুবিধাৰ বাবে পৃষ্ঠাৰ সাম্প্ৰতিক ল'গ সংৰক্ষণ তলত দিয়া হ'ল ।",
        "semiprotectedpagewarning": "টোকা: এই পৃষ্ঠা বন্ধ ৰখা হৈছে; কেৱল পঞ্জীভূত সদস্যই হে সম্পাদনা কৰিব পাৰিব ।\nআপোনাৰ সুবিধাৰ বাবে পৃষ্ঠাৰ সাম্প্ৰতিক ল'গ সংৰক্ষণ তলত দিয়া হ'ল ।",
-       "cascadeprotectedwarning": "'''সতৰ্কবাণী:''' এই পৃষ্ঠাটো সুৰক্ষিত কৰি ৰখা হৈছে যাতে কেৱল প্ৰশাসনিক ক্ষমতা থকা সদস্যই ইয়াক সম্পাদনা কৰিব পাৰে, কাৰণ ই প্ৰপাতাকাৰ-সুৰক্ষিত  {{PLURAL:$1|পৃষ্ঠাটোৰ|পৃষ্ঠাবোৰৰ}} অন্তৰ্ভুক্ত:",
+       "cascadeprotectedwarning": "<strong>সতৰ্কবাণী:</strong> এই পৃষ্ঠাটো সুৰক্ষিত কৰি ৰখা হৈছে যাতে কেৱল প্ৰশাসনিক ক্ষমতা থকা সদস্যই ইয়াক সম্পাদনা কৰিব পাৰে, কাৰণ ই প্ৰপাতাকাৰ-সুৰক্ষিত  {{PLURAL:$1|পৃষ্ঠাটোৰ|পৃষ্ঠাবোৰৰ}} অন্তৰ্ভুক্ত:",
        "titleprotectedwarning": "'''সতৰ্কবাণী: এই পৃষ্ঠাটো সুৰক্ষিত কৰা হৈছে যাতে কেৱল [[Special:ListGroupRights|specific rights]] সদস্যই ইয়াক তৈয়াৰ কৰিব পাৰে ।'''\nআপোনাৰ সুবিধাৰ্থে অভিলেখৰ শেহতীয়া ভৰ্তি তলত দিয়া হ’ল।",
        "templatesused": "এই পৃষ্ঠাত ব্যৱহৃত {{PLURAL:$1|সাঁচ|সাঁচ সমূহ}}:",
        "templatesusedpreview": "এই খচৰাত ব্যৱহৃত {{PLURAL:$1|সাঁচ|সাঁচ সমূহ}}:",
        "mergehistory-go": "একত্ৰীকৰণযোগ্য সম্পাদনাসমূহ দেখুৱাওক",
        "mergehistory-submit": "সংস্কৰণসমূহ মিলাই দিয়ক",
        "mergehistory-empty": "কোনো সংস্কৰণ একত্ৰিত কৰিব নোৱাৰি ।",
-       "mergehistory-success": "[[:$1]] ৰ $3 {{PLURAL:$3| টা সংশোধন|টা সংশোধন}}  [[:$2]] ৰ লগত সফলতাৰে একত্ৰিত কৰা হ’ল ।",
+       "mergehistory-done": "$1 ৰ $3 {{PLURAL:$3| টা সংশোধন|টা সংশোধন}}  [[:$2]] ৰ লগত সফলতাৰে একত্ৰিত কৰা হ’ল ।",
        "mergehistory-fail": "ইতিহাস একত্ৰিত কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি পৃষ্ঠাটো আৰু সময়ৰ পাৰামিটাৰ পুনৰ পৰীক্ষা কৰক।",
        "mergehistory-no-source": "$1 নামৰ কোনো উৎস পৃষ্ঠৰ অস্তিত্ব নাই ।",
        "mergehistory-no-destination": "$1 নামৰ কোনো গন্তব্য পৃষ্ঠাৰ অস্তিত্ব নাই ।",
        "recentchangeslinked-summary": "এখন নিৰ্দিষ্ট পৃষ্ঠাৰ লগত সংযুক্ত পৃষ্ঠাসমূহৰ( বা এটা নিৰ্দিষ্ট শ্ৰেণীৰ সদস্যসমূহৰ) শেহতীয়া সালসলনিৰ তালিকা তলত দিয়া হৈছে ।\n[[Special:Watchlist|আপুনি চকু ৰখা পৃষ্ঠাসমূহৰ তালিকা]] ত থকা পৃষ্ঠাসমূহ '''গাঢ়''' দেখা পাব ।",
        "recentchangeslinked-page": "পৃষ্ঠাৰ নাম:",
        "recentchangeslinked-to": "অন্যথা নিৰ্দিষ্ট পৃষ্ঠাৰ লগত সংযুক্ত পৃষ্ঠাসমূহৰ সালসলনি দেখুৱাওক",
+       "recentchanges-page-added-to-category": "শ্ৰেণীত [[:$1]] যোগ কৰা হৈছে",
+       "recentchanges-page-removed-from-category": "শ্ৰেণীৰ পৰা [[:$1]] আঁতৰোৱা হৈছে",
        "upload": "ফাইল আপল’ড",
        "uploadbtn": "ফাইল আপল’ড কৰক",
        "reuploaddesc": "আপল’ড বাতিল কৰি আপল’ড প্ৰপত্ৰলৈ ঘূৰি যাওক",
        "upload-http-error": "এটা HTTP ত্ৰুটিয়ে দেখা দিছে: $1",
        "upload-copy-upload-invalid-domain": "এই ডমেইনত কপী আপল'ড নাপাব।",
        "upload-dialog-title": "ফাইল আপল’ড কৰক",
-       "upload-dialog-error": "এটা ত্ৰুটি পোৱা গৈছে",
-       "upload-dialog-warning": "এটা সতৰ্কবাণী পোৱা গৈছে",
        "upload-dialog-button-cancel": "বাতিল কৰক",
        "upload-dialog-button-done": "কৰা হ’ল",
        "upload-dialog-button-save": "সাঁচি থওক",
        "upload-dialog-button-upload": "আপল'ড",
-       "upload-dialog-label-select-file": "ফাইল নিৰ্বাচন কৰক",
-       "upload-dialog-label-infoform-title": "বিস্তাৰিত",
-       "upload-dialog-label-infoform-name": "নাম",
-       "upload-dialog-label-infoform-description": "বিৱৰণ",
-       "upload-dialog-label-usage-title": "ব্যৱহাৰ",
-       "upload-dialog-label-usage-filename": "ফাইলৰ নাম",
+       "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": "ফাইলৰ নাম",
        "backend-fail-stream": "$1 ফাইলটো ষ্ট্ৰীম কৰিব পৰা নগ'ল।",
        "backend-fail-backup": "$1 ফাইলটো বেকআপ্‌ কৰিব পৰা নগ'ল।",
        "backend-fail-notexists": "$1 ফাইলটোৰ কোনো অস্তিত্ব নাই।",
        "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": "পৃষ্ঠাখনৰ লগতে সংশ্লিষ্ট আলোচনা পৃষ্ঠাখনো স্বয়ংক্ৰিয়ভাৱে স্থানান্তৰ হ’ব; এনে নহয় '''যদিহে:'''\n*নতুন শিৰোনামাৰ অধীনত এটা খালি নোহোৱা আলোচনা পৃষ্ঠা ইতিমধ্যেই থাকে, বা\n*আপুনি তলৰ ঘৰটো অচিহ্নিত কৰে ।\n\nতেনে ক্ষেত্ৰত আপুনি আপুনি ইচ্ছা কৰিলে নিজ হাতে পৃষ্ঠাটো স্থানান্তৰ বা একত্ৰীকৰণ কৰিব পাৰে ।",
-       "movearticle": "পৃষ্ঠা স্থানান্তৰ কৰক:",
        "moveuserpage-warning": "'''সতৰ্কবাণী:''' আপুনি এখন সদস্যপৃষ্ঠা স্থানান্তৰ কৰিবলৈ বিছাৰিছে । অনুগ্ৰহ কৰি মন কৰক যে কেৱল সদস্যপৃষ্ঠাখনহে স্থানান্তৰ হ’ব আৰু সদস্যজনৰ পুনঃনামাকৰণ নহ’ব ।",
        "movenologintext": "পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপুনি ভুক্ত সদস্য হৈ [[Special:UserLogin|প্ৰৱেশ]] কৰিব লাগিব ।",
        "movenotallowed": "পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।",
        "api-error-badaccess-groups": "এই ৱিকিত ফাইল আপল'ড কৰিবলৈ আপোনাৰ অনুমতি নাই।",
        "api-error-badtoken": "আভ্যন্তৰীণ ত্ৰুটি: ভুল টোকেন।",
        "api-error-copyuploaddisabled": "ইউ আৰ এলৰ মাধ্যমেৰে আপল'ড কৰাটো এই চাৰ্ভাৰত নিষ্ক্ৰিয় কৰা হৈছে।",
-       "api-error-duplicate": "এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|[$2 আন এটা ফাইল]|[$2 আন কিছুমান ফাইল]}} ইতিমধ্যেই আছে।",
-       "api-error-duplicate-archive": "এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|[$2 আন এটা ফাইল]|[$2 আন কিছুমান ফাইল]}} ইতিমধ্যেই আছিল, কিন্তু {{PLURAL:$1|সেইটো|সেইবোৰ}} বিলোপ কৰা হৈছে।",
-       "api-error-duplicate-archive-popup-title": "প্ৰতিলিপি {{PLURAL:$1|ফাইল|ফাইল}} যিসমূহ ইতিমধ্যে বিলোপ কৰা হৈছে।",
-       "api-error-duplicate-popup-title": "প্ৰতিলিপি {{PLURAL:$1|ফাইল|ফাইলসমূহ}}।",
+       "api-error-duplicate": "এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|আন এটা ফাইল|আন কিছুমান ফাইল}} ইতিমধ্যেই আছে।",
+       "api-error-duplicate-archive": "এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|আন এটা ফাইল|আন কিছুমান ফাইল}} ইতিমধ্যেই আছিল, কিন্তু {{PLURAL:$1|সেইটো|সেইবোৰ}} বিলোপ কৰা হৈছে।",
        "api-error-empty-file": "আপুনি দাখিল কৰা ফাইলটো খালী ।",
        "api-error-emptypage": "নতুন, খালি পৃষ্ঠা সৃষ্টি কৰিবলৈ অনুমতি নাই।",
        "api-error-fetchfileerror": "আভ্যন্তৰীণ ত্ৰুটি: ফাইলটো অনাত কিবা সমস্যা হৈছে।",
index f615bed..48de7c7 100644 (file)
        "nstab-template": "Plantía",
        "nstab-help": "Ayuda",
        "nstab-category": "Categoría",
+       "mainpage-nstab": "Portada",
        "nosuchaction": "Nun esiste esa aición",
        "nosuchactiontext": "L'aición especificada pola URL nun ye válida.\nSeique escribieras mal la URL o siguieras un enllaz incorreutu.\nTamién podría ser un bug nel software usáu por {{SITENAME}}.",
        "nosuchspecialpage": "Nun esiste esa páxina especial",
        "viewsource": "Ver fonte",
        "viewsource-title": "Ver la fonte de $1",
        "actionthrottled": "Aición llendada",
-       "actionthrottledtext": "Como midida anti-spam, nun se pue repetir esta aición munches vegaes en pocu tiempu, y trespasasti esi llímite.\nPor favor vuelvi intentalo nunos minutos.",
+       "actionthrottledtext": "Como midida escontra abusos, nun se pué repetir esta aición munches vegaes en pocu tiempu, y trespasasti esa llende.\nVuelve a intentalo n'unos minutos.",
        "protectedpagetext": "Esta páxina ta candada pa torgar ediciones y otres aiciones.",
        "viewsourcetext": "Pues ver y copiar la fonte d'esta páxina.",
        "viewyourtext": "Pues ver y copiar la fonte de <strong>les tos ediciones</strong> d'esta páxina.",
        "createacct-captcha": "Comprobación de seguridá",
        "createacct-imgcaptcha-ph": "Escriba'l testu qu'apaez arriba",
        "createacct-submit": "Crear la cuenta",
-       "createacct-another-submit": "Crear otra cuenta",
+       "createacct-another-submit": "Crear una cuenta",
        "createacct-benefit-heading": "{{SITENAME}} failu xente como vusté.",
        "createacct-benefit-body1": "{{PLURAL:$1|edición|ediciones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|páxina|páxines}}",
        "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": "Unvióse un corréu electrónicu pa reaniciar la contraseña.",
+       "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-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 la direición de corréu electrónicu",
-       "changeemail-text": "Rellena esti formulariu pa camudar la to direición de corréu electrónicu. Tendrás d'escribir la contraseña pa confirmar esti cambéu.",
+       "changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
+       "changeemail-text": "Rellena esti formulariu pa camudar la direición de corréu electrónicu. Tendrás d'escribir la contraseña pa confirmar esti cambéu. Si quies desaniciar l'asociación de cualquier direición de corréu electrónicu cola cuenta, dexa en blanco la direición de corréu electrónicu nueva cuando unvies el formulariu.",
        "changeemail-no-info": "Tien d'aniciar sesión pa entrar direutamente a esta páxina.",
        "changeemail-oldemail": "Direición de corréu electrónicu actual:",
        "changeemail-newemail": "Direición de corréu electrónicu nueva:",
+       "changeemail-newemail-help": "Tendríes de dexar en blanco esti campu si quies desaniciar la direición de corréu. Nun podrás reaniciar una contraseña escaecida y nun recibirás correos d'esta wiki si se quita la direición de corréu.",
        "changeemail-none": "(nengún)",
        "changeemail-password": "La to contraseña en {{SITENAME}}:",
        "changeemail-submit": "Camudar el corréu electrónicu",
        "changeemail-throttled": "Ficisti demasiaos intentos d'aniciu de sesión.\nPor favor espera $1 enantes d'intentalo otra vuelta.",
+       "changeemail-nochange": "Escribe una dirección de corréu electrónicu nueva distinta.",
        "resettokens": "Reaniciar los pases",
        "resettokens-text": "Equí pue reaniciar los pases que permiten l'accesu a ciertos datos privaos asociaos cola so cuenta.\n\nTendría de facelo si los compartió con alguién de mou accidental o si la so cuenta quedó comprometida.",
        "resettokens-no-tokens": "Nun hai dengún pase que reaniciar.",
        "permissionserrorstext-withaction": "Nun tien permisu pa $2 {{PLURAL:$1|pol siguiente motivu|polos siguientes motivos}}:",
        "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.",
        "log-fulllog": "Ver el rexistru ensembre",
        "edit-hook-aborted": "Edición albortada pol hook.\nNun dio esplicación.",
        "edit-gone-missing": "Nun se pudo actualizar la páxina.\nPaez que se desanició.",
        "mergehistory-go": "Amosar ediciones fusionables",
        "mergehistory-submit": "Fusionar revisiones",
        "mergehistory-empty": "Nun se pue fusionar nenguna revisión.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisión|revisiones}} de [[:$1]] fusionaes correutamente en [[:$2]].",
+       "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-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.",
        "prefs-watchlist-token": "Pase de la llista de siguimientu:",
        "prefs-misc": "Varios",
        "prefs-resetpass": "Camudar la conseña",
-       "prefs-changeemail": "Camudar el corréu electrónicu",
+       "prefs-changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
        "prefs-setemail": "Conseñar una direición de corréu electrónicu",
        "prefs-email": "Opciones de corréu",
        "prefs-rendering": "Aspeutu",
        "group-bot": "Bots",
        "group-sysop": "Alministradores",
        "group-bureaucrat": "Burócrates",
-       "group-suppress": "Güeyadores",
+       "group-suppress": "Supresores",
        "group-all": "(toos)",
        "group-user-member": "{{GENDER:$1|usuariu|usuaria}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usuariu auto-confirmáu|usuaria auto-confirmada}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|alministrador|alministradora}}",
        "group-bureaucrat-member": "{{GENDER:$1|burócrata}}",
-       "group-suppress-member": "{{GENDER:$1|supervisor|supervisora}}",
+       "group-suppress-member": "{{GENDER:$1|supresor|supresora}}",
        "grouppage-user": "{{ns:project}}:Usuarios",
        "grouppage-autoconfirmed": "{{ns:project}}:Usuarios autoconfirmaos",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Alministradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burócrates",
-       "grouppage-suppress": "{{ns:project}}:Güeyadores",
+       "grouppage-suppress": "{{ns:project}}:Supresores",
        "right-read": "Lleer páxines",
        "right-edit": "Editar páxines",
        "right-createpage": "Crear páxines (que nun seyan páxines d'alderique)",
        "recentchangeslinked-summary": "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada).\nLes páxines de [[Special:Watchlist|la to llista de siguimientu]] tán en <strong>negrina</strong>.",
        "recentchangeslinked-page": "Nome de la páxina:",
        "recentchangeslinked-to": "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada",
+       "recentchanges-page-added-to-category": "[[:$1]] amestóse a la categoría",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] y {{PLURAL:$2|otra páxina|otres $2 páxines}} amestaes a la categoría",
+       "recentchanges-page-removed-from-category": "[[:$1]] desanicióse de la categoría",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] y {{PLURAL:$2|otra páxina|otres $2 páxines}} desaniciaes de la categoría",
+       "autochange-username": "Cambiu automáticu de MediaWiki",
        "upload": "Xubir ficheru",
        "uploadbtn": "Xubir ficheru",
        "reuploaddesc": "Cancelar la xubida y tornar al formulariu de xubíes",
        "upload-options": "Opciones de xubía",
        "watchthisupload": "Vixilar esti ficheru",
        "filewasdeleted": "Yá se xubió y se desanició depués un ficheru con esti nome.\nHabríes comprobar el $1 enantes de volver a xubilu.",
+       "filename-thumb-name": "Esto paez un títulu de miniatura. Por favor, nun xubas miniatures a la mesma wiki de la que salieron. D'otra manera, igua'l nome del ficheru pa que tenga más significáu, y que nun tenga'l prefixu de miniatura.",
        "filename-bad-prefix": "El nome del ficheru que tas xubiendo entama con '''\"$1\"''', que ye un nome non descriptivu que de vezu conseñen automáticamente les cámares dixitales.\nPor favor escueyi un nome más descriptivu pal to ficheru.",
        "filename-prefix-blacklist": " #<!-- dexa esta llinia exactamente como ta --> <pre>\n# La sintaxis ye la siguiente:\n#   * Lo que va del caráuter \"#\" al fin de llinia ye un comentariu\n#   * Toa llinia non-balera ye un prefixu pa los nomes de ficheru típicos que ponen les cámares dixitales\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # dellos teléfonos móviles\nIMG # xenéricu\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- dexa esta llinia exactamente como ta -->",
        "upload-success-subj": "Xubida correuta",
        "upload-http-error": "Hebo un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "La xubida de copies nun ta disponible dende esti dominiu.",
        "upload-dialog-title": "Xubir ficheru",
-       "upload-dialog-error": "Hebo un error",
-       "upload-dialog-warning": "Hebo un avisu",
        "upload-dialog-button-cancel": "Encaboxar",
        "upload-dialog-button-done": "Fecho",
        "upload-dialog-button-save": "Guardar",
        "upload-dialog-button-upload": "Xubir",
-       "upload-dialog-label-select-file": "Seleiciona un ficheru",
-       "upload-dialog-label-infoform-title": "Detalles",
-       "upload-dialog-label-infoform-name": "Nome",
-       "upload-dialog-label-infoform-description": "Descripción",
-       "upload-dialog-label-usage-title": "Usu",
-       "upload-dialog-label-usage-filename": "Nome del ficheru",
+       "upload-process-error": "Hebo un error",
+       "upload-process-warning": "Hebo un avisu",
+       "upload-form-label-select-file": "Seleiciona un ficheru",
+       "upload-form-label-infoform-title": "Detalles",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descripción",
+       "upload-form-label-usage-title": "Usu",
+       "upload-form-label-usage-filename": "Nome del ficheru",
+       "foreign-structured-upload-form-label-own-work": "Esti ye'l mio propiu trabayu",
+       "foreign-structured-upload-form-label-infoform-categories": "Categoríes",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-default": "Entiendo que toi xubiendo esti ficheru a un depósitu compartíu. Confirmo que toi faciéndolo cumpliendo les condiciones de serviciu y les polítiques de llicencies d'esi sitiu.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Si nun puedes xubir esti ficheru baxo les polítiques del depósitu compartíu, zarra esti diálogu y prueba otru métodu.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Tamién pué interesate usar [[Special:Upload|la páxina de carga de {{SITENAME}}]] si esti ficheru pué xubise allí baxo les sos polítiques.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Certifico que tengo los drechos d'autor d'esti ficheru, y aceuto irrevocablemente lliberalu a Wikimedia Commons baxo la llicencia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], y aceuto les [https://wikimediafoundation.org/wiki/Terms_of_Use Condiciones d'usu].",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Si nun tienes los drechos d'autor d'esti ficheru, o quieres lliberalu baxo una llicencia diferente, considera usar el [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de carga en Commons Upload].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Tamién pué interesate usar [[Special:Upload|la páxina de carga de {{SITENAME}}]] si esti ficheru pué xubise allí baxo les sos polítiques.",
        "backend-fail-stream": "Nun se pudo tresmitir el ficheru $1.",
        "backend-fail-backup": "Nun se pudo facer copia de seguridá del ficheru $1.",
        "backend-fail-notexists": "El ficheru $1 nun esiste.",
        "filerevert-legend": "Revertir archivu",
        "filerevert-intro": "Tas revirtiendo '''[[Media:$1|$1]]''' a la [$4 versión del $3 a les $2].",
        "filerevert-comment": "Motivu:",
-       "filerevert-defaultcomment": "Revertida a la versión del $2 a les $1",
+       "filerevert-defaultcomment": "Revertida a la versión del $1 a les $2 ($3)",
        "filerevert-submit": "Revertir",
        "filerevert-success": "'''[[Media:$1|$1]]''' foi revertida a la [$4 versión del $3 a les $2].",
        "filerevert-badversion": "Nun hai nenguna versión llocal previa d'esti archivu cola fecha conseñada.",
        "nopagetext": "La páxina oxetivu qu'especificasti nun esiste.",
        "pager-newer-n": "{{PLURAL:$1|1 siguiente|$1 siguientes}}",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
-       "suppress": "Güeyador",
+       "suppress": "Supresor",
        "querypage-disabled": "Esta páxina especial ta desactivada por razones de rindimientu.",
        "apihelp": "Ayuda de la API",
        "apihelp-no-such-module": "Nun s'alcuentra'l módulu «$1».",
        "emailccsubject": "Copia del to mensaxe a $1: $2",
        "emailsent": "Corréu unviáu",
        "emailsenttext": "Unviose'l to mensaxe de corréu.",
-       "emailuserfooter": "Esti corréu electrónicu unviólu $1 a $2 per aciu de la función «{{int:emailuser}}» de {{SITENAME}}.",
+       "emailuserfooter": "Esti corréu electrónicu {{GENDER:$1|unviólu}} $1 a {{GENDER:$2|$2}} per aciu de la función «{{int:emailuser}}» de {{SITENAME}}.",
        "usermessage-summary": "Dexar un mensaxe del sistema.",
        "usermessage-editor": "Mensaxería del sistema",
        "watchlist": "Llista de siguimientu",
        "deletepage": "Esborrar páxina",
        "confirm": "Confirmar",
        "excontent": "el conteníu yera: '$1'",
-       "excontentauthor": "el conteníu yera: '$1' (y l'únicu autor yera '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "el conteníu yera: «$1», y l'únicu autor yera «[[Special:Contributions/$2|$2]]» ([[User talk:$2|alderique]])",
        "exbeforeblank": "el conteníu enantes de dexar en blanco yera: '$1'",
        "delete-confirm": "Desaniciar «$1»",
        "delete-legend": "Desaniciar",
        "move-page-legend": "Treslladar páxina",
        "movepagetext": "Usando'l siguiente formulariu vas renomar una páxina, treslladando'l so historial al nuevu nome.\nEl nome vieyu va convertise nuna páxina de redireición al títulu nuevu.\nPues actualizar les redireiciones qu'enllacien al títulu orixinal automáticamente.\nSi prefieres nun lo facer, asegúrate de que nun dexes [[Special:DoubleRedirects|redireiciones dobles]] o [[Special:BrokenRedirects|rotes]].\nTu yes el responsable de facer que los enllaces queden apuntando au se supón que tienen d'apuntar.\n\nRecuerda que la páxina '''nun''' va movese si yá hai una páxina col nuevu títulu, a nun ser que la mesma seya una redireición y nun tenga historial.\nEsto significa que pues volver a renomar una páxina col nome orixinal si t'enquivoques, y nun pues sobreescribir una páxina yá esistente.\n\n¡Avisu!'''\nEsti pue ser un cambéu importante ya inesperáu pa una páxina popular;\npor favor, asegúrate d'entender les consecuencies de lo que vas facer enantes de siguir.",
        "movepagetext-noredirectfixer": "Usando'l siguiente formulariu vas renomar una páxina, treslladando'l so historial al nuevu nome.\nEl nome vieyu va convertise nuna redireición al nuevu.\nAsegúrate de que nun dexes [[Special:DoubleRedirects|redireiciones dobles]] o [[Special:BrokenRedirects|rotes]].\nTu yes el responsable de facer que los enllaces queden apuntando au se supón qu'han apuntar.\n\nRecuerda que la páxina '''nun''' va movese si yá hai una páxina col nuevu títulu, a nun ser que tea balera o seya una redireición que nun tenga historial.\nEsto significa que pues volver a renomar una páxina col nome orixinal si t'enquivoques, y que nun pues sobreescribir una páxina yá esistente.\n\n¡AVISU!'''\nEsti pue ser un cambéu importante y inesperáu pa una páxina popular;\npor favor, asegúrate d'entender les consecuencies de lo que vas facer enantes de siguir.",
-       "movepagetalktext": "La páxina d'alderique asociada va ser treslladada automáticamente '''a nun ser que:'''\n*Yá esista una páxina d'alderique non vacia col nuevu nome, o\n*Desactives la caxella d'equí baxo.\n\nNestos casos vas tener que treslladar o fusionar la páxina manualmente.",
-       "movearticle": "Treslladar la páxina:",
+       "movepagetalktext": "Si marques esti cuadru, la páxina d'alderique asociada va treslladase automáticamente al títulu nuevu, a nun ser que yá esista una páxina d'alderique non vacia allí.\n\nNesti casu tendrás que treslladar o fusionar la páxina manualmente si lo desees.",
        "moveuserpage-warning": "'''Atención:''' Tas a piques de mover una páxina d'usuariu. Atalanta que namái se va mover la páxina y que ''nun'' se va renomar l'usuariu.",
        "movecategorypage-warning": "<strong>Avisu:</strong> Tas a piques de treslladar una páxina de categoría. Ten en cuenta que sólo se treslladará la páxina y que cualquier páxina que tuviera na categoría antigua <em>nun</em> se recategorizará na nueva.",
        "movenologintext": "Tienes que ser un usuariu rexistráu y tar [[Special:UserLogin|identificáu]] pa treslladar una páxina.",
        "cant-move-to-user-page": "Nun tienes permisu pa treslladar una páxina a una páxina d'usuariu (sacante a una subpáxina d'usuariu).",
        "cant-move-category-page": "Nun tienes permisu pa treslladar páxines de categoría.",
        "cant-move-to-category-page": "Nun tienes permisu pa treslladar una páxina a una páxina de categoría.",
-       "newtitle": "Al títulu nuevu:",
+       "newtitle": "Títulu nuevu:",
        "move-watch": "Vixilar esta páxina",
        "movepagebtn": "Treslladar la páxina",
        "pagemovedsub": "Treslláu correctu",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3 y la contraseña unvióse per corréu electrónicu",
        "logentry-newusers-autocreate": "La cuenta $1 {{GENDER:$2|creóse}} automáticamente",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|treslladó}} les preferencies de protección de $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|quitó}} la protección de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protexó}} a $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protexó}} a $3 $4 [en cascada]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|camudó}} el nivel de protección de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|camudó}} el nivel de protección de $3 $4 [en cascada]",
        "logentry-rights-rights": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3 dende $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5",
        "api-error-badaccess-groups": "Nun tienes permisu pa xubir ficheros a esta wiki.",
        "api-error-badtoken": "Fallu internu: token incorreutu.",
        "api-error-copyuploaddisabled": "Xubir d'una URL ta desactivao nesti sirvidor.",
-       "api-error-duplicate": "Yá hai {{PLURAL:$1|[$2 otru ficheru]|[$2 otros ficheros]}} nesti sitiu col mesmu conteníu.",
-       "api-error-duplicate-archive": "Había {{PLURAL:$1|[$2 otru ficheru]|[$2 otros ficheros]}} nesti sitiu col mesmu conteníu, pero se {{PLURAL:$1|desanició|desaniciaron}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Ficheru duplicáu|Ficheros duplicaos}} que yá se {{PLURAL:$1|desanició|desaniciaron}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ficheru duplicáu|Ficheros duplicaos}}",
+       "api-error-duplicate": "Yá hai {{PLURAL:$1|otru ficheru|otros ficheros}} nesti sitiu col mesmu conteníu.",
+       "api-error-duplicate-archive": "Había {{PLURAL:$1|otru ficheru|otros ficheros}} nesti sitiu col mesmu conteníu, pero se {{PLURAL:$1|desanició|desaniciaron}}.",
        "api-error-empty-file": "El ficheru qu'unviasti taba baleru.",
        "api-error-emptypage": "Nun se permite la creación de páxines nueves baleres.",
        "api-error-fetchfileerror": "Fallu internu: daqué nun funcionó al buscar el ficheru.",
index 14b9db7..efbed09 100644 (file)
@@ -7,7 +7,8 @@
                        "Urhixidur",
                        "Wikimistusik",
                        "Zetud",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Levconhani gluyasiki se",
        "mergehistory-go": "Nedira va rojoan betakseem",
        "mergehistory-submit": "Joara va betakseem",
        "mergehistory-empty": "Mek rojoan betaks.",
-       "mergehistory-success": "$3 {{PLURAL:$3|betara|betara}} va [[:$1]] joanyayan ko [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|betara|betara}} va $1 joanyayan ko [[:$2]].",
        "mergehistory-fail": "Skura va jera va izvot tir merotisa, va bu is evladoreem vay tolstujel !",
        "mergehistory-no-source": "$1 klitabu me tir.",
        "mergehistory-no-destination": "$1 jalabu me tir.",
        "filerevert": "Dimplekura va $1",
        "filerevert-legend": "Dimplekura va iyeltak",
        "filerevert-comment": "Sebuks :",
-       "filerevert-defaultcomment": "Sulan kal siatos ke $2, $1",
+       "filerevert-defaultcomment": "Sulan kal siatos ke $2, $1 ($3)",
        "filerevert-submit": "Dimplekura",
        "filerevert-success": "'''[[Media:$1|$1]]''' dim [$4 siatos ke $3, $2] su zo dimplekur.",
        "filedelete": "Sulara va $1",
        "move-page-legend": "Va teliz tolyoltá",
        "movepagetext": "Utilisez le formulaire ci-dessous pour renommer un article (et sa page de discussion, le cas échéant), en déplaçant toutes ses versions antérieures vers le nouveau nom.\n\nVous pouvez mettre à jour les redirections qui pointent sur l’ancien titre automatiquement. Si vous ne le faites pas, assurez-vous qu’il n’y ait pas de redirections [[Special:DoubleRedirects|doubles]] ou [[Special:BrokenRedirects|rompues]]. Vous êtes responsable de vous assurer que les liens continuent de pointer aux bons endroits.\n\nNotez que la page ne sera '''pas''' déplacée s’il y a déjà une page au nouveau titre, à moins que cette dernière ne soit vide ou une redirection, et qu’elle soit sans historique. Ceci vous permet de revenir en arrière en cas d’erreur, et vous empêche d’écraser les pages existantes.\n\n'''ATTENTION !'''\nIl peut s’agir d’un changement radical et inattendu pour un article souvent consulté ; assurez-vous que vous en comprenez bien les conséquences avant de procéder.",
        "movepagetalktext": "La page de discussion associée, si présente, sera automatiquement renommée avec '''sauf si:'''\n*Vous renommez une page vers un autre espace,\n*Une page de discussion existe déjà avec le nouveau nom, ou\n*Vous avez désélectionné le bouton ci-dessous.\n\nDans ce cas, vous devrez renommer ou fusionner la page manuellement si vous le désirez.",
-       "movearticle": "Tolyoltara va teliz",
        "movenologintext": "Ede rin va teliz co-djutolyoltal, wetce koverteyen favesik gotil [[Special:UserLogin|dogluyarakiraf]].",
        "movenotallowed": "Rin va bu me ronovarrundal.",
        "cant-move-user-page": "Rin va favesikbu (rade volveybu) me ronovarrundal.",
index e331139..633281d 100644 (file)
@@ -2,7 +2,9 @@
        "@metadata": {
                "authors": [
                        "1AnuraagPandey",
-                       "राम प्रसाद जोशी"
+                       "राम प्रसाद जोशी",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "कड़ि अधोरेखन:",
        "mergehistory-go": "मिलावे लायक संपादन देखावा जाय",
        "mergehistory-submit": "अवतरण मिलावा जाय",
        "mergehistory-empty": "कवनो भी अवतरण नाई मिलाई सका जात अहै।",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|कय}} $3 अवतरण [[:$2]] में एकट्ठा कई {{PLURAL:$3|गय}}।",
+       "mergehistory-done": "$1 {{PLURAL:$3|कय}} $3 अवतरण [[:$2]] में एकट्ठा कई {{PLURAL:$3|गय}}।",
        "mergehistory-fail": "इतिहास एकट्ठा नाई कई सका जात है, कृपया पन्ना औ समय कय फिरसे जाँच करा जाय।",
        "mergehistory-fail-toobig": "इतिहास विलय करना संभव नहीं है क्योंकि अवतरण सीमा $1 से अधिक {{PLURAL:$1|अवतरण|अवतरणों}} को स्थानांतरित करना होगा।",
        "mergehistory-no-source": "स्रोत पन्ना $1 मौजूद नाई है।",
        "movepagetext": "निचे दिहा फारम पन्ना कय नाँव बदल दी अव ओकर इतिहास नँवा नाँव से देखाए लागि ।\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आगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।\n\n'''सूचना!'''\nस्थानांतरण करनेसे कोई भी महत्वपूर्ण लेख में अनपेक्षित बदलाव हो सकते है ।\nआपसे अनुरोध है कि आप इसके परिणाम जान लें ।",
        "movepagetalktext": "संबंधित वार्ता पृष्ठ इसके साथ स्थानांतरीत नहीं होगा '''अगर:'''\n* आप पृष्ठ दुसरे नामस्थान में स्थानांतरीत कर रहें है\n* इस नाम का वार्ता पृष्ठ पहलेसे बना हुवा है, या\n* नीचे दिया हुआ चेक बॉक्स आपने निकाल दिया है ।\n\nइन मामलोंमे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।",
-       "movearticle": "पन्ना घुसकावा जाय:",
        "moveuserpage-warning": "<strong>चेतावनी:</strong> आप एकठु सदस्य पन्ना कय नाँव बदलय जावा जात है।तनि ध्यान दिहा जाय कि खालि पन्ना कय नाँव बदल जाइ औ सदस्यनाँव <em>नाई</em> बदलि।",
        "movenologintext": "लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।",
        "movenotallowed": "आप कय इ पन्ना घुस्कावे कय अनुमति नाई है ।",
        "api-error-badaccess-groups": "इ विकि मा आप कय फाइल अपलोड करेक अनुमति नाइ है",
        "api-error-badtoken": "आंतरिक त्रुटि: खराब टोकन।",
        "api-error-copyuploaddisabled": "URL द्वारा इस सर्वर पर अपलोड अक्षम है।",
-       "api-error-duplicate": "वहाँ {{PLURAL:$1| [ $2 अन्य फ़ाइल] | रहे हैं [ $2 कुछ अन्य फ़ाइलों]}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
-       "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था [$2 कुछ अन्य फ़ाइल] |were [$2 कुछ अन्य फ़ाइलें]}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
-       "api-error-duplicate-archive-popup-title": "डुप्लिकेट {{PLURAL:$1| फ़ाइल | फ़ाइलें}} है कि पहले से ही हटा दिया गया है",
-       "api-error-duplicate-popup-title": "डुप्लिकेट {{PLURAL:$1| फ़ाइल | फ़ाइल}}",
+       "api-error-duplicate": "वहाँ {{PLURAL:$1| अन्य फ़ाइल | रहे हैं कुछ अन्य फ़ाइलों}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
+       "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था कुछ अन्य फ़ाइल|कुछ अन्य फ़ाइलें}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
        "api-error-empty-file": "आप कय दीहल फ़ाइल खाली रहा।",
        "api-error-emptypage": "नँवा अव खाली पन्ना बनावै कय अनुमति नाइ है",
        "api-error-fetchfileerror": "आंतरिक त्रुटि: जब फ़ाइल लाया जा रहा तो कुछ गलत हो गया था।",
index 1a0ea3b..541e7b2 100644 (file)
        "mergehistory-go": "Birləşdirilə bilən redaktələri göstər",
        "mergehistory-submit": "Qarışıq düzəlişlər",
        "mergehistory-empty": "Birləşdiriləcək redaktələr tapılmamışdır.",
-       "mergehistory-success": "[[:$1]] səhifəsinin $3 {{PLURAL:$3|revizyonu|dəyişikliyi}} uğurla [[:$2]] -yə birləşdirildi.",
+       "mergehistory-done": "$1 səhifəsinin $3 {{PLURAL:$3|revizyonu|dəyişikliyi}} uğurla [[:$2]] -yə birləşdirildi.",
        "mergehistory-no-source": "Mənbə $1 yoxdur.",
        "mergehistory-no-destination": "Mənbə səhifəsi $1 mövcud deyil.",
        "mergehistory-invalid-source": "Mənbənin düzgün başlığı olmalıdır.",
        "move-page-legend": "Səhifənin adını dəyiş",
        "movepagetext": "Aşağıdakı formadan istifədə etməklə səhifənin adını və bütün tarixçəsini yeni başlığa dəyişəcəksiniz.\nƏvvəlki başlıq yeni başlığa yönləndirmə səhifəsinə çevriləcək.\nKöhnə səhifəyə keçidləri avtomatik olaraq dəyişə bilərsiniz.\nBunu etməsəniz, zəhmət olmasa, [[Special:DoubleRedirects|təkrarlanan]] və ya [[Special:BrokenRedirects|qırılmış istiqamətləndirmələri]] yoxlamağı unutmayın.\nKeçidlərin lazımi yerə istiqamətləndirilməsini təmin etmək sizin məsuliyyətinizdədir.\n\nNəzərə alın ki, hədəflədiyiniz adda bir səhifə artıq mövcuddursa, addəyişmə <strong>baş tutmayacaq</strong>. Lakin həmin səhifənin boş olması, istiqamətləndirmə səhifəsi olması və redaktə tarixçəsinin olmaması halları istisnadır. Bu o deməkdir ki, səhvən adını dəyişdiyiniz səhifələri geri qaytara bilər, amma artıq mövcud olan səhifənin üzərinə başqa səhifə yaza bilməzsiniz.\n\n<strong>XƏBƏRDARLIQ!</strong>\nPopulyar səhifələrin adlarının dəyişdirilməsi əsaslı və gözlənilməz nəticələrə səbəb ola bilər. Ona görə də bu dəyişikliyi yerinə yetirməzdən əvvəl, bunun mümkün nəticələrini başa düşdüyünüzdən əmin olun.",
        "movepagetalktext": "Uyğun müzakirə səhifəsi avtomatik hərəkət edəcək '''əgər:'''\n* boş olmayan müzakirə səhifəsi yeni adla artıq mövcuddursa, və ya\n* Siz bayrağı aşağıdan götürsəniz.\n\nHəmin hallarda , ehtiyac yaranarsa siz səhifələri əllə birləşdirmək məcburiyyətində qalacaqsınız",
-       "movearticle": "Səhifənin adını dəyişdir",
        "movenotallowed": "Siz səhifələrin adını dəyişə bilməzsiniz.",
        "movenotallowedfile": "Siz faylların adını dəyişə bilməzsiniz.",
        "cant-move-user-page": "İstifadəçi səhifələrinin adını dəyişə bilməzsiniz (başlıqlardan başqa).",
index 8e0eea5..0c1c30f 100644 (file)
@@ -17,7 +17,8 @@
                        "Macofe",
                        "Sadiqr",
                        "Mjbmr",
-                       "Alp Er Tunqa"
+                       "Alp Er Tunqa",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "باغلانتی‌لارین آلتینی خطله:",
        "viewtalkpage": "دانیشیغا باخ",
        "otherlanguages": "آیری دیل‌لرده",
        "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
-       "redirectpagesub": "یوْل‌لاندیرما صحیفه‌سی",
+       "redirectpagesub": "یوْللاندیرما صفحه‌سی",
        "redirectto": "مسیزپرین دَییشیب:",
        "lastmodifiedat": "بۇ صفحه‌‌ سوْن دفعه $1، $2 تاریخینده دَییشیلمیشدیر.",
        "viewcount": "بۇ صحیفه {{PLURAL:$1|بیر|$1}} دفعه گؤرولوبدور.",
        "sort-ascending": "چوْخالان سیرالاماق",
        "nstab-main": "صفحه",
        "nstab-user": "ایشلدن صفحه‌سی",
-       "nstab-media": "Ù\85ئدÛ\8cا ØµØ­Û\8cÙ\81ه‌سی",
+       "nstab-media": "Ù\85دÛ\8cاصÙ\81Ø­ه‌سی",
        "nstab-special": "اؤزل صفحه",
-       "nstab-project": "پروژه صحیفه‌سی",
+       "nstab-project": "پروژه صفحه‌سی",
        "nstab-image": "فایل",
        "nstab-mediawiki": "مئساژ",
        "nstab-template": "شابلون",
        "nstab-help": "یاردیم صفحه‌سی",
        "nstab-category": "بؤلمه",
+       "mainpage-nstab": "آنا صفحه",
        "nosuchaction": "بئله چالیشما یوْخدور",
        "nosuchactiontext": "URL طرفیندن بیلینن ایش گئچرسیزدیر.\nURL-ی یانلیش یازمیش، یا یانلیش بیر باغلانتی ایله گلمیش، اوْلابیلرسیز.\nهم‌ده بۇ، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.",
        "nosuchspecialpage": "بئله اؤزل صحیفه یوْخدور",
        "mergehistory-go": "بیرلشدیریله بیلن دَییشیکلیکلری گؤستر",
        "mergehistory-submit": "نوسخه‌لری بیرلشدیرمک",
        "mergehistory-empty": "نوسخه‌لرین هئچ بیری بیرلشدیریلنمزلر.",
-       "mergehistory-success": "[[:$1]]-ین {{PLURAL:$3|بیر|$3}} نوسخه‌سی باشاری‌لا [[:$2]]-له بیرلشدیریلدی.",
+       "mergehistory-done": "$1-ین {{PLURAL:$3|بیر|$3}} نوسخه‌سی باشاری‌لا [[:$2]]-له بیرلشدیریلدی.",
        "mergehistory-fail": "گئچمیش بیرلشدیریلنمه‌دی، لوطفاً صحیفه و زامان پارامئترلرینی یئنی‌دن یوخلایین.",
        "mergehistory-fail-toobig": "گئچمیش بیرلشمک ایشینی گورمک اولمور نئجه کی $1 محدودیتی چوخلوغوندان{{PLURAL:$1|نوسخه}} انتقال تاپاجاق.",
        "mergehistory-no-source": "$1 قایناق صحیفه‌سی یوخدور.",
        "action-read": "بو صحیفه‌نی اوخو",
        "action-edit": "بو صحیفه‌نی دَییشدیر",
        "action-createpage": "صفحه یارات",
-       "action-createtalk": "دانیشیق صحیفه‌سی یاراد",
+       "action-createtalk": "دانیشیق صفحه‌سی یارات",
        "action-createaccount": "بو ایستیفاده‌چی حسابینی یاراد",
        "action-history": "بو صفحه نین گئچمیشین گور",
        "action-minoredit": "بو دَییشیکلیگی، کیچیک اولاراق نیشانلا",
        "rc-enhanced-expand": "تفصیل‌لری گؤستر",
        "rc-enhanced-hide": "تفصیل‌لری گیزلت",
        "rc-old-title": "ایلک‌جه «$1» آدی‌له یارانمیشدیر",
-       "recentchangeslinked": "مربوط دَییشیکلیکلر",
-       "recentchangeslinked-feed": "مربوط دَییشیکلیکلر",
-       "recentchangeslinked-toolbox": "مربوط دَییشیکلیکلر",
+       "recentchangeslinked": "ایلگیلی دَییشیکلیکلر",
+       "recentchangeslinked-feed": "ایلگیلی دَییشیکلیکلر",
+       "recentchangeslinked-toolbox": "ایلگیلی دَییشیکلیکلر",
        "recentchangeslinked-title": "''$1'' ایله ایلگی‌لی دییشیکلر",
        "recentchangeslinked-summary": "آشاغیداکی سیياهی، قئيد اوْلونان صحیفه‌‌يه (و يا قئيد اوْلونان کاتئقوْرياداکی صحیفه‌‌لره) داخیلی کئچید وئرن صحیفه‌‌لرده ائدیلمیش سوْن ديَیشیکلیکلرین سیياهیسیدیر. \n[[Special:Watchlist|ایزله‌مه سیياهینیزداکی]] صحیفه‌‌لر '''قالین''' شریفتله گؤستریلمیشدیر.",
        "recentchangeslinked-page": "صفحه آدی:",
        "upload-too-many-redirects": "آدرس ده چوخ یؤنلندیرمه وار",
        "upload-http-error": "اچ تی تی پی ختاسی وار : $1",
        "upload-copy-upload-invalid-domain": "فایل یوکلنمه سی بو بازه ده امکانی یوخدور",
+       "upload-dialog-button-cancel": "وازگئچ",
+       "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": "فایل آدی",
        "backend-fail-stream": "$1 فای‌لی یولانمامادی.",
        "backend-fail-backup": "بو فایل $1 اوچون نوسخه پشتیان یارتماق اولماز",
        "backend-fail-notexists": "\"$1\" فای‌لی مؤوجود دئییل",
        "movepagetext": "آشاغی‌داکی فورمدان ایستیفاده ائتمک، صحیفه‌نین آدینی، بوتون تاریخچه‌سینی ده کؤچورمک‌له، یئنی باشلیغا دییشه‌جک.\nاسکی باشلیق یئنی باشلیغا یول‌لاندیریلاجاق‌دیر.\nاسکی صحیفه‌یه اولان یول‌لاندیرماقلاری، اوتوماتیک گونجل‌له‌یه بیلرسینیز.\nبو سئچیمی ائتمه‌دیگینیز حالدا، [[Special:DoubleRedirects|تکرارلانان]] و یا [[Special:BrokenRedirects|قیریق یول‌لاندیرمالاری]] یوخلاماغی یاددان چیخارمایین.\nباغلانتیلاری اویغون یئره یول‌لاندیرماسیندان آرخایین اولماق، سیزین مسئولیتینیزده‌دیر.\n\nنظره آلین کی، هدف باشلیق آلتیندا بیر صحیفه مؤوجود اولسا، یئردییشمه '''باش توتمایاجاق'''، مگر بوکی او سونراکی صحیفه یول‌لاندیرما اولا و اؤنجه دَییشمه گئچمیشی ده اولمایا. بو او دئمک‌دیر کی، سهواً آدینی دییشدیگینیز صحیفه‌لری گئری قایتارا بیلمک اولار، بونونلا یاناشی آرتیق مؤوجود اولان صحیفه‌نین اوزرینه باشقا صحیفه یازا بیلمزسینیز.\n\n'''خبردارلیق!'''\nبو یئردییشمه مشهور صحیفه اوچون اساس‌لی و گؤزلنیلمز اولا بیلر؛ اونا گؤره ده بو دییشیک‌لیگی یئرینه یئتیرمزدن اول، بونون مومکون نتیجه‌لرینی باشا دوشدوگونوزدن آرخایین اولون.",
        "movepagetext-noredirectfixer": "آشاغی‌داکی فورمو دول‌دورماق بیر صحیفنی یئنی‌دن آدلاندیریر، بوتون کئچمیشینی یئنی آدا داشیییر.\nکؤهنه مؤوزو یئنی باشلیغا بیر ایستیقامتلندیرمه صحیفه‌سی اولار.\n[[Special:DoubleRedirects|جوت]] یا دا [[Special:BrokenRedirects|نوزوک ایستیقامتلندیرمه‌لر]] صحیفه‌لرینی ایداره ائدین.\nعلاقه‌لرین گئتمه‌لری لازیم اولان یئرلره گئتدیک‌لرینی عمین اولماق سیزین سوروملولوغونوزدا‌دیر.\n\nیئنی باش‌لیقدا مؤوجود بیر صحیفه وارسا، بوش یا دا بیر ایستیقامتلندیرمه اولمادیقجا و دییشیک‌لیک کئچمیشی اولمادیغی تق‌دیرده، سهیف 'تاشینمایاجاکتیر.\nبو بو معنانی وئرر، بیر صحیفنی اشتباه ائتسه‌نیز صحیفنی کؤهنه آدییلا یئنی‌دن آدلان‌دیرا بیلریک، بو مؤوجود صحیفه‌نین اوزرینه یازماز.\n\n' 'خبردارلیق!'\nبو مشهور بیر صحیفه اوچون تأثیرلی و گؤزلنیلمز بیر دییشیک‌لیک اولا بیلر؛\nخاهیش ائدیریک راتیفیکاسیا ائتمه‌دن اول بونون نتیجه‌لرینی آنلادیغینیزدان امین اولون.",
        "movepagetalktext": "اویغون دانیشیق صحیفه‌سی آوتوماتیک حرکت ائده‌جک 'گر:'\n* بوش اولمایان دانیشیق صحیفه‌سی یئنی آدلا آرتیق مؤوجوددورسا، و یا\n* سیز بایراغی آشاغی‌دان گؤتورسه‌نیز.\n\nهمین حال‌لاردا ، احتیاج یارانارسا سیز صحیفه‌لری الله بیرلش‌دیرمک مجبوریتینده قالاجاقسینیز",
-       "movearticle": "صحیفه‌نین آدینی دییش‌دیر",
        "moveuserpage-warning": "' 'خبردارلیق:' بیر ایستیفاده‌چی صحیفه‌سینی داشیماق اوزرسینیز. خاهیش ائدیریک یالنیز صحیفه‌نین تاشیناجاغینا، آنجاق ایستیفاده‌چی‌نین یئنی‌دن آدلاندیریلمایاجاغینا دقت ائدین.",
        "movenologintext": "صحیفه‌نین آدینی دییشیک‌لیک اوچون قئیدیات‌لی و [[Special:UserLogin|سیستئمه]] داخیل اولمانیز لازیم‌دیر.",
        "movenotallowed": "سیز صحیفه‌لرین آدینی دییشه بیلمزسینیز.",
        "tooltip-ca-nstab-main": "مقاله‌یه باخین",
        "tooltip-ca-nstab-user": "ایشلدن صفحه‌سینه باخ",
        "tooltip-ca-nstab-media": "مئدیا-فايل",
-       "tooltip-ca-nstab-special": "بÙ\88 Ø¨Û\8cر Ø§Ø¤Ø²Ù\84 ØµÙ\81Ø­Ù\87â\80\8cدÛ\8cرØ\8c Ø³Û\8cز Ø§Ù\88Ù\86Ù\88 Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\87 Ø¨Û\8cÙ\84Ù\85زسÛ\8cز",
+       "tooltip-ca-nstab-special": "بÙ\88 Ø¨Û\8cر Ø§Ø¤Ø²Ù\84 ØµÙ\81Ø­Ù\87â\80\8cدÛ\8cرØ\8c Ø¨Ù\88 ØµÙ\81Ø­Ù\87 Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÙ\84Ù\85Ù\87â\80\8cÙ\85Ù\87â\80\8cÙ\84Û\8cدÛ\8cر",
        "tooltip-ca-nstab-project": "پروژه صحیفه‌سینه باخ",
        "tooltip-ca-nstab-image": "فايل صفحه‌‌سینه باخین",
        "tooltip-ca-nstab-mediawiki": "سیستم مئساژلرینه باخ",
        "pageinfo-toolboxlink": "صفحه بیلگی‌سی",
        "pageinfo-redirectsto": "ایستیقامتلن‌دیریلن",
        "pageinfo-redirectsto-info": "بیلگی",
-       "pageinfo-contentpage": "بÛ\8cر Ù\85زÙ\85Ù\88Ù\86 ØµØ­Û\8cÙ\81ه‌سی ساییلیر",
+       "pageinfo-contentpage": "بÛ\8cر Ù\85ضÙ\85Ù\88Ù\86 ØµÙ\81Ø­ه‌سی ساییلیر",
        "pageinfo-contentpage-yes": "بلی",
        "pageinfo-protect-cascading": "مدافعه‌‌لر بورادان شراره کیمی تؤکولور",
        "pageinfo-protect-cascading-yes": "بلی",
        "version-libraries": "نصب اولونموش کیتابخانا",
        "version-libraries-library": "کیتاب‌ائوی",
        "version-libraries-version": "نوسخه‌",
+       "version-libraries-description": "آچیقلاما",
        "version-libraries-authors": "یازارلار",
        "redirect": "فایل، ایستیفاده‌چی، صفحه یا نوسخه آی‌دی-سی ایله یول‌لاندیرما",
        "redirect-legend": "بیر فایل یا صحیفه‌یه یول‌لاندیرما",
        "tags-edit": "دَییشدیر",
        "tags-delete": "سیل",
        "tags-activate": "ائتکینلشدیر",
+       "tags-deactivate": "چالیشقان اولمایان",
        "tags-hitcount": "$1 {{PLURAL:$1|دییشیکلیک|دییشیک‌لیک}}",
+       "tags-create-reason": "ندن:",
        "tags-create-submit": "یارات",
+       "tags-delete-reason": "ندن:",
+       "tags-activate-reason": "ندن:",
+       "tags-deactivate-reason": "ندن:",
        "tags-edit-title": "اِتیکِتلری دَییشدیر",
        "tags-edit-manage-link": "اِتیکِتلری ایداره ائت",
        "tags-edit-revision-selected": "[[:$2]]-نین سئچیلمیش {{PLURAL:$1|نوسخه‌سی|نوسخه‌لری}}:",
        "api-error-badaccess-groups": "سیزین بو ویکی‌یه فایل یوکله‌مک ایجازه‌نیز یوخدور.",
        "api-error-badtoken": "ایچری خطاسی: پیس کود.",
        "api-error-copyuploaddisabled": "بو خیدمتچی‌ده، اینترنت آدرسی‌له فایل یوکله‌مک یاساقلانیب‌دیر.",
-       "api-error-duplicate": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|[$2 فایل]|[$2 فایل‌لار]}} واردیر.",
-       "api-error-duplicate-archive": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|[$2 فایل]|[$2 فایل‌لار]}} وار ایدی، اما {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.",
-       "api-error-duplicate-archive-popup-title": "تیکرارلانمیش {{PLURAL:$1|فایل|فایل‌لار}}، اؤنجه‌دن {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.",
-       "api-error-duplicate-popup-title": "تیکرارلانمیش {{PLURAL:$1|فایل|فایل‌لار}}.",
+       "api-error-duplicate": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|فایل|فایل‌لار}} واردیر.",
+       "api-error-duplicate-archive": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|فایل|فایل‌لار}} وار ایدی، اما {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.",
        "api-error-empty-file": "سیز یول‌لادیغینیز فایل، بوش ایدی.",
        "api-error-emptypage": "یئنی بوش صحیفه یارادماغا ایجازه یوخدور.",
        "api-error-fetchfileerror": "ایچری خطا: فایلی گتیرمک‌ده بیر ایشکال قاباغا گلدی.",
index c3e558a..e2f6019 100644 (file)
        "nstab-template": "Ҡалып",
        "nstab-help": "Ярҙам",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Баш бит",
        "nosuchaction": "Бындай ғәмәл юҡ",
        "nosuchactiontext": "URL-ла күрһәтелгән ғәмәл хаталы.\nҺеҙ URL-ны хаталы кереткәнһегеҙ йәки хаталы һылтанма буйынса күскәнһегеҙ.\nБыл шулай уҡ {{SITENAME}} проектындағы хата сәбәпле  лә булырға мөмкин.",
        "nosuchspecialpage": "Бындай махсус бит юҡ",
        "mergehistory-go": "Берләштереп булған үҙгәртеүҙәрҙе күрһәтергә",
        "mergehistory-submit": "Версияларҙы берләштер",
        "mergehistory-empty": "Һис бер версияны берләштереп булмай.",
-       "mergehistory-success": "[[:$1]] битенең $3 {{PLURAL:$3|үҙгәртеүе}} уңышлы [[:$2]] менән берләштерелде.",
+       "mergehistory-done": "$1 битенең $3 {{PLURAL:$3|үҙгәртеүе}} уңышлы [[:$2]] менән берләштерелде.",
        "mergehistory-fail": "Бит тарихтарын берләштереп булманы, зирһар, бит һәм ваҡыт параметрҙарын яңынан тикшерегеҙ.",
        "mergehistory-no-source": "Сығанаҡ бит «$1» юҡ.",
        "mergehistory-no-destination": "Маҡсат бит «$1» юҡ.",
        "movepagetext": "Аҫтағы ҡалыпты ҡулланып, биттең исемен үҙгәртә һәм уның үҙгәртеүҙәр журналын яңы урынға күсерә алаһығыҙ.\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": "Фекер алышыу битенең исеме лә үҙгәртеләсәк, '''киләһе осраҡтарҙан тыш''':\n*Бындай исемле фекер алышыу бите бар, йәки\n*Аҫтағы юлды билдәләмәгәнһегеҙ.\n\nБындай осраҡтарҙа, кәрәкле булһа, биттәрҙе үҙегеҙҙең күсереүегеҙ йәки исемен үҙгәртеүегеҙ кәрәк буласаҡ.",
-       "movearticle": "Биттең исемен үҙгәртергә",
        "moveuserpage-warning": "'''Иғтибар:''' Һеҙ ҡатнашыусы битенең исемен үҙгәртергә йыйынаһығыҙ. Зинһар, биттең генә исеме үҙгәрәсәк, ҡатнашыусы исеме ''үҙгәрмәйәсәк'', икәнен күҙ үңында тотоғоҙ.",
        "movenologintext": "Биттең исемен үҙгәртеү өсөн, һеҙ [[Special:UserLogin|танылырға]] тейешһегеҙ.",
        "movenotallowed": "Һеҙҙең бит исемен үҙгәртергә хоҡуғығыҙ юҡ",
        "api-error-badaccess-groups": "Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй",
        "api-error-badtoken": "Эске хата: дөрөҫ булмаған токен",
        "api-error-copyuploaddisabled": "Был серверҙа URL адрес буйынса йөкләү өҙөлгән",
-       "api-error-duplicate": "Бындай эстәлекле {{PLURAL:$1|[$2 файл]}}  бар.",
-       "api-error-duplicate-archive": "Сайтта бындай эстәлекле {{PLURAL:$1|[$2 башҡа файл]}} бар ине инде, ләкин {{PLURAL:$1|1=ул юйылды|улар юйылды}}",
-       "api-error-duplicate-archive-popup-title": "Элек юйылған {{PLURAL:$1|1=файлдың|файлдарҙың}} дубликаты",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|1=файлы|файлдары}} дубликаты.",
+       "api-error-duplicate": "Бындай эстәлекле {{PLURAL:$1|файл}}  бар.",
+       "api-error-duplicate-archive": "Сайтта бындай эстәлекле {{PLURAL:$1|башҡа файл}} бар ине инде, ләкин {{PLURAL:$1|1=ул юйылды|улар юйылды}}",
        "api-error-empty-file": "Һеҙ ебәргән файл буш.",
        "api-error-emptypage": "Яңы буш биттәр яһау тыйыла.",
        "api-error-fetchfileerror": "Эске хата: файлды күсергән ваҡытта хата китте",
index e86ae79..95b6bfb 100644 (file)
@@ -14,7 +14,8 @@
                        "bar.wikipedia.org administrators",
                        "✓",
                        "아라",
-                       "Matthias Klostermayr"
+                       "Matthias Klostermayr",
+                       "Macofe"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "sharedupload-desc-there": "De Datei stãmmt aus $1 und deaf bei ãndera Projekte vawendt wean. Schau auf'd [$2 Dateibeschreibungsseitn] fia weidare Infoamazionen.",
        "sharedupload-desc-here": "De Datei stammt aus $1 und deaf vo andan Projektn vawendt wean. De Bschreibung vo da [$2 Dateibschreibungsseitn] wead unen ozoagt.",
        "uploadnewversion-linktext": "A neiche Versión voh derer Daatei aufféloon",
-       "filerevert-defaultcomment": "zruckgsétzd auf dé Versión vom $1, $2",
+       "filerevert-defaultcomment": "zruckgsétzd auf dé Versión vom $1, $2 ($3)",
        "filerevert-submit": "Zrucksetzen",
        "filedelete-legend": "Lésch dé Daatei",
        "filedelete-intro": "Du léschst dé Daatei '''„[[Media:$1|$1]]“'''.",
        "listgrouprights-addgroup-self-all": "Kauh olle Gruppm zum oagern Kóntó dazuadoah",
        "mailnologin": "Du bist néd auhgmödt",
        "emailuser": "Mail an den Nutza",
-       "emailpage": "E-Mail an Nutza",
        "noemailtitle": "Koa Mail-Adress",
        "emailfrom": "Voh:",
        "emailto": "Aun:",
        "move-page-legend": "Seiten vaschiam",
        "movepagetext": "Mid dém Formular kauhst a Seiten umbenénner, waunnstas mid olle Versiónen auf an neichen Titel vaschiabst.\nDa oide Titel werd danoch zum neichen weiderloaten.\nDu kauhst Weiderloatungen, dé auf dén Originoititel valinken, autómaatisch koarigiern lossen.\nStö sicher, daas du im Auhschlus olle [[Special:DoubleRedirects|dóppéden]] óder [[Special:BrokenRedirects|dé hienigen Weiderloatungen]] ywerpriaffst.\nDu bist dodafyr vaauntwortlich, daas Links weiderhih aufs richtige Zü vaweisen.\n\nDé Seiten werd '''néd''' vaschóm, waunns bereits a Seiten mim vurgseegernen Titel gibt, ausser dé is laar óder a Weiderloatung óne a Versiónsgschicht. \nDés bdeitt, daas du d' Umbenénnung ryckgängig mochen kauhst, waunn du an Feeler gmocht host.  Du kauhst hihgéng koah Seiten ywerschreim.\n\n'''Ówocht!'''\nD' Vaschiawung kauh weidreichende und néd daworterde Fóing fyr haiffig bsuachde Seiten haum.\nDu sóiderst désswéng d' Kónsequenzen vastaunden haum, bevur du iatz weider duast.",
        "movepagetalktext": "De dazuaghearade Dischgria-Seitn wiad, fåis's ane gibt, midvaschom, '''außa'''\n*unta'm neichn Nãm gibt's schãu an Eintråg oda\n*du tuast s'Hakal bei da unting Opzion außa.\n\nIn de zwoa Fälle miaßadst, fåis des gwünscht is, de Seitn händisch vaschiam oda zsãmmfüng.\n\nBittschee gib außadem druntn in '''neichn''' Nãm vu da Seitn ei und schreib kuaz '''wieso'''<nowiki>'st</nowiki> de Seitn vaschiam mechst.",
-       "movearticle": "Seitn vaschiam:",
        "movenologintext": "Zum Vaschiam muaßt a registriada und [[Special:UserLogin|ãngmöideta Benutza]] sei.",
        "movenotallowed": "Du håst ka Berechtigung zum Vaschiam vu Seitn.",
        "movenotallowedfile": "Du håst ka Berechtigung zum Vaschiam vu Datein.",
index f6a041b..42b5024 100644 (file)
@@ -11,7 +11,8 @@
                        "RigiMahnoor",
                        "Oldstoneage",
                        "Baloch Afghanistan",
-                       "Mjbmr"
+                       "Mjbmr",
+                       "Macofe"
                ]
        },
        "tog-underline": ":لینکانآ خط کش",
        "mergehistory-go": "پیش دار اصلاحات قابل چن وبند",
        "mergehistory-submit": "چن وبند کن بازبینی آنء",
        "mergehistory-empty": "هچ بازبینی چن و بند نه توننت بنت",
-       "mergehistory-success": "$3 {{PLURAL:$3|بازبینی|بازبینی ان}} ء [[:$1]] گون موفقیت چن و بند بوت ته [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|بازبینی|بازبینی ان}} ء $1 گون موفقیت چن و بند بوت ته [[:$2]].",
        "mergehistory-fail": "نه تونیت چن وبند تاریح اجرا کنت، لطفا دگه چک کنیت صفحه و وهد پارامترانء.",
        "mergehistory-fail-toobig": "تاریخچگء همگرنچی بیت نه کنت که گیش چه محدودیت $1 {{PLURAL:$1|نسخه}} انتقال بیت انت.",
        "mergehistory-no-source": "منبع صفحه  $1 موجود نهنت.",
        "filerevert-legend": "ترینگ فایل",
        "filerevert-intro": " شما په ترینگء '''[[Media:$1|$1]]''' په  [$4 نسخه ای په داب چه $3, $2].",
        "filerevert-comment": "دلیل:",
-       "filerevert-defaultcomment": "تررت په نسخه په داب $2, $1",
+       "filerevert-defaultcomment": "تررت په نسخه په داب $2, $1 ($3)",
        "filerevert-submit": "تررگ",
        "filerevert-success": "''[[Media:$1|$1]]'''  بدل بوتت په [$4 نسخه په داب چه $3, $2].",
        "filerevert-badversion": "چه ای فایل پیشگین نسخه مکلی گون داتگین وهد نیست.",
        "move-page-legend": "صفحه جاه په جاه کن",
        "movepagetext": "استفاده چه جهلگی فرم یک صفحه ای نامی آ بدل کنت، کل تاریح آیآ په نوکین نام جاه په جاه کنت.\nگهنگین عنوان یک صفحه غیر مستقیمی په نوکین عنوان بیت.\nلینکان په کهنگین عوض نبنت;\nمطمین بیت په خاطر [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|پرشتگین غیر مستقیم]].\nشما مسولیت که مطمین بیت که لینکان ادامه دهنت روگ په جاهی که قرار برونت.\n\nتوجه کینت صفحه جاه په جاه نه بیت اگه یک صفحه ای گون نوکین عنوان هست، مگر شی که آی هالیک بیت یا یک غیرمسقیم و پی سرین تاریح اصلاح می بیت. شی په ای معنی اینت که شما تونیت یک صفحه ای آ نامی بدل کینت که  آی نام په خطا عوض بیت و شما نه توینت یک صفحه ی نامی بازنویسی کنیت.\n\n''''هوژاری!''''\nشی ممکننت یک تغییر آنی و نه لوٹتگین په یک معروفین صفحه ای بیت;\nلصفا مطمین بیت شما عواقب شی زانیت پیش چه دیم روگآ",
        "movepagetalktext": "همراهی گپان صفحه اتوماتیک گون آی جاه په چاه بنت ''''مگر:''''\nیک ناهالیکین صفحه گپی چیر آی ء نوکین نام بیت، یا\nشما جهلیگین باکس آ تیک مجنیت.\nته ای موراد شما بایدن صفحه یا دسته جاه په جاه کنی و یا آیآ چن و بند کینت.",
-       "movearticle": "جاه په چاهی صفحه:",
        "movenologintext": "شما بایدن یک ثبت نامی کاربری بیت و [[Special:UserLogin|وارد بیت]]په جاه په جاه کتن یک صفحه.",
        "movenotallowed": "شما را اجازت به جاه په جاه کتن صفحات نیست.",
        "movenotallowedfile": "شما را اجارت په جاه په جاه کتن فایلان نیستن.",
index ddd2575..6a12328 100644 (file)
@@ -9,7 +9,8 @@
                        "Steven*fung",
                        "Urhixidur",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Linyahan an kilyawan:",
        "mergehistory-go": "Ipahayag an mapuwedeng matiripon na mga pagliwat",
        "mergehistory-submit": "Tiripona an mga pagbabago",
        "mergehistory-empty": "Mayong mga pagbabago na puwedeng mapagtiripon.",
-       "mergehistory-success": "$3 {{PLURAL:$3|pagbabago|mga pagbabago}} sa [[:$1]] matrayumpong napagtiripon na magin [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|pagbabago|mga pagbabago}} sa $1 matrayumpong napagtiripon na magin [[:$2]].",
        "mergehistory-fail": "Dae tabi makayanan na makapaghimo nin historiyang pagtiripon, tabi pakihiling giraray an pahina asin parametro kan oras.",
        "mergehistory-no-source": "Gikanang pahina $1 bakong eksistido.",
        "mergehistory-no-destination": "Destinasyong pahina $1 bakong eksistido.",
        "filerevert-legend": "Ibalik an dokumento",
        "filerevert-intro": "Pigbabalik mo an '''[[Media:$1|$1]]''' sa [$4 version as of $3, $2].",
        "filerevert-comment": "Rason:",
-       "filerevert-defaultcomment": "Pigbalik sa bersyon sa ngonyan $2, $1",
+       "filerevert-defaultcomment": "Pigbalik sa bersyon sa ngonyan $2, $1 ($3)",
        "filerevert-submit": "Ibalik",
        "filerevert-success": "'''[[Media:$1|$1]]''' binalik sa [$4 version as of $3, $2].",
        "filerevert-badversion": "Mayong dating bersyón na lokal kaining ''file'' na may taták nin oras na arog sa tinao.",
        "movepagetext": "Sa paggagamit kan porma na yaon sa ibaba mariribayan nin pangaran an sarong pahina, maibabalyo an gabos kaining historiya pasiring sa baguhong pangaran.\nAn lumang titulo magigin sarong panlikwat na pahina sa baguhong titulo.\nIka makakapagsumpay kan mga panlikwat na magtutukdong awtomatiko pasiring sa orihinal na titulo.\nKun saimong pinili na dae, seguraduhon na marikisa para sa [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|nabaak na mga panlikwat]].\nIka an responsable para himoong segurado na an mga kasugpon padagos na minatukdo kun saen sinda dapat na magduman.\n\nGiromdoma na an pahina '''dae''' maibabalyo kun igwa na nin sarong pahina sa baguhon na titulo, laen lang kun ini daeng laman o sarong panlikwat asin mayo nin nakaaging historiya nin pagliwat.\nIni minapasabot na ika makakapagribay nin pangaran nin sarong pahina pabalik sa kun saen ini pinagribayan nin pangaran kun ika nakahimo nin kasalaan, asin ika dae makakasalambaw nin sarong eksistido nang pahina.\n\n'''Patanid!'''\nIni magigin sarong biglaan asin dae inaasahan na kaliwatan para sa sarong bantugan na pahina; pakiseguro sana na saimong nasabutan an mga konsekuwensiya kaini bago ipagpadagos.",
        "movepagetext-noredirectfixer": "An paggamit kan porma na yaon sa ibaba magliliwat sa pangaran kan pahina, magbabalyo kan gabos kaining historiya paduman sa baguhon na pangaran.\nAn lumang titulo magigin sarong panlikwat na pahina paduman sa baguhon na titulo.\nMagin paseguro na magmansay nin [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|baraak na panlikwat]].\nIka an responsable para himoon na segurado na an mga kilyaw padagos na magtutukdo kun saen sinda dapat na magduman.\n\nTandaan na an pahina '''dae''' maibabalyo kun igwa na nin sarong pahina sa baguhon na titulo, lean lang kun ini mayong laog o sarong panlikwat asin mayo nin nakaaging historiya nin pagliwat.\nIni minapasabot na ika makakapagliwat nin pangaran kan saron gpahina pabalik sa kun saen ini pinagliwat an pangaran sa piggikanan kun ika makahimo nin sarong kasalaan, asin ika dae makakasalambaw kan sarong eksistido nang pahina.\n\n'''Patanid!'''\nIni mapuwedeng sarong hidalion asin dae inaasahan na kaliwatan para sa sarong bantugan na pahina;\npakipaseguro baya na ika nakakasabot sa mga konsekuwensiya kaini bago magpapadagos.",
        "movepagetalktext": "An kapadis na olay na páhina enseguidang ibabalyo kasabay kaini '''kun:'''\n*Igwa nang may laog na olay na páhina na may parehong pangaran, o\n*Halîon mo an marka sa kahon sa babâ.\n\nSa mga kasong iyan, kaipuhan mong ibalyo o isalak an páhina nin mano-mano kun boot mo.",
-       "movearticle": "Ibalyó an pahina:",
        "moveuserpage-warning": "'''Patanid:''' Ika magpopoon na magbalyo in sarong pahina nin paragamit. Pakitandaan tabi na an pahina sana na ipagbabalyo asin an paragamit '''dae''' maipagliliwat an pangaran.",
        "movenologintext": "Kaipuhan na rehistradong parágamit ka asin si [[Special:UserLogin|nakalaog]] tangarig makabalyó ka nin páhina.",
        "movenotallowed": "Mayô kang permiso na ibalyó an mga pahina sa wiki na ini.",
        "api-error-badaccess-groups": "Ika daeng permiso na magkarga nin mga sagunson sa wiking ini.",
        "api-error-badtoken": "Panlaog na kasalaan: Raot na pangilip",
        "api-error-copyuploaddisabled": "An pagkakarga sa paagi kan URL pinag-untok sa serbidor na ini.",
-       "api-error-duplicate": "Igwa {{PLURAL:$1|nin [$2 ibang sagunson]|mga [$2 iba pang mga sagunson]}} na yaon sa sityo na igwa nin kaparehong laog.",
-       "api-error-duplicate-archive": "Igwa {{PLURAL:$1|kaidto nin [$2 ibang sagunson]|kaidto nin [$2 ibang mga sagunson]}} na yaon sa sityo na igwa nin kaparehong laog, alagad {{PLURAL:$1|ini kaidto|sinda kaidto}} pinagpura na.",
-       "api-error-duplicate-archive-popup-title": "Kambal na {{PLURAL:$1|sagunson na|mga sagunson na}} pinagpura na.",
-       "api-error-duplicate-popup-title": "Kambal na {{PLURAL:$1|sagunson|mga sagunson}}.",
+       "api-error-duplicate": "Igwa {{PLURAL:$1|nin ibang sagunson|mga iba pang mga sagunson}} na yaon sa sityo na igwa nin kaparehong laog.",
+       "api-error-duplicate-archive": "Igwa {{PLURAL:$1|kaidto nin ibang sagunson|kaidto nin ibang mga sagunson}} na yaon sa sityo na igwa nin kaparehong laog, alagad {{PLURAL:$1|ini kaidto|sinda kaidto}} pinagpura na.",
        "api-error-empty-file": "An sagunson na saimong pinagsumite daeng laog.",
        "api-error-emptypage": "Nagmumukna nin bago, mayong laog na mga pahina dae pinagtutugutan.",
        "api-error-fetchfileerror": "Panlaog na kasalaan: May bagay na naging sala habang hinahakot an sagunson.",
index 752db99..f3bd212 100644 (file)
@@ -14,7 +14,8 @@
                        "Zedlik",
                        "Тест",
                        "아라",
-                       "Liashko"
+                       "Liashko",
+                       "Macofe"
                ]
        },
        "tog-underline": "Падкрэсьліваць спасылкі:",
        "nstab-template": "Шаблён",
        "nstab-help": "Старонка дапамогі",
        "nstab-category": "Катэгорыя",
+       "mainpage-nstab": "Галоўная старонка",
        "nosuchaction": "Няма такога дзеяньня",
        "nosuchactiontext": "Дзеяньне, пазначанае ў URL, зьяўляецца няслушным.\nМагчыма, вы ўвялі няслушны URL або перайшлі па няслушнай спасылцы.\nГэта можа быць і памылкай у праграмным забесьпячэньні {{GRAMMAR:родны|{{SITENAME}}}}.",
        "nosuchspecialpage": "Такой спэцыяльнай старонкі не існуе",
        "viewsource": "Паказаць крыніцу",
        "viewsource-title": "Прагляд крыніцы для $1",
        "actionthrottled": "Дзеяньне прытрыманае",
-       "actionthrottledtext": "У межах барацьбы са спамам Вы абмежаваныя ў надта частым выкананьні гэтага дзеяньня за кароткі прамежак часу, і Вы перавысілі гэтае абмежаваньне. Калі ласка, паспрабуйце яшчэ раз празь некалькі хвілінаў.",
+       "actionthrottledtext": "У межах барацьбы зь непажаданымі дзеяньнямі Вы абмежаваныя ў надта частым выкананьні гэтага дзеяньня за кароткі прамежак часу, і Вы перавысілі гэтае абмежаваньне. Калі ласка, паспрабуйце яшчэ раз празь некалькі хвілінаў.",
        "protectedpagetext": "Гэтая старонка была абароненая для прадухіленьня зьменаў ці іншых дзеяньняў.",
        "viewsourcetext": "Вы можаце праглядаць і капіяваць крынічны тэкст гэтай старонкі.",
        "viewyourtext": "Вы можаце праглядзець і скапіяваць крынічны тэкст <strong>вашых рэдагаваньняў</strong> на гэтай старонцы.",
        "createacct-captcha": "Праверка бясьпекі",
        "createacct-imgcaptcha-ph": "Увядзіце тэкст, што бачыце вышэй",
        "createacct-submit": "Стварыць рахунак",
-       "createacct-another-submit": "СÑ\82ваÑ\80Ñ\8bÑ\86Ñ\8c Ñ\96нÑ\88Ñ\8b Ñ\80аÑ\85Ñ\83нак",
+       "createacct-another-submit": "Стварыць рахунак",
        "createacct-benefit-heading": "{{SITENAME}} створаная людзьмі, такімі як вы.",
        "createacct-benefit-body1": "{{PLURAL:$1|праўка|праўкі|правак}}",
        "createacct-benefit-body2": "{{PLURAL:$1|старонка|старонкі|старонак}}",
        "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": "Ð\9bÑ\96Ñ\81Ñ\82 Ð¿Ñ\80а Ñ\81кÑ\96данÑ\8cне Ð¿Ð°Ñ\80олÑ\8e Ð±Ñ\8bÑ\9e Ð´Ð°Ñ\81ланÑ\8b.",
+       "passwordreset-emailsent": "Ð\9aалÑ\96 Ð³Ñ\8dÑ\82Ñ\8b Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð·Ð°Ñ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8b Ð´Ð»Ñ\8f Ð²Ð°Ñ\88ага Ñ\80аÑ\85Ñ\83нкÑ\83, Ñ\82адÑ\8b Ð±Ñ\83дзе Ð´Ð°Ñ\81ланÑ\8b Ð»Ñ\96Ñ\81Ñ\82 Ð¿Ñ\80а Ñ\81кÑ\96дванÑ\8cне Ð¿Ð°Ñ\80олÑ\8e.",
        "passwordreset-emailsent-capture": "Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.",
        "passwordreset-emailerror-capture": "Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1",
-       "changeemail": "Зьмяніць адрас электроннай пошты",
-       "changeemail-text": "Запоўніце гэтую форму для зьмены адрасу Вашай электроннай пошты. Вам неабходна будзе ўвесьці Ваш пароль для пацьверджаньня зьмены.",
+       "changeemail": "Ð\97Ñ\8cмÑ\8fнÑ\96Ñ\86Ñ\8c Ð°Ð±Ð¾ Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b",
+       "changeemail-text": "Запоўніце гэтую форму для зьмены адрасу Вашай электроннай пошты. Вам неабходна будзе ўвесьці Ваш пароль для пацьверджаньня зьмены. Калі вы жадаеце выдаліць адрас электроннай пошты, далучаны да вашага рахунку, пакіньце поле новага адрасу электроннай пошты пустым пры запаўненьні формы.",
        "changeemail-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "changeemail-oldemail": "Цяперашні адрас электроннай пошты:",
        "changeemail-newemail": "Новы адрас электроннай пошты:",
        "permissionserrorstext-withaction": "Вы ня маеце дазволу на $2 з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
        "recreate-moveddeleted-warn": "'''Увага: Вы ствараеце старонку, якая раней была выдаленая.'''\n\nУпэўніцеся, што стварэньне гэтай старонкі неабходнае.\nНіжэй пададзеныя журналы выдаленьняў і пераносаў гэтай старонкі:",
        "moveddeleted-notice": "Гэта старонка была выдаленая. Журналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй.",
+       "moveddeleted-notice-recent": "Выбачайце, гэтая старонка была нядаўна выдаленая (цягам апошніх 24 гадзінаў).\nЖурналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй для даведкі.",
        "log-fulllog": "Паказаць журнал цалкам",
        "edit-hook-aborted": "Рэдагаваньне скасаванае працэдурай-перахопнікам.\nТлумачэньняў не было.",
        "edit-gone-missing": "Немагчыма абнавіць старонку.\nПадобна, што яна была выдаленая.",
        "mergehistory-go": "Паказаць вэрсіі, якія магчыма аб'яднаць",
        "mergehistory-submit": "Аб'яднаць гісторыі рэдагаваньняў",
        "mergehistory-empty": "Няма гісторыі рэдагаваньняў, якую магчыма аб'яднаць.",
-       "mergehistory-success": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з [[:$1]] пасьпяхова аб’яднаныя ў [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з $1 пасьпяхова аб’яднаныя ў [[:$2]].",
        "mergehistory-fail": "Не атрымалася аб'яднаць гісторыі старонак. Калі ласка, праверце парамэтры старонкі і часу.",
        "mergehistory-fail-toobig": "Немагчыма аб’яднаць гісторыю, бо будзе перавышаны ліміт у $1 {{PLURAL:$1|1=вэрсію|вэрсіі|вэрсіяў}}, якія будуць перанесеныя.",
        "mergehistory-no-source": "Не існуе крынічнай старонкі $1.",
        "titlematches": "Супадзеньні ў назвах старонак",
        "textmatches": "Супадзеньні ў тэкстах старонак",
        "notextmatches": "Супадзеньні ў тэкстах старонак ня знойдзеныя",
-       "prevn": "{{PLURAL:$1|папярэдняя|папярэднія|папярэднія}} $1",
-       "nextn": "{{PLURAL:$1|наступная|наступныя|наступныя}} $1",
+       "prevn": "{{PLURAL:$1|1=папярэдняя|папярэднія}} $1",
+       "nextn": "{{PLURAL:$1|1=наступная|наступныя}} $1",
        "prev-page": "папярэдняя старонка",
        "next-page": "наступная старонка",
        "prevn-title": "{{PLURAL:$1|Папярэдні $1 вынік|Папярэднія $1 вынікі|Папярэднія $1 вынікаў}}",
        "prefs-watchlist-token": "Сакрэтны ключ сьпісу назіраньня:",
        "prefs-misc": "Рознае",
        "prefs-resetpass": "Зьмяніць пароль",
-       "prefs-changeemail": "Зьмяніць адрас электроннай пошты",
+       "prefs-changeemail": "Зьмяніць ці выдаліць адрас электроннай пошты",
        "prefs-setemail": "Устанавіць адрас электроннай пошты",
        "prefs-email": "Налады электроннай пошты",
        "prefs-rendering": "Выгляд",
        "group-bot": "Робаты",
        "group-sysop": "Адміністрацыя",
        "group-bureaucrat": "Бюракраты",
-       "group-suppress": "РÑ\8dвÑ\96зоÑ\80Ñ\8b",
+       "group-suppress": "Ð\9fадаÑ\9eлÑ\8fлÑ\8cнÑ\96кÑ\96 Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\8fÑ\9e",
        "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|рэвізор|рэвізорка}}",
+       "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}}:РÑ\8dвÑ\96зоÑ\80Ñ\8b",
+       "grouppage-suppress": "{{ns:project}}:Ð\9fадаÑ\9eлÑ\8fлÑ\8cнÑ\96кÑ\96_вÑ\8dÑ\80Ñ\81Ñ\96Ñ\8fÑ\9e",
        "right-read": "прагляд старонак",
        "right-edit": "рэдагаваньне старонак",
        "right-createpage": "стварэньне старонак (акрамя старонак абмеркаваньняў)",
        "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 старонка была дададзеная|$2 старонкі былі дададзеныя|$2 старонак былі дададзеныя}} да катэгорыі",
+       "recentchanges-page-removed-from-category": "[[:$1]] выдаленая з катэгорыі",
        "upload": "Загрузіць файл",
        "uploadbtn": "Загрузіць файл",
        "reuploaddesc": "Скасаваць загрузку і вярнуцца да формы загрузкі",
        "upload-http-error": "Узьнікла памылка HTTP: $1",
        "upload-copy-upload-invalid-domain": "Капіяваньне загрузак не дазволенае ў гэтым дамэне.",
        "upload-dialog-title": "Загрузка файла",
-       "upload-dialog-error": "Адбылася памылка",
-       "upload-dialog-warning": "Зьявілася папярэджаньне",
        "upload-dialog-button-cancel": "Адмяніць",
        "upload-dialog-button-done": "Зроблена",
        "upload-dialog-button-save": "Захаваць",
        "upload-dialog-button-upload": "Загрузіць",
-       "upload-dialog-label-select-file": "Абраць файл",
-       "upload-dialog-label-infoform-title": "Падрабязнасьці",
-       "upload-dialog-label-infoform-name": "Назва",
-       "upload-dialog-label-infoform-description": "Апісаньне",
-       "upload-dialog-label-usage-title": "Выкарыстаньне",
-       "upload-dialog-label-usage-filename": "Назва файлу",
+       "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": "Назва файлу",
        "backend-fail-stream": "Немагчыма накіраваць файл $1.",
        "backend-fail-backup": "Немагчыма зрабіць рэзэрвовую копію файла $1.",
        "backend-fail-notexists": "Файл $1 не існуе.",
        "filerevert-legend": "Вярнуць папярэднюю вэрсію файла",
        "filerevert-intro": "Вы вяртаеце '''[[Media:$1|$1]]''' да [вэрсіі $4 ад $3, $2].",
        "filerevert-comment": "Прычына:",
-       "filerevert-defaultcomment": "Вернутая вэрсія ад $2, $1",
+       "filerevert-defaultcomment": "Вернутая вэрсія ад $2 $1 ($3)",
        "filerevert-submit": "Вярнуць",
        "filerevert-success": "'''[[Media:$1|$1]]''' быў вернуты да [вэрсіі $4 ад $3, $2].",
        "filerevert-badversion": "Не існуе папярэдняй лякальнай вэрсіі гэтага файла з пазначанай датай.",
        "emailccsubject": "Копія Вашага ліста да $1: $2",
        "emailsent": "Ліст адасланы",
        "emailsenttext": "Ваш ліст быў адасланы.",
-       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailuser}}» {{GRAMMAR:родны|{{SITENAME}}}}.",
+       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$1|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailuser}}» {{GRAMMAR:родны|{{SITENAME}}}}.",
        "usermessage-summary": "Паведамленьне пра выхад з сыстэмы.",
        "usermessage-editor": "Дастаўка сыстэмных паведамленьняў",
        "watchlist": "Сьпіс назіраньня",
        "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": "Выдаліць",
        "movepagetext": "З дапамогай гэтай формы Вы можаце перанесьці старонку, і разам зь ёй усю гісторыю.\nСтарая назва будзе перанакіроўваць на новую.\nВы можаце аўтаматычна абнавіць перанакіраваньні на першапачатковую назву.\nКалі вы адмовіцеся, упэўніцеся ў адсутнасьці [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|няслушных перанакіраваньняў]].\nАдказнасьць за дакладнасьць спасылак ляжыць на тым, хто перанёс старонку.\n\nЗаўважце, што старонка '''ня будзе''' перанесеная, калі пад новай назвай ужо існуе іншая старонка, за выключэньнем выпадкаў, калі яна пустая альбо зьяўляецца перанакіраваньнем і ня мае гісторыі рэдагаваньняў. Гэта азначае, што існуе магчымасьць скасаваць зьмену назвы, калі Вы памыліліся, але немагчыма выдаліць існую старонку.\n\n'''Увага!'''\nЗьмена назвы папулярных старонак можна стацца вельмі нечаканай і рэзкай;\nкалі ласка, упэўніцеся, што Вы разумееце наступствы такіх зьменаў.",
        "movepagetext-noredirectfixer": "Скарыстаўшыся гэтай формай, Вы перанесяце старонку з усёй гісторыяй зьменаў да новай назвы.\nСтаронка са старой назвай будзе перанакіроўваць на старонку з новай.\nКалі ласка, праверце існаваньне [[Special:DoubleRedirects|падвоеных]] і [[Special:BrokenRedirects|няслушных перанакіраваньняў]].\nВы адказныя за тое, каб спасылкі працягвалі весьці туды, куды яны павінны.\n\nЗаўважце, калі ласка, што старонка '''ня будзе''' перанесеная, калі ўжо існуе старонка з новай назвай, акрамя выпадкаў, калі яна пустая ці зьмяшчае перанакіраваньне, а таксама ня мае папярэдняй гісторыі рэдагаваньняў.\nГэта значыць, што Вы можаце перанесьці старонку назад, калі зробіце памылку, але ня можаце выпадкова перазапісаць існуючую старонку.\n\n'''Папярэджаньне!'''\nПеранос можа быць маштабным і нечаканым для ''папулярных'' старонак.\nУпэўніцеся, калі ласка, што Вы разумееце ўсе магчымыя наступствы пераносу.",
        "movepagetalktext": "Старонка абмеркаваньня будзе перанесеная разам з асноўнай старонкай, '''за выключэньнем:'''\n* Не пустая старонка абмеркаваньня ўжо існуе пад новай назвай, альбо\n* Вы не паставілі адзнаку ў полі ніжэй.\n\nУ такіх выпадках Вы можаце перанесьці ці аб’яднаць старонку абмеркаваньня самастойна.",
-       "movearticle": "Перанесьці старонку:",
        "moveuserpage-warning": "'''Папярэджаньне:''' Вы зьбіраецеся перанесьці старонку ўдзельніка. Калі ласка заўважце, што старонка будзе перанесеная, але імя ўдзельніка ''ня'' будзе зьмененае.",
        "movecategorypage-warning": "<strong>Увага:</strong> вы зьбіраецеся перанесьці старонку катэгорыі. Калі ласка, заўважце, што будзе перанесеная толькі гэтая старонка, а ўсе старонкі з старой катэгорыі <em>ня</em> будуць перанесеныя ў новую.",
        "movenologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]], каб перанесьці старонкі.",
        "tags-edit-logentry-submit": "Дастасаваць зьмены да {{PLURAL:$1|$1 журнальнага запісу|$1 журнальных запісаў}}",
        "tags-edit-success": "Зьмены былі пасьпяхова дастасаваныя.",
        "tags-edit-failure": "Гэтыя зьмены ня могуць быць дастасаваныя:\n$1",
+       "tags-edit-nooldid-title": "Няслушная мэтавая вэрсія",
+       "tags-edit-nooldid-text": "Вы або не пазначылі мэтавую вэрсію для выкананьня гэтай функцыі, або пазначаная вэрсія не існуе.",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
        "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
        "api-error-copyuploaddisabled": "Загрузка з URL-адрасу забароненая на гэтым сэрвэры.",
-       "api-error-duplicate": "Ужо {{PLURAL:$1|1=існуе [$2 іншы файл]|існуюць [$2 іншыя файлы]}} з такім жа зьместам.",
-       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|1=быў [$2 файл]|былі [$2 файлы]}} з дакладна такім жа зьместам, але {{PLURAL:$1|1=ён быў выдалены|яны былі выдаленыя}}.",
-       "api-error-duplicate-archive-popup-title": "Дублікаты {{PLURAL:$1|1=файла, які ўжо быў выдалены|файлаў, якія ўжо былі выдаленыя}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|1=Ідэнтычны файл|Ідэнтычныя файлы}}",
+       "api-error-duplicate": "На сайце ўжо {{PLURAL:$1|1=існуе іншы файл|існуюць іншыя файлы}} з такім жа зьместам.",
+       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|1=быў файл|былі файлы}} з дакладна такім жа зьместам, але {{PLURAL:$1|1=ён быў выдалены|яны былі выдаленыя}}.",
        "api-error-empty-file": "Дасланы Вамі файл быў пусты.",
        "api-error-emptypage": "Стварэньне новых пустых старонак забаронена.",
        "api-error-fetchfileerror": "Унутраная памылка: падчас атрыманьня файла штосьці здарылася.",
index e387bd6..eefc049 100644 (file)
@@ -22,7 +22,9 @@
                        "아라",
                        "Unomano",
                        "Mikalai Udodau",
-                       "Artificial123"
+                       "Artificial123",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Падкрэсліваць спасылкі:",
        "mergehistory-go": "Паказаць версіі, прыдатныя для аб'яднання",
        "mergehistory-submit": "Аб'яднаць версіі",
        "mergehistory-empty": "Няма версій, якія можна аб'яднаць.",
-       "mergehistory-success": "$3 {{PLURAL:$3|версія|версій}} [[:$1]] паспяхова аб'яднаныя ў склад [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|версія|версій}} $1 паспяхова аб'яднаныя ў склад [[:$2]].",
        "mergehistory-fail": "Немагчыма аб'яднаць гісторыі, праверце зададзеныя назву і час.",
        "mergehistory-fail-toobig": "Немагчыма выканаць зліццё гісторый, таму што больш за ліміт у $1 {{PLURAL:$1|версію|версіі|версій}} трэба пераносіць.",
        "mergehistory-no-source": "Не існуе крынічная старонка $1.",
        "filerevert-legend": "Адкат файла",
        "filerevert-intro": "Вы адкочваеце '''[[Media:$1|$1]]''' да [$4 версіі з $3, $2].",
        "filerevert-comment": "Прычына:",
-       "filerevert-defaultcomment": "Адкочана да версіі з $2, $1",
+       "filerevert-defaultcomment": "Адкочана да версіі з $2, $1 ($3)",
        "filerevert-submit": "Адкаціць",
        "filerevert-success": "'''[[Media:$1|$1]]''' быў адкочаны да [$4 версіі з $3, $2].",
        "filerevert-badversion": "Няма старэйшай тутэйшай версіі гэтага файла з прапанаванай часавай меткай.",
        "movepagetext": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка <strong>не будзе</strong> перанесена, калі пад новай назвай ужо існуе старонка, і гэта не перасылка без гісторыі правак.\nТакім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n</strong>Увага!</strong>\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetext-noredirectfixer": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка '''не будзе''' перанесена, калі пад новай назвай ужо існуе старонка, не пустая і не перасылка і без гісторыі правак. Такім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n'''УВАГА!'''\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetalktext": "Звязаная старонка размовы будзе аўтаматычна перанесена разам з асноўнай, '''апроч тых выпадкаў, калі:'''\n*Існуе непустая старонка размовы звязаная з новай назвай, або\n*З боксу, што ніжэй, знятая адзнака.\n\nУ такіх выпадках, калі гэта неабходна, трэба пераносіць або аб'ядноўваць старонку размовы самастойна.",
-       "movearticle": "Перанесці старонку:",
        "moveuserpage-warning": "'''Увага.''' Вы збіраецеся пераназваць старонку ўдзельніка. Калі ласка, звернеце ўвагу, што пераназвана будзе толькі старонка, удзельнік '''не''' будзе пераназваны.",
        "movecategorypage-warning": "<strong>Увага:</strong> Вы збіраецеся перанесці старонку катэгорыі. Заўважце, што толькі гэта старонка будзе перанесена, і ніводная старонка са старой катэгорыі <em>не будзе</em> катэгарызавана ў новай.",
        "movenologintext": "Вы павінны быць зарэгістраваным удзельнікам, і [[Special:UserLogin|ўвайсці ў сістэму]], каб пераносіць старонкі.",
        "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
        "api-error-copyuploaddisabled": "Загрузка з URL-адрасу забароненая на гэтым серверы.",
-       "api-error-duplicate": "Ужо {{PLURAL:$1|існуе [$2 іншы файл]|існуюць [$2 іншыя файлы]}} з такім жа зместам.",
-       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|ўжо быў [$2 файл]|былі [$2 файлы]}} з дакладна такім жа зместам, але {{PLURAL:$1|ён быў выдалены|яны былі выдаленыя}}.",
-       "api-error-duplicate-archive-popup-title": "Дублікаты {{PLURAL:$1|файла, які ўжо быў выдалены|файлаў, якія ўжо былі выдаленыя}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ідэнтычны файл|Ідэнтычныя файлы}}",
+       "api-error-duplicate": "Ужо {{PLURAL:$1|існуе іншы файл|існуюць іншыя файлы}} з такім жа зместам.",
+       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|ўжо быў файл|былі файлы}} з дакладна такім жа зместам, але {{PLURAL:$1|ён быў выдалены|яны былі выдаленыя}}.",
        "api-error-empty-file": "Дасланы Вамі файл быў пусты.",
        "api-error-emptypage": "Стварэнне новых пустых старонак забаронена.",
        "api-error-fetchfileerror": "Унутраная памылка: падчас атрымання файла штосьці здарылася.",
index bbe437f..a2773b2 100644 (file)
@@ -28,7 +28,9 @@
                        "ShadeOfGrey",
                        "PetaRZ",
                        "Macofe",
-                       "V111P"
+                       "V111P",
+                       "Лорд Бъмбъри",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "pool-timeout": "Изтичане на времето за заключване на страницата",
        "pool-queuefull": "Опашката за заявки е пълна",
        "pool-errorunknown": "Непозната грешка",
+       "poolcounter-usage-error": "Грешка при ползване $1",
        "aboutsite": "За {{SITENAME}}",
        "aboutpage": "Project:За {{SITENAME}}",
        "copyright": "Освен ако не е посочено друго, съдържанието е достъпно при условията на $1.",
        "nstab-template": "Шаблон",
        "nstab-help": "Помощ",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Главна страница",
        "nosuchaction": "Няма такова действие",
        "nosuchactiontext": "Действието, указано в интернет адреса, е невалидно.\nМоже би сте допуснали грешка в изписването на адреса или сте последвали некоректна хипервръзка.\nПроблемът може да се дължи и на грешка в софтуера на {{SITENAME}}.",
        "nosuchspecialpage": "Няма такава специална страница",
        "readonly_lag": "Базата от данни беше автоматично заключена, докато подчинените сървъри успеят да се съгласуват с основния сървър.",
        "internalerror": "Вътрешна грешка",
        "internalerror_info": "Вътрешна грешка: $1",
+       "internalerror-fatal-exception": "Фатална грешка от тип „$1“",
        "filecopyerror": "Файлът „$1“ не можа да бъде копиран като „$2“.",
        "filerenameerror": "Файлът „$1“ не можа да бъде преименуван на „$2“.",
        "filedeleteerror": "Файлът „$1“ не можа да бъде изтрит.",
        "no-null-revision": "Не може да бъде създадена празна версия на страницата „$1“",
        "badtitle": "Невалидно заглавие",
        "badtitletext": "Желаното заглавие на страница е невалидно, празно или неправилна препратка към друго уики. Възможно е да съдържа знаци, които не са позволени в заглавия.",
+       "title-invalid-utf8": "Желаната страница съдържа невалиден низ с кодиране UTF-8",
+       "title-invalid-interwiki": "Желаното заглавие на страница съдържа препратка към друго уики, което не може да бъде ползвано в заглавия.",
+       "title-invalid-talk-namespace": "Желаното заглавие на страница се отнася към беседа, която не съществува",
+       "title-invalid-characters": "Желаното заглавие на статия съдържа невалидни знаци: „$1“",
+       "title-invalid-relative": "Заглавието съдържа относителен път. Относителни заглавия на статии (./,../) са невалидни, защото често ще са недостижимо, когато биват извиквани от браузъра на потребителя.",
+       "title-invalid-magic-tilde": "Желаното заглавие на статия съдържа невалидна поредица от вълчнички (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Желаното заглавие на статия е твърде дълго. Трябва да е не по-дълго от $1 {{PLURAL:$1|байт|байта}} в кодиране UTF-8.",
        "perfcached": "Следните данни са извлечени от склада и затова може да не отговарят на текущото състояние. В складираното копие {{PLURAL:$1|е допустим най-много един резултат|са допустими най-много $1 резултата}}.",
        "perfcachedts": "Данните са складирани и обновени за последно на $1. Най-много {{PLURAL:$4|един резултат е допустим и наличен|$4 резултата са допустими и налични}} в складираното копие.",
        "querypage-no-updates": "Обновяването на тази страница в момента е изключено. Засега данните тук няма да бъдат обновявани.",
        "mergehistory-go": "Показване на редакциите, които могат да се слеят",
        "mergehistory-submit": "Сливане на редакции",
        "mergehistory-empty": "Няма редакции, които могат да бъдат слети.",
-       "mergehistory-success": "$3 {{PLURAL:$3|версия|версии}} от [[:$1]] бяха успешно слети с редакционната история на [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|версия|версии}} от $1 бяха успешно слети с редакционната история на [[:$2]].",
        "mergehistory-fail": "Невъзможно е да се извърши сливане на редакционните истории; проверете страницата и времевите параметри.",
        "mergehistory-no-source": "Изходната страница $1 не съществува.",
        "mergehistory-no-destination": "Целевата страница $1 не съществува.",
        "filerevert-legend": "Възвръщане на файла",
        "filerevert-intro": "Възвръщане на '''[[Media:$1|$1]]''' към [$4 версията от $3, $2].",
        "filerevert-comment": "Причина:",
-       "filerevert-defaultcomment": "Възвръщане към версия от $2, $1",
+       "filerevert-defaultcomment": "Възвръщане към версия от $2, $1 ($3)",
        "filerevert-submit": "Възвръщане",
        "filerevert-success": "Файлът '''[[Media:$1|$1]]''' беше възвърнат към [$4 версия от $3, $2].",
        "filerevert-badversion": "Не съществува предишна локална версия на файла със зададения времеви отпечатък.",
        "movepagetext": "Използването на формуляра по-долу ще преименува страница, като се премести цялата ѝ редакционна история история на новото име. Старото заглавие ще се превърне в пренасочваща страница.\nМоже да се избере възможност пренасочванията към оригиналното заглавие да бъдат обновени автоматично. В случай, че тази възможност не е избрана, препоръчително е да се провери за [[Special:DoubleRedirects|двойни]] или [[Special:BrokenRedirects|невалидни пренасочвания]].\nВие сами би трябвало да се убедите в това дали препратките продължават да сочат там, където се предполага.\n\nОбърнете внимание, че страницата '''няма''' да бъде преместена, ако вече съществува страница с новото име, освен ако е празна или пренасочване и няма редакционна история.\n\n'''ВНИМАНИЕ!'''\nТова може да е голяма и неочаквана промяна за известна страница. Уверете се, че разбирате последствията, преди да продължите.",
        "movepagetext-noredirectfixer": "С помощта на формуляра по-долу се преименува страница, като цялата ѝ редакционна история се премества под новото име.\nСтарото име ще остане като пренасочваща страница към новото заглавие.\nЖелателно е преди преместването да се извърши проверка за [[Special:DoubleRedirects|двойни]] или [[Special:BrokenRedirects|невалидни пренасочвания]].\nДобре е да се направи проверка дали препратките продължават да сочат там, където се предполага.\n\nВажно е да се знае, че страницата '''няма''' да бъде преместена, ако вече съществува страница с новото име, освен ако не е празна или пренасочваща страница и няма налична редакционна история.\nТова означава, че ако една страница бъде преименувана по погрешка, тя може да се премести обратно със старото си заглавие, но не може да се замести съществуваща страница.\n\n'''Предупреждение!'''\nТова може да е драстична или неочаквана промяна за някоя популярна страница;\nнеобходимо е да се уверите, че разбирате последствията от това преди да предприемете действието.",
        "movepagetalktext": "Ако съществува, съответната дискусионна страница ще бъде преместена автоматично заедно с нея, '''освен ако:'''\n* не местите страницата от едно именно пространство в друго,\n* вече съществува непразна дискусионна страница с това име или\n* не сте отметнали долната кутийка.\n\nВ тези случаи, ако желаете, ще е необходимо да преместите страницата ръчно.",
-       "movearticle": "Преместване на страница:",
        "moveuserpage-warning": "'''Внимание:''' Предприели сте опит да преместите потребителска страница. Забележете, че от преместването на страницата '''няма''' да последва преименуване на потребителя.",
        "movecategorypage-warning": "<strong>Внимание:</strong> На път сте да преместите категорийна страница. Моля, обърнете внимание, че ще бъде преместена само страницата на категорията. <em>Никоя</em> от страниците в старата категория <em>няма</em> да бъде прекатегоризирана.",
        "movenologintext": "Необходимо е да [[Special:UserLogin|влезете]], за да може да премествате страници.",
        "api-error-badaccess-groups": "Нямате необходимите права, за да качвате файлове в това уики.",
        "api-error-badtoken": "Вътрешна грешка: неправилен маркер.",
        "api-error-copyuploaddisabled": "Качването през URL е забранено на този сървър.",
-       "api-error-duplicate": "На сайта вече има качени {{PLURAL:$1|[$2 друг файл]|[$2 други файла]}} с идентично съдържание.",
-       "api-error-duplicate-archive": "На сайта вече е имало {{PLURAL:$1|качен [$2 друг файл]|качени [$2 други файла]}} с идентично съдържание, {{PLURAL:$1|който е бил изтрит|които са били изтрити}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Дублиращ се файл, който вече е бил изтрит|Дублиращи се файлове, които вече са били изтрити}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Повтарящ се файл|Повтарящи се файлове}}",
+       "api-error-duplicate": "На сайта вече има качени {{PLURAL:$1|друг файл|други файла}} с идентично съдържание.",
+       "api-error-duplicate-archive": "На сайта вече е имало {{PLURAL:$1|качен друг файл|качени други файла}} с идентично съдържание, {{PLURAL:$1|който е бил изтрит|които са били изтрити}}.",
        "api-error-empty-file": "Заявеният за качване файл беше празен.",
        "api-error-emptypage": "Създаването на нови, празени страници, не е разрешено.",
        "api-error-fetchfileerror": "Вътрешна грешка: Нещо се обърка при извличане на файла.",
index 2c93cc7..c0c8120 100644 (file)
@@ -4,7 +4,8 @@
                        "Baloch Afghanistan",
                        "Ibrahim khashrowdi",
                        "Rachitrali",
-                       "Mjbmr"
+                       "Mjbmr",
+                       "Macofe"
                ]
        },
        "tog-underline": "لینکانی جهلگا خط کشیتین",
        "nstab-template": "تراشوان",
        "nstab-help": "کومکین تاکدیم",
        "nstab-category": "تهر",
+       "mainpage-nstab": "بُنیادی تاکدیم",
        "nosuchaction": "ایرنگین ئملی وجود نداریت",
        "nosuchactiontext": "ای ئملی که شما مشخص کورته ئیت بی انترنیتئین ادرسی تا جواز نداریت .\nممکن اینت که انترنتین ادرسا جوان وارد نه کورته ئیت یا مشکل والا ئین لینک ئیا وارد کوره ئیت .\nیا امکان داریت که شه نرم افزاری که شما بی{{SITENAME}} تا استفاده کورته ئیت مشکل داشته بیئت.",
        "nosuchspecialpage": "ای رقمین ویژه ئین تاکدیمی موجود نه اینت",
        "mergehistory-go": "قابل ادغامئ تاریخچه ئی نشان داتین",
        "mergehistory-submit": "نخسه ئانی ادغام",
        "mergehistory-empty": "هیچ یک شه نخسه ئان ادغامی ئی وڈ نه ونت.",
-       "mergehistory-success": "$3 ئی نخسه  شه [[:$1]]  ئا گو کامیابیا بی  [[:$2]] تا ادغام {{PLURAL:$3|بوت}}.",
+       "mergehistory-done": "$3 ئی نخسه  شه $1  ئا گو کامیابیا بی  [[:$2]] تا ادغام {{PLURAL:$3|بوت}}.",
        "mergehistory-fail": "تاریخچه ئی ادغام ممکن نه اینت، مهربانی بکنیت تاکدیمئ گزینه ئانه و وختا بگیندیت.",
        "mergehistory-no-source": " $1 منشائی تاکدیم موجود نه اینت.",
        "mergehistory-no-destination": "$1 مخصدی تاکدیم موجود نه اینت .",
        "filerevert-legend": "بیئرگردینتین فایلی",
        "filerevert-intro": "شما بی حالی بیئرگردینتینا '''[[Media:$1|$1]]''' بی [$4 نخسه تاریخ $2 سائت $3] هستیت.",
        "filerevert-comment": "دلیل:",
-       "filerevert-defaultcomment": "بÛ\8cئرگردÛ\8cÙ\86تÛ\8cÙ\86 Ø¨Ø¦ $1 Ø¦Û\8c Ù\86خسÙ\87 Ø¦Ø§ Ø³Ø§Ø¦Øª $2",
+       "filerevert-defaultcomment": "بÛ\8eرگردÛ\8cÙ\86تÛ\8cÙ\86 Ø¨Ù\90Ù\87 Ù\86خسÙ\87 $2Ø\8c Ø³Ø§Ø¦Øª $1 ($3)",
        "filerevert-submit": "بیئرگشت",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> بی [$4 نخسه ئی بی تاریخی $2 سائت $3] ئا بیئرگشتینته بوت.",
        "filerevert-badversion": "قدیمیتیرین نخسه شه ای فایلا موجود نه اینت.",
        "lockedbyandtime": "(بواسطه $1 ئا بئ $2 سائت $3)",
        "move-page": "انتقال $1",
        "move-page-legend": "تاکدیمی انتقال",
-       "movearticle": "تاکدیمی انتقال:",
        "movenotallowed": "شما په تاکدیمانی جابجا کورتین ئی اجازه ئا نداریت.",
        "movenotallowedfile": "شما په پایل ئانی جابجا کورتین ئی اجازه ئا نداریت.",
        "cant-move-category-page": "شما په تهرئانی تاکدیمانی جابجا کورتین ئا اجازه  نداریت.",
        "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": "سیستم ئی پیامانی دیستین",
        "spambot_username": "میدیا ویکی ئی تمیزکاری شه سپم هان",
        "spam_reverting": "بیئرگردینتین آخیرین نخسه ئی که بئ $1 ئا لینک نداریت.",
        "spam_deleting": "موچین نخسه ئان که گۆ\t  $1 ئا لینک انتت، بئ پاک کورتین حالا",
-       "simpleantispam-label": "انتی-سپم ئی چیک .\nای قسمت ئا پُر  '''مه کنیت'''!",
+       "simpleantispam-label": "انتي-سپم ئی چیک کورتین.\nایشی تا پُر  <strong>مه</strong> کنێت!",
        "pageinfo-title": "مئلومات په «$1» ئا",
        "pageinfo-header-basic": "بُنادین مئلومات",
        "pageinfo-header-edits": "تاریخچه ئی ایڈیٹ",
        "searchsuggest-containing": "شامیلین دیمان...",
        "api-error-badaccess-groups": "شما اجازه په پایلی ئی بُرز کورتین ئا بئ ای ویکی ای تا نداریت.",
        "api-error-badtoken": "داخیلی ئین خه تا: امنیتی ئین کوڈ سه ئی نه اینت (Bad token).",
-       "api-error-duplicate-popup-title": "تکرارین {{PLURAL:$1|فایل|فایلان}}",
        "api-error-empty-file": "فایلی که دیم داته بوت خالی ات.",
        "api-error-emptypage": "خالی ئین دیمانی جۆڑ کورتین جایز نه اینت.",
        "api-error-file-too-large": "فایلی که دیم داتیت بئ حد ٹوو ات.",
index 9467810..7aaaff9 100644 (file)
        "mergehistory-list": "विलय जोग्य संपादन इतिहास",
        "mergehistory-submit": "अवतरण विलय करीं",
        "mergehistory-empty": "कौनों अवतरण विलय नइखे कइल जा सकत।",
-       "mergehistory-success": " [[:$1]] के $3 {{PLURAL:$3|अवतरण|अवतरण सभ}} सफलता से [[:$2]] में विलय भइल।",
+       "mergehistory-done": " $1 के $3 {{PLURAL:$3|अवतरण|अवतरण सभ}} सफलता से [[:$2]] में विलय भइल।",
        "mergehistory-fail": "इतिहास विलय करे में अक्षम, पन्ना आ एकर टाइम पैरामीटर चेक करीं।",
        "mergehistory-reason": "कारण:",
        "revertmerge": "अलग करीं",
        "upload-file-error": "इंटरनल खराबी",
        "upload-misc-error": "नामालूम अपलोड खराबी",
        "upload-dialog-title": "फाइल अपलोड",
-       "upload-dialog-error": "कौनो खराबी आ गइल",
-       "upload-dialog-warning": "कौनो चेतावनी बा",
        "upload-dialog-button-cancel": "कैंसिल",
        "upload-dialog-button-done": "पूरा भइल",
        "upload-dialog-button-save": "सहेजीं",
        "upload-dialog-button-upload": "अपलोड",
-       "upload-dialog-label-select-file": "फाइल चुनीं",
-       "upload-dialog-label-infoform-title": "डिटेल जानकारी",
-       "upload-dialog-label-infoform-name": "नाँव",
-       "upload-dialog-label-infoform-description": "विवरण",
-       "upload-dialog-label-usage-title": "इस्तेमाल",
-       "upload-dialog-label-usage-filename": "फाइल नाँव",
+       "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": "फाइल नाँव",
        "backend-fail-stream": "फाइल \"$1\" स्ट्रीम ना हो पावल।",
        "backend-fail-backup": "फाइल \"$1\" के बैकअप ना हो पावल।",
        "backend-fail-notexists": "फाइल $1 मौजूद नइखे।",
index 643313f..6c8b2d4 100644 (file)
        "mergehistory-go": "Tampaiakan bababakan nang kawa digabungakan",
        "mergehistory-submit": "Gabungakan raralatan",
        "mergehistory-empty": "Kadada raralatan nang kawa digabungakan",
-       "mergehistory-success": "$3 {{PLURAL:$3|ralatan|raralatan}} matan [[:$1]] ruhui digabungakan ka [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ralatan|raralatan}} matan $1 ruhui digabungakan ka [[:$2]].",
        "mergehistory-fail": "Kada kawa manggabungakan halam, muhun pariksa pulang tungkaran wan parameter wayah.",
        "mergehistory-no-source": "Tungkaran asal mula $1 kadada.",
        "mergehistory-no-destination": "Tungkaran tatuju $1 kadada.",
        "filerevert-legend": "Bulikakan barakas",
        "filerevert-intro": "Pian mambulikakan '''[[Media:$1|$1]]''' ka macam [$4 pada $3, $2].",
        "filerevert-comment": "Alasan:",
-       "filerevert-defaultcomment": "Dibulikakan ka macam pada $2, $1",
+       "filerevert-defaultcomment": "Dibulikakan ka macam pada $2, $1 ($3)",
        "filerevert-submit": "Bulikakan",
        "filerevert-success": "'''[[Media:$1|$1]]''' sudah dibulikakan ka macam [$4 pada $3, $2]",
        "filerevert-badversion": "Kadada janis lokal bahari tumatan barakas ini lawan bacap waktu nang dimaksud.",
        "movepagetext": "Mamakai purmulir di bawah akan mangganti ngaran sabuting tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar. Judul lawas akan jadi sabuting tungkaran paugahan ka judul hanyar. Pian kawa mahanyari bahwasanya paugahan-paugahan manuju ka judul nang samustinya langsung. Amun kada, pastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]]. Pian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.\n\nCatatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar ngitu, kacuali amun tungkaran itu puang atawa sabuting paugahan wan kadada halam babakan.\n\n'''Paringatan!'''\nIni kawa maakibatakan paubahan kada taduga wan drastis gasan sabuting tungkaran rami; muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
        "movepagetext-noredirectfixer": "Mamakai purmulir di bawah akan mangganti ngaran sabuting tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar.\nJudul lawas akan jadi sabuting tungkaran paugahan ka judul hanyar.\nPastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]].\nPian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.\n\nCatatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar ngitu, kacuali amun tungkaran itu puang atawa sabuah paugahan wan kadada halam babakan.\n\n'''Paringatan!'''\nIni kawa maakibatakan paubahan kada taduga wan drastis gasan sabuah tungkaran rami; \nmuhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
        "movepagetalktext": "Tungkaran pamandiran tarait akan langsung dipindahakan baimbai wan ini '''kacuali amun:'''\n*Sabuah tungkaran pamandiran nang kada puang sudah baisi awan judul hanyar, atawa\n*Pian kada manyuntring kutak di bawah.",
-       "movearticle": "Pindahakan tungkaran:",
        "moveuserpage-warning": "'''Paringatan:''' Pian pasal mamindahakan sabuah tungkaran pamuruk. Muhun catat tungkaran ngitu haja nang dipindah wan pamuruknya gin akan ''kada'' dingarani-pulang.",
        "movenologintext": "Pian musti saurang pamuruk tadaptar wan [[Special:UserLogin|babuat log]] hagan mamindahakan sabuah tungkaran.",
        "movenotallowed": "Pian kada baisi ijin hagan mamindahakan tutungkaran.",
index 45fa006..af8a0eb 100644 (file)
@@ -25,7 +25,8 @@
                        "Aftabuzzaman",
                        "Wikisagnik",
                        "Aashaa",
-                       "Sayma Jahan"
+                       "Sayma Jahan",
+                       "Macofe"
                ]
        },
        "tog-underline": "সংযোগগুলির নিচে দাগ দেখানো হোক:",
        "nstab-template": "টেমপ্লেট",
        "nstab-help": "সহায়িকা",
        "nstab-category": "বিষয়শ্রেণী",
+       "mainpage-nstab": "প্রধান পাতা",
        "nosuchaction": "এমন কোন কাজ নেই",
        "nosuchactiontext": "এই উআরএল এ নির্ধারিত কাজটি অবৈধ।\nআপনি হয়তো একটি ভুল লিঙ্ক দিয়েছেন অথবা ইউআরএল লিখতে ভুল করেছেন।\nএটি এমনও নির্দেশ করে যে {{SITENAME}} সাইটে ব্যবহৃত সফটওয়্যারটিতে একটি ত্রুটি রয়েছে।",
        "nosuchspecialpage": "এমন কোন বিশেষ পাতা নেই",
        "welcomecreation-msg": "আপনার অ্যাকাউন্ট তৈরী হয়েছে।\nআপনার [[Special:Preferences|{{SITENAME}} পছন্দসমূহ]]  পরিবর্তন করে নিতে ভুলবেন না।",
        "yourname": "ব্যবহারকারী নাম:",
        "userlogin-yourname": "ব্যবহারকারী নাম",
-       "userlogin-yourname-ph": "আপনার ব্যবহাকারী নাম লিখুন",
-       "createacct-another-username-ph": "আপনার ব্যবহাকারী নাম প্রবেশ করান",
+       "userlogin-yourname-ph": "à¦\86পনার à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦® à¦²à¦¿à¦\96à§\81ন",
+       "createacct-another-username-ph": "à¦\86পনার à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦® à¦ªà§\8dরবà§\87শ à¦\95রান",
        "yourpassword": "পাসওয়ার্ড:",
        "userlogin-yourpassword": "পাসওয়ার্ড",
        "userlogin-yourpassword-ph": "আপনার পাসওয়ার্ড লিখুন",
        "createacct-captcha": "নিরাপত্তা পরীক্ষা",
        "createacct-imgcaptcha-ph": "উপরে যে লেখা দেখতে পাচ্ছেন তা লিখুন",
        "createacct-submit": "আপনার অ্যাকাউন্ট তৈরি করুন",
-       "createacct-another-submit": "à¦\86রà§\87à¦\95à¦\9fি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রি à¦\95রà§\81ন",
+       "createacct-another-submit": "অ্যাকাউন্ট তৈরি করুন",
        "createacct-benefit-heading": "{{SITENAME}} আপনার মত লোকের দ্বারাই তৈরি।",
        "createacct-benefit-body1": "{{PLURAL:$1|টি সম্পাদনা}}",
        "createacct-benefit-body2": "{{PLURAL:$1|টি পাতা}}",
        "noname": "আপনি সঠিক ব্যবহারকারী নাম নির্দিষ্ট করেননি।",
        "loginsuccesstitle": "প্রবেশ সফল",
        "loginsuccess": "'''আপনি এইমাত্র \"$1\" নামে {{SITENAME}}-তে প্রবেশ করেছেন।'''",
-       "nosuchuser": "\"$1\" à¦¨à¦¾à¦®à§\87 à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à§\87à¦\87।\nবà§\8dযবহাà¦\95ারà§\80 à¦¨à¦¾à¦® আকার সংবেদনশীল।\nআপনার বানান পরীক্ষা করে দেখুন, অথবা [[Special:UserLogin/signup|নতুন একটি অ্যাকাউন্ট খুলুন]]।",
+       "nosuchuser": "\"$1\" à¦¨à¦¾à¦®à§\87 à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à§\87à¦\87।\nবà§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦®à§\87র আকার সংবেদনশীল।\nআপনার বানান পরীক্ষা করে দেখুন, অথবা [[Special:UserLogin/signup|নতুন একটি অ্যাকাউন্ট খুলুন]]।",
        "nosuchusershort": "\"$1\" নামের কোন ব্যবহারকারী নেই। নামের বানান পরীক্ষা করুন।",
        "nouserspecified": "আপনাকে অবশ্যই ব্যবহারকারী নাম নির্দিষ্ট করতে হবে।",
        "login-userblocked": "এই ব্যবহারকারীকে বাধা দেওয়া হয়েছে। লগ-ইন সম্ভব নয়।",
        "changeemail-password": "আপনার {{SITENAME}} পাসওয়ার্ড:",
        "changeemail-submit": "ই-মেইল পরিবর্তন",
        "changeemail-throttled": "আপনি পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন। পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
+       "changeemail-nochange": "দয়া করে একটি ভিন্ন নতুন ইমেইল ঠিকানা লিখুন।",
        "resettokens": "রিসেট টোকেন",
        "resettokens-text": "আপনি টোকেন রিসেট করতে পারেন, যা অ্যাকাউন্টের সাথে সম্পর্কিত আপনার ব্যক্তিগত তথ্য দেখার কাজে ব্যবহার করা হয়।",
        "resettokens-no-tokens": "রিসেট করার মত কোনো টোকেন নেই।",
        "mergehistory-go": "একত্রীকরণযোগ্য সম্পাদনাগুলি দেখানো হোক",
        "mergehistory-submit": "সংশোধনগুলি একত্র করা হোক",
        "mergehistory-empty": "কোন সংশোধন একত্র করা যাবে না.",
-       "mergehistory-success": "[[:$1]] গুলোর মধ্যে $3 {{PLURAL:$3| টি সংশোধন |টি সংশোধনগুলো}} সফলভাবে [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
+       "mergehistory-done": "$1 গুলোর মধ্যে $3 {{PLURAL:$3| টি সংশোধন |টি সংশোধনগুলো}} সফলভাবে [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
        "mergehistory-fail": "ইতিহাস একত্র করা গেল না। অনুগ্রহ করে পাতাটি ও সময়ের প্যারামিটারগুলি আবার পরীক্ষা করে দেখুন।",
        "mergehistory-fail-toobig": "ইতিহাস থেকে আগের পাতাগুলো একীকরণ সম্ভব নয়, কারণ এর ফলে সর্বোচ্চ $1 টি {{PLURAL:$1|সংস্করণ}} স্থানান্তরের সীমানা অতিক্রম করবে।",
        "mergehistory-no-source": "$1 বলে কোন উৎস পাতার অস্তিত্ব নেই।",
        "columns": "কলাম:",
        "searchresultshead": "অনুসন্ধান",
        "stub-threshold": "<a href=\"#\" class=\"stub\">অসম্পূর্ণ নিবন্ধের সংযোগগুলির</a> বিশেষ ফরম্যাটিঙের সীমা (বাইটে):",
+       "stub-threshold-sample-link": "নমুনা",
        "stub-threshold-disabled": "নিস্ক্রিয়",
        "recentchangesdays": "সাম্প্রতিক পরিবর্তনে দিনসমূহ দেখানোর জন্য:",
        "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
        "group-bot": "বট",
        "group-sysop": "প্রশাসক",
        "group-bureaucrat": "ব্যুরোক্র্যাট",
-       "group-suppress": "à¦\93ভারসাà¦\87à¦\9f",
+       "group-suppress": "দমনà¦\95ারà§\80",
        "group-all": "(সমস্ত)",
        "group-user-member": "{{GENDER:$1|ব্যবহারকারী}}",
        "group-autoconfirmed-member": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারী",
        "group-bot-member": "বট",
        "group-sysop-member": "প্রশাসক",
        "group-bureaucrat-member": "ব্যুরোক্র্যাট",
-       "group-suppress-member": "ওভারসাইট",
+       "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}}:à¦\93ভারসাà¦\87à¦\9f",
+       "grouppage-suppress": "{{ns:project}}:দমনà¦\95ারà§\80",
        "right-read": "পাতাসমূহ পড়ুন",
        "right-edit": "পাতা সম্পাদনা করুন",
        "right-createpage": "পাতা তৈরি করো (আলাপের পাতা নয়)",
        "recentchangeslinked-summary": "একটি নির্দিষ্ট পাতা (অথবা নির্দিষ্ট বিষয়শ্রেণীতে) থেকে সংযুক্ত এ পাতার সাম্প্রতিক পরিবর্তনের তালিকা দেওয়া হয়েছে। আপনার [[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টি পাতা}} সরানো হয়েছে",
        "upload": "আপলোড",
        "uploadbtn": "ফাইল আপলোড করুন",
        "reuploaddesc": "আপলোড বাতিল করো এবং আপলোড ফর্মে ফেরত যাও।",
        "upload-http-error": "একটি এইচটিটিপি ত্রুটি দেখা দিয়েছে: $1",
        "upload-copy-upload-invalid-domain": "এই ডোমেইন থেকে আপলোড সম্ভব নয়।",
        "upload-dialog-title": "ফাইল আপলোড করুন",
-       "upload-dialog-error": "একটি ত্রুটি দেখা দিয়েছে",
-       "upload-dialog-warning": "একটি সতর্কবার্তা দেখা দিয়েছে",
        "upload-dialog-button-cancel": "বাতিল",
        "upload-dialog-button-done": "সম্পন্ন",
        "upload-dialog-button-save": "সংরক্ষণ",
        "upload-dialog-button-upload": "আপলোড",
-       "upload-dialog-label-select-file": "ফাইল নির্বাচন করুন",
-       "upload-dialog-label-infoform-title": "বিস্তারিত",
-       "upload-dialog-label-infoform-name": "নাম",
-       "upload-dialog-label-infoform-description": "বিবরণ",
-       "upload-dialog-label-usage-title": "ব্যবহার",
-       "upload-dialog-label-usage-filename": "ফাইলের নাম",
+       "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": "ফাইলের নাম",
        "backend-fail-stream": "\"$1\" ফাইলের স্ট্রিম দেখানো যাচ্ছে না।",
        "backend-fail-backup": "\"$1\" ফাইলের ব্যাকআপ তৈরী সম্ভব নয়।",
        "backend-fail-notexists": "\"$1\" নামের কোনো ফাইল নেই।",
        "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": "প্রদত্ত তারিখ ও সময়ের জন্য এই ফাইলটির কোন স্থানীয় সংস্করণ নেই।",
        "nopagetext": "আপনার নির্ধারিত লক্ষ্য পাতাটি নাই।",
        "pager-newer-n": "{{PLURAL:$1|নতুনতর ১টি|নতুনতর $1টি}}",
        "pager-older-n": "{{PLURAL:$1|আরও পুরনো ১টি|আরও পুরনো $1টি}}",
-       "suppress": "à¦\93ভারসাà¦\87à¦\9f",
+       "suppress": "দমন",
        "querypage-disabled": "কারিগরি কারণে এই বিশেষ পাতাটি আপাতত বন্ধ রয়েছে।",
        "apihelp": "এপিআই সাহায্য",
        "apihelp-no-such-module": "মডিউল \"$1\" পাওয়া যায়নি।",
        "booksources-text": "নতুন ও পুরাতন ব্যবহৃত বই বিক্রি করে, এমন কতগুলি সাইটের সংযোগের তালিকা নিচে দেওয়া হল, যে সাইটগুলিতে আপনার অনুসন্ধানকৃত বইগুলির উপর আরও তথ্য থাকতে পারে:",
        "booksources-invalid-isbn": "উল্লেখিত ISBN সঠিক নয়; অনুগ্রহ করে মূল উৎস থেকে আবার পরীক্ষা করুন।",
        "specialloguserlabel": "সম্পাদক:",
-       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (শিরà§\8bনাম à¦\85থবা à¦¬à§\8dযবহারà¦\95ারà§\80):",
+       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (শিরà§\8bনাম à¦¬à¦¾ {{ns:user}}:বà§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦®):",
        "log": "লগগুলি",
        "all-logs-page": "সব পাবলিক লগ",
        "alllogstext": "{{SITENAME}}-এর সবগুলো লগের সম্মিলিত প্রদর্শন।\nআপনি লগের ধরন, ব্যবহারকারীর নাম, বা পাতার নাম নির্বাচন করে প্রদর্শনটির আকার কমিয়ে আনতে পারেন।",
        "emailccsubject": "আপনার বার্তার অনুলিপি $1-কে: $2",
        "emailsent": "ই-মেইল প্রেরণ করা হয়েছে",
        "emailsenttext": "আপনার ই-মেইল বার্তা প্রেরণ করা হয়েছে।",
-       "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে $2-এর নিকট পাঠানো হয়েছে।",
+       "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}।",
        "usermessage-summary": "বাদবাকি সিস্টেম বার্তা",
        "usermessage-editor": "সিস্টেম ম্যাসেঞ্জার",
        "watchlist": "নজর তালিকা",
        "ipb_already_blocked": "\"$1\" ইতিমধ্যে ব্লক",
        "ipb-needreblock": "$1 পূর্বেই ব্লক রয়েছেন। আপনি কি সেটিংস পরিবর্তন করতে চান?",
        "ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধাঁ|বাধাঁসমূহ}}",
-       "unblock-hideuser": "à¦\86পনি à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\86নবà§\8dলà¦\95 à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾, à¦\95ারণ à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¬à§\8dযবহাকারী নাম লুকানো রয়েছে।",
+       "unblock-hideuser": "à¦\86পনি à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦®à§\81à¦\95à§\8dত à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾, à¦\95ারণ à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¬à§\8dযবহারকারী নাম লুকানো রয়েছে।",
        "ipb_cant_unblock": "ত্রুটি: $1 ব্লক আইডি খুঁজে পাওয়া যায়নি। হয়ত ইতিমধ্যেই এটির উপর থেকে বাধা তুলে নেওয়া হয়েছে।",
        "ipb_blocked_as_range": "ত্রুটি: $1 আইপি ঠিকানাটিকে সরাসরি বাধা দেওয়া হয়নি এবং বাধা তুলে নেওয়া যাবে না। তবে ঠিকানাটি $2 সীমার অন্তর্ভুক্ত এবং সেটি থেকে বাধা তুলে নেওয়া সম্ভব।",
        "ip_range_invalid": "অবৈধ আইপি শ্রেণী",
        "databasenotlocked": "ডাটাবেজ বন্ধ নয়।",
        "lockedbyandtime": "({{GENDER:$1|$1}} $2 এর $3 সময়ে)",
        "move-page": "$1 স্থানান্তর",
-       "move-page-legend": "পাতাটি সরিয়ে ফেলুন",
+       "move-page-legend": "পাতা স্থানান্তর",
        "movepagetext": "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।\nপুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।\nযেসমস্ত পুনর্নির্দেশনা পুরনো শিরোনামটির দিকে নির্দেশ করছিল, সেগুলি স্বয়ংক্রিয়ভাবে হালনাগাদ করতে পারবেন।\nযদি তা না চান, তবে [[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।\nসংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।\n\nলক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে '''না''', যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে।\nঅর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।\n\n'''সতর্কীকরণ!'''\nকোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে; অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
        "movepagetext-noredirectfixer": "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।\nপুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।\n[[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।\nসংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।\n\nলক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে '''না''', যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে। \nঅর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।\n\n'''সতর্কীকরণ!'''\nকোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে;\nঅগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
        "movepagetalktext": "পাতাটির সাথে সাথে সংশ্লিষ্ট আলোচনা পাতাটিও স্বয়ংক্রিয়ভাবে সরানো হবে '''যদি না:'''\n*খালি নয় এমন একটি আলাপ পাতা নতুন শিরোনামটির অধীনে ইতিমধ্যেই বিদ্যমান থাকে, অথবা\n*আপনি নিচের বাক্সটি থেকে টিক সরিয়ে নিতে পারেন।\n\nএসব ক্ষেত্রে আপনি চাইলে নিজের হাতে পাতাটিকে সরাতে বা একত্রীকরণ করতে পারেন।",
-       "movearticle": "যে পাতা সরিয়ে ফেলা হবে",
        "moveuserpage-warning": "'''সতর্কতা:''' আপনি একটি ব্যবহারকারী পাতা স্থানান্তর করছেন। অনুগ্রহ করে লক্ষ্য করুন যে এর মাধ্যমে কেবলমাত্র পাতাটি স্থানান্তর হবে, কিন্তু পাতার নাম পরিবর্তন হবে ''না''।",
        "movecategorypage-warning": "<strong>সতর্কীকরণ:</strong> আপনি একটি বিষয়শ্রেণীর পাতা স্থানান্তর করতে চলেছেন। দয়া করে মনে রাখবেন যে এতে শুধুমাত্র পাতাটি স্থানান্তরিত হবে এবং পুরাতন বিষয়শ্রেণীতে থাকা কোন পাতা নতুনটিতে পুনঃশ্রেণীকরণ করা হবে <em>না</em>।",
        "movenologintext": "কোন পাতা সরিয়ে ফেলতে চাইলে আপনাকে অবশ্যই একজন নিবন্ধিত ব্যবহারকারী হতে হবে ও অ্যাকাউন্টে [[Special:UserLogin|প্রবেশ]] করতে হবে।",
        "cant-move-to-category-page": "আপনার পাতাটিকে বিষয়শ্রেণী পাতায় স্থানান্তরের অনুমতি নেই।",
        "newtitle": "এই নতুন শিরোনামে",
        "move-watch": "এই পাতাটি নজরে রাখুন",
-       "movepagebtn": "পাতা à¦¸à¦°à¦¾ন",
+       "movepagebtn": "পাতা à¦¸à§\8dথানানà§\8dতর à¦\95রà§\81ন",
        "pagemovedsub": "সরিয়ে নেওয়া হয়েছে",
        "movepage-moved": "'''\"$1\"-কে \"$2\" শিরোনামে স্থানান্তর করা হয়েছে'''",
        "movepage-moved-redirect": "একটি পুনর্নির্দেশনা তৈরি হয়েছে।",
        "movepage-moved-noredirect": "পুনর্নির্দেশ তৈরীতে বাধা দেয়া হয়েছে।",
        "articleexists": "এই শিরোনামে একটি পাতা ইতোমধ্যে সৃষ্টি হয়ে গেছে, অথবা আপনি যে শিরোনামটি পছন্দ করেছেন তা গ্রহণযোগ্য নয়। দয়া করে অন্য একটি শিরোনাম দিয়ে চেষ্টা করুন।",
        "cantmove-titleprotected": "আপনি এই অবস্থানে পাতাটিকে স্থানান্তর করতে পারেন না, কারণ এই নতুন শিরোনামটি সৃষ্টি করা থেকে সুরক্ষিত।",
-       "movetalk": "সংশ্লিষ্ট আলাপের পাতা সরিয়ে নাও",
+       "movetalk": "সংশ্লিষ্ট আলাপ পাতা স্থানান্তর করো",
        "move-subpages": "উপপাতা স্থানান্তর ($1টি পর্যন্ত)",
        "move-talk-subpages": "উপপাতার আলাপ পাতা স্থানান্তর ($1টি পর্যন্ত)",
        "movepage-page-exists": "$1 পাতাটি ইতিমধ্যেই বিদ্যমান এবং স্বয়ংক্রিয়ভাবে পুনর্লিখন করা সম্ভব নয়।",
        "tooltip-ca-nstab-main": "বিষয়বস্তু পাতাটি দেখুন",
        "tooltip-ca-nstab-user": "ব্যহারকারী পাতাটি দেখুন",
        "tooltip-ca-nstab-media": "মিডিয়া পাতাটি দেখুন",
-       "tooltip-ca-nstab-special": "à¦\8fà¦\9fি à¦\8fà¦\95à¦\9fি à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¤à¦¾, à¦\86পনি à¦\8fà¦\9fি à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন না",
+       "tooltip-ca-nstab-special": "à¦\8fà¦\9fি à¦\8fà¦\95à¦\9fি à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¤à¦¾, à¦\8fবà¦\82 à¦\8fà¦\9fি à¦¸à¦®à§\8dপাদনা à¦\95রা à¦¯à¦¾à¦¬à§\87 না",
        "tooltip-ca-nstab-project": "প্রকল্প পাতাটি দেখুন",
        "tooltip-ca-nstab-image": "ফাইলের পাতাটি দেখুন",
        "tooltip-ca-nstab-mediawiki": "সিস্টেম বার্তাটি দেখুন",
        "logentry-newusers-byemail": "$1, $3 ব্যবহারকরী অ্যাকাউন্টটি {{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 {{GENDER:$2|সুরক্ষিত করেছেন}} $4 [প্রপাতাকার]",
+       "logentry-protect-modify": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4",
+       "logentry-protect-modify-cascade": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4 [প্রপাতাকার]",
        "logentry-rights-rights": "$1 ব্যবহারকারী, $3 এর দলগত সদস্যপদ $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন",
        "logentry-rights-rights-legacy": "$1 দলের সদস্যপদ পরিবর্তন করেছেন {{GENDER:$2|changed}} এর জন্য $3",
        "logentry-rights-autopromote": "$1 সয়ংক্রিয়ভাবে $4 থেকে $5 এ {{GENDER:$2|উন্নীত}} হয়েছে",
        "api-error-badaccess-groups": "আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।",
        "api-error-badtoken": "অভ্যন্তরীণ ত্রুটি: খারাপ টোকেন।",
        "api-error-copyuploaddisabled": "এই সার্ভারে ইউআরএল-এর মাধ্যমে আপলোড করার সুবিধা নিস্ক্রিয় রয়েছে।",
-       "api-error-duplicate": "ইতোমধ্যে এই সাইটে একই রকমের কন্টেট সমৃদ্ধ {{PLURAL:$1|[$2 অন্য ফাইল]|[$2 কিছু অন্য ফাইল]}} রয়েছে।",
-       "api-error-duplicate-archive": "একই নাম ও বিষয়বস্তু বিশিষ্ট {{PLURAL:$1| [$2 অপর একটি ফাইল]| [$2 কয়েকটি ফাইল]}} পূর্বে এই উইকিতে ছিলো, এবং {{PLURAL:$1|সেটিকে|সেগুলোকে}} অপসারণ করা হয়েছে।",
-       "api-error-duplicate-archive-popup-title": "অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}} যা ইতমধ্যে অপসারণ করা হয়েছে",
-       "api-error-duplicate-popup-title": "অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}}",
+       "api-error-duplicate": "ইতোমধ্যে এই সাইটে একই রকমের বিষয় সমৃদ্ধ {{PLURAL:$1|অন্য ফাইল|কিছু অন্য ফাইল}} রয়েছে।",
+       "api-error-duplicate-archive": "একই নাম ও বিষয়বস্তু বিশিষ্ট {{PLURAL:$1|অপর একটি ফাইল|কয়েকটি ফাইল}} পূর্বে এই উইকিতে ছিলো, এবং {{PLURAL:$1|সেটিকে|সেগুলোকে}} অপসারণ করা হয়েছে।",
        "api-error-empty-file": "আপনার জমাকৃত ফাইলটি খালি।",
        "api-error-emptypage": "নতুন পাতা তৈরি হচ্ছে, খালি পাতা গ্রহণযোগ্য নয়।",
        "api-error-fetchfileerror": "অভ্যন্তরীণ ত্রুটি: ফাইল নিয়ে আসার সময় কোনো সমস্যা হয়েছিলো।",
        "special-characters-title-emdash": "em ড্যাশ",
        "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-এ পুনঃনির্দেশিত"
 }
index c8a0982..572379d 100644 (file)
        "resetpass-wrong-oldpass": "লেপনেই বা এপাগার খন্তাচাবিগ চুম নাইসে।\nনিঙকরুরিতা তি হাদিএহান তর খন্তাচাবিগ সিলকরিসত নাইলে আরাক লেপনেই খন্তাচাবি আগর হেইচা করিসত।",
        "resetpass-temp-password": "লেপনাইসে খন্তাচাবি:",
        "passwordreset": "খন্তাচাবি রিসেট",
-       "passwordreset-legend": "খন্তাচাবি রিসেট",
        "passwordreset-username": "আতাকুরার নাংহান:",
        "passwordreset-domain": "ডমেইন:",
        "changeemail": "ই-মেইল ঠিকানাহান সিলকর",
        "mergehistory-go": "তিলকারানি একরতই পতানিহানি দেখাদে",
        "mergehistory-submit": "পতানিহানি তিলকরানি অক",
        "mergehistory-empty": "কোন পতানি তিলকরানি নাইল।",
-       "mergehistory-success": "[[:$1]] হানির মা $3 {{PLURAL:$3|হান পতাসি|হান পতাসি}} সফল ইয়া [[:$2]]-র লগে তিল করানি অসে।",
+       "mergehistory-done": "$1 হানির মা $3 {{PLURAL:$3|হান পতাসি|হান পতাসি}} সফল ইয়া [[:$2]]-র লগে তিল করানি অসে।",
        "mergehistory-fail": "ইতিহাসহান তিলকরানি নুৱারলাঙ। তি বারো পাতাহানর সময়র প্যারামিটারহানি হবা করে পরীক্ষা করিয়া চা।",
        "mergehistory-no-source": "উৎস পাতাহান $1 নেই।",
        "mergehistory-no-destination": "যিতইগা পাতাহান $1 নেই।",
        "listgrouprights-rights": "অধিকারহানি",
        "listgrouprights-members": "(সদস্যর পারেঙহানি)",
        "emailuser": "আতাকুরাগরে ইমেইল কর",
-       "emailpage": "আতাকরেকুরাগরে ই-মেইল কর",
        "defemailsubject": "{{SITENAME}} ই-মেইল",
        "noemailtitle": "ই-মেইলর কা ঠিকানাহান নেই",
        "emailfrom": "রাঙতো:",
        "block-log-flags-nocreate": "অ্যাকাউন্ট হঙকরানিহান থেপকরিয়া থনা অসে",
        "movepagetext": "তলর ফর্মহান ব্যবহার করিয়া পাতা আহানর চিঙনাঙ সিলকরানি একরতই, বারো লগে অহানর নুৱি চিঙনাঙ বারো ইতিহাসহান থেইকরানি একরতই।\nপুরনা চিঙনাঙ অহান নুৱা চিঙনাঙে যানার পথগ বাগেইতই।\nপুরনা চিঙনাঙর প্রতি মিলাপ অতাত কোন পতানি নাইব; অহান থকিয়া দ্বিমাউকার আলথকে যানার পাতা নাচলের আলথকে দিয়াপেঠার মিলাপ পরীক্ষা করানিত নাপাহুরিস।\nমিলাপ অহানি আয়ৌপা যাগাত থুঙকগা, অহান লেপকরানির দায়িত্বহান তরহান।\n\nখিয়াল কর যে যদি নুৱা চিঙনাঙ অহান্ন আগেত্তর পাতা আসেতানা কিতা, থা থাইলে  নুৱা পাতা এহান অহানাত '''না'''যিবগা, যদি না পাতা অহান খালি থার বা আলথকর নিদের্শনা আসে বারো আগেকার পতাসি ইতিহাস না থার। অর্থাৎ তি হারনাপেয়া নাঙ সিলকরিয়া থার সহজেই পুরানা নাঙহাত আলুইয়া যানা পারতেই, কিন্তু আগেত্তর আসে পাতার গজে ইকরানি নুৱারতেই।\n\n'''সিঙুইস!'''\nমানুর প্রিয় পাতার বারে এসাদে সিলনা খাঙদা ইতে পারে; মুঙেদে আগ বারানির আগে কামহার ফলহান কিহান ইতই, অহান লেপুইয়া করানি থক।",
        "movepagetalktext": "পাতাহান গুসানির লগে লগে অহানর য়্যারির পাতাহানউ আপ্পানে যিতইগা '''যদি না:'''\n*খালি নাইসে এসাদে য়্যারির পাতা নুৱা চিঙনাঙর তলে আগত্তর থা থাইলে, নাইলে\n*তি তলর বাক্সগত্ত টিক চিনৎহান থেইকরে পারর।\n\nএতার বারে তি চেইলে নিজর আতহানল পাতা অহান গুসানি বা পুলকরানি পারর।",
-       "movearticle": "পাতাহান থেইকর:",
        "movenologintext": "পাতা এহান থেইকরানির কা তি মিহিসত আতাকুরাগ বারো একাউন্টে [[Special:UserLogin|হমানি]] লাগতই।",
        "movenotallowed": "তরতা পাতা থেইকরানির য়্যাথাং নেই।",
        "movenotallowedfile": "তরতা ফাইল থেইকরানির য়্যাথাং নেই।",
index c442873..bdaf10f 100644 (file)
@@ -16,7 +16,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Pymouss",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Liammoù islinennet",
        "nstab-template": "Patrom",
        "nstab-help": "Skoazell",
        "nstab-category": "Rummad",
+       "mainpage-nstab": "Pajenn bennañ",
        "nosuchaction": "Ober dianav",
        "nosuchactiontext": "Direizh eo an ober spisaet en URL.\nMarteze hoc'h eus graet ur fazi bizskrivañ en URL pe heuliet ul liamm kamm.\nMarteze zo un draen er meziant implijet gant {{SITENAME}} ivez.",
        "nosuchspecialpage": "N'eus ket eus ar bajenn dibar-mañ",
        "mergehistory-go": "Diskouez ar stummoù a c'haller kendeuziñ",
        "mergehistory-submit": "Kendeuziñ ar stummoù",
        "mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
-       "mergehistory-success": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus [[:$1]] e [[:$2]].",
+       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus $1 e [[:$2]].",
        "mergehistory-fail": "Dibosupl kendeuziñ an istorioù. Gwiriit ar bajenn hag arventennoù an deiziadoù.",
        "mergehistory-fail-toobig": "Ne c'haller ket kendeuziñ an istorioù o vezañ ma vefe mont en tu all d'ar harzh a $1 reizhadenn da zilec'hiañ.",
        "mergehistory-no-source": "N'eus ket eus ar bajenn orin $1.",
        "filerevert-legend": "Disteuler ar restr",
        "filerevert-intro": "Emaoc'h o tistreiñ '''[[Media:$1|$1]]''' d'ar [stumm $4 eus $3, $2].",
        "filerevert-comment": "Abeg :",
-       "filerevert-defaultcomment": "Distroet da stumm $2, $1",
+       "filerevert-defaultcomment": "Distroet da stumm $2, $1 ($3)",
        "filerevert-submit": "Disteuler",
        "filerevert-success": "'''Distroet eo bet [[Media:$1|$1]]''' da [stumm $4 an $3, $2].",
        "filerevert-badversion": "N'eus stumm lec'hel kent ebet eus ar restr-mañ d'ar mare spisaet.",
        "movepagetext": "Grit gant ar furmskrid a-is evit adenvel ur pennad hag adkas an holl stummoù kent anezhañ war-zu an anv nevez.\nDont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.\nGallout a rit nevesaat ent emgefre an adkasoù a-vremañ a gas d'an titl orin.\nNe vo ket kemmet liammoù an titl kozh ha ne vo ket dilec'hiet ar bajenn gaozeal, ma'z eus anezhi.\n\nMa rit ho soñj chom hep en ober, gwiriit mat an holl [[Special:DoubleRedirects|adkasoù doubl]] pe [[Special:BrokenRedirects|adkasoù torret]].\nC'hwi eo zo karget da wiriañ e kas mat al liammoù d'al lec'h int sañset kas.\n\nNotit mat '''ne vo ket''' dilec'hiet ma'z eus dija ur bajenn ganti an anv nevez, nemet e vefe un adkas ha ne vefe tamm istor ebet stag outi.\nDre se e c'haller adkas ur bajenn war-zu he lec'h orin ma oa kamm an adkas.\n\n'''DIWALLIT!'''\nGallout a ra kement-se bezañ ur c'hemm bras ha dic'hortoz evit ur pennad a vez sellet outi alies;\nbezit sur e komprenit mat an heuliadoù a-raok kenderc'hel ganti.",
        "movepagetext-noredirectfixer": "Grit gant ar furmskrid a-is evit adenvel ur bajenn hag adkas an istor anezhi war-zu an anv nevez.\nDont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.\nGwiriit mat an [[Special:DoubleRedirects|adkasoù doubl]] hag an [[Special:BrokenRedirects|adkasoù torr]].\nEnnoc'h emañ fiziet gwiriañ e kendalc'h al liammoù da gas war-zu ar bajenn a rankont kas daveti.\n\nNotit mat ne vo '''ket''' dilec'hiet ar bajenn ma'z eus dija unan gant an titl nevez nemet e vefe goullo istor ar c'hemmoù degaset enni hag e vefe pe goullo ar bajenn pe e vefe un adkas anezhi. Gant se e c'haller adenvel ur bajenn war-zu he lec'h orin mard eo faziek an dilec'hiañ ha dibosupl eo frikañ ur bajenn zo anezhi c'hoazh. \n\n'''Diwallit !'''\nUr c'hemm bras ha dic'hortoz e c'hall bezañ evit ur bajenn a vez sellet outi alies ; bezit sur hoc'h eus komprenet mat an heuliadoù a-raok kenderc'hel ganti.",
        "movepagetalktext": "Gant se e vo adanvet ent emgefre ar bajenn gaozeal stag, ma'z eus anezhi '''nemet ma:'''\n*ec'h adanvit ur bajenn war-du ul lec'h all,\n*ez eus ur bajenn gaozeal c'hoazh gant an anv nevez, pe\n*diweredekaet hoc'h eus ar bouton a-is.\n\nEn degouezh-se e rankot adenvel pe gendeuziñ ar bajenn c'hwi hoc'h-unan ma karit.",
-       "movearticle": "Dilec'hiañ ar pennad",
        "moveuserpage-warning": "'''Diwallit : ''' War-nes dilec'hiañ ur bajenn implijer emaoc'h. Notit mat n'eus nemet ar bajenn a vo dilec'hiet ha ne vo ''ket'' adanvet an implijer.",
        "movenologintext": "A-benn gellout adenvel ur pennad e rankit bezañ un implijer enrollet ha bezañ [[Special:UserLogin|kevreet]].",
        "movenotallowed": "N'oc'h ket aotreet da zilec'hiañ pajennoù.",
        "api-error-badaccess-groups": "N'oc'h ket aotreet da enporzhiañ restroù war ar wiki-mañ.",
        "api-error-badtoken": "Fazi diabarzh : \"jedouer\" fall.",
        "api-error-copyuploaddisabled": "Diweredekaet eo an enporzhioù dre URL war ar servijer-mañ.",
-       "api-error-duplicate": "Bez' {{PLURAL:$1|ez eus [$2 restr all]|[$2 restr all]}} gant an hevelep danvez war al lec'hienn-mañ c'hoazh",
-       "api-error-duplicate-archive": "Bez' e oa {{PLURAL:$1|[$2 ur restr all]|[$2 restroù all]}} c'hoazh enno an hevelep danvez, nemet {{PLURAL:$1|eo bet diverket|int bet diverket}}.",
-       "api-error-duplicate-archive-popup-title": "Eilañ ar {{PLURAL:$1|restr|restroù}} zo bet diverket c'hoazh",
-       "api-error-duplicate-popup-title": "Eilañ {{PLURAL:$1|ar restr|ar restroù}}",
+       "api-error-duplicate": "Bez' {{PLURAL:$1|ez eus restr all|restr all}} gant an hevelep danvez war al lec'hienn-mañ c'hoazh",
+       "api-error-duplicate-archive": "Bez' e oa {{PLURAL:$1|ur restr all|restroù all}} c'hoazh enno an hevelep danvez, nemet {{PLURAL:$1|eo bet diverket|int bet diverket}}.",
        "api-error-empty-file": "Ar restr hoc'h eus roet a oa goullo.",
        "api-error-emptypage": "N'eo ket aotreet krouiñ pajennoù goullo.",
        "api-error-fetchfileerror": "Fazi diabarzh : aet ez eus un dra bennak a-dreuz en ur glask adtapout ar restr.",
index ec73427..7e0d78b 100644 (file)
@@ -22,7 +22,8 @@
                        "Macofe",
                        "Emir Mujadzic",
                        "Srdjan m",
-                       "Semso98"
+                       "Semso98",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podvuci veze:",
        "mergehistory-go": "Prikaži izmjene koje se mogu spojiti",
        "mergehistory-submit": "Spoji revizije",
        "mergehistory-empty": "Nema revizija za spajanje.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice [[:$1]] uspješno spojeno u [[:$2]].",
+       "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.",
        "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": "Zapisnik novih korisnika",
-       "newuserlogpagetext": "Ovo je zapis o registraciji novih korisnika.",
+       "newuserlogpagetext": "Ovo je zapisnik o registraciji novih korisnika.",
        "rightslog": "Zapisnik korisničkih prava",
        "rightslogtext": "Ovo je zapisnik promjena korisničkih prava.",
        "action-read": "čitate ovu stranicu",
        "filerevert-legend": "Vraćanje datoteke",
        "filerevert-intro": "Vraćate datoteku '''[[Media:$1|$1]]''' na [$4 verziju od $3, $2].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1",
+       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1 ($3)",
        "filerevert-submit": "Vrati",
        "filerevert-success": "'''Datoteka [[Media:$1|$1]]''' je vraćena na [$4 verziju od $3, $2].",
        "filerevert-badversion": "Ne postoji ranija lokalna verzija ove datoteke sa navedenim vremenskim podacima.",
        "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.",
-       "movearticle": "Premjesti 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 biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
        "movepage-page-unmoved": "Stranica $1 ne može biti premještena na $2.",
        "movepage-max-pages": "Maksimum od $1 {{PLURAL:$1|stranice|stranice|stranica}} je premješteno i više nije moguće premjestiti automatski.",
        "movelogpage": "Zapisnik premještanja",
-       "movelogpagetext": "Ispod je spisak stranica koje su premještene.",
+       "movelogpagetext": "Ispod je spisak premještenih stranica.",
        "movesubpage": "{{PLURAL:$1|Podstranica|Podstranice}}",
        "movesubpagetext": "Ova stranica ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} prikazanih ispod.",
        "movenosubpage": "Ova stranica nema podstranica.",
        "markedaspatrollednotify": "Ova izmjena na stranici „$1“ je označena kao pregledana.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Zapisnik patroliranja",
-       "patrol-log-header": "Ovdje se nalazi zapis patroliranih revizija.",
+       "patrol-log-header": "Ovo je zapisnik patroliranih izmjena.",
        "log-show-hide-patrol": "$1 zapis patroliranja",
        "log-show-hide-tag": "$1 zapisnik oznaka",
        "deletedrevision": "Obrisana stara revizija $1",
        "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-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja",
-       "logentry-patrol-patrol": "$1 je {{GENDER:$2|označio|označila}} izmjenu $4 stranice $3 pregledanim",
+       "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-managetags-activate": "$1 {{GENDER:$2|aktivirao|aktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivirao|deaktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
        "log-name-tag": "Zapisnik oznaka",
-       "log-description-tag": "Ova stranica prikazaju kad su korisnici dodali ili ukonili [[Special:Tags|oznake]] s pojedinih verzija ili zapisničkih unosa. Zapisnik ne prikazuje označavačke radnje ako su se dogodile prilikom uređivanja, brisanja ili slične radnje.",
+       "log-description-tag": "Ova stranica prikazuje kad su korisnici dodali ili ukonili [[Special:Tags|oznake]] s pojedinih verzija ili zapisničkih unosa. Zapisnik ne prikazuje označivačke radnje ako su se dogodile prilikom uređivanja, brisanja ili slične radnje.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 verziji $4 stranice $3",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 verziji $5 zapisničkog unosa $3",
        "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|uklonio|uklonila}} je {{PLURAL:$9|oznaku|oznake}} $8 sa verzije $4 stranice $3",
        "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|[$2 druga datoteka]|[$2 druge datoteke]}} na ovoj stranici sa istim sadržajem",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 neke druge datoteke]}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Dupla datoteka|Duple datoteke}} koje su već obrisane",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Dvojna datoteka|Dvojne datoteke}}",
+       "api-error-duplicate": "Već postoji {{PLURAL:$1|druga datoteka|druge datoteke}} na ovoj stranici sa 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.",
        "api-error-fetchfileerror": "Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.",
index 189d882..90f37de 100644 (file)
@@ -50,7 +50,8 @@
                        "Medol",
                        "Xavier Dengra",
                        "Pginer",
-                       "Eduardo Martinez"
+                       "Eduardo Martinez",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "nstab-template": "Plantilla",
        "nstab-help": "Ajuda",
        "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}}.",
        "nosuchspecialpage": "No es troba la pàgina especial que busqueu",
        "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 altre compte",
+       "createacct-another-submit": "Crea un compte",
        "createacct-benefit-heading": "{{SITENAME}} és feta per gent com tu.",
        "createacct-benefit-body1": "{{PLURAL:$1|edició|edicions}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgina|pàgines}}",
        "mergehistory-go": "Mostra les edicions que es poden fusionar",
        "mergehistory-submit": "Fusiona les revisions",
        "mergehistory-empty": "No pot fusionar-se cap revisió.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisió|revisions}} de [[:$1]] s'han fusionat amb èxit a [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisió|revisions}} de $1 s'han fusionat amb èxit 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-no-source": "La pàgina d'origen $1 no existeix.",
        "recentchangeslinked-summary": "Aquesta llista reflecteix els canvis recents a les pàgines enllaçades des d'una pàgina concreta (o als membres d'una categoria concreta).\nLes pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en <strong>negreta</strong>.",
        "recentchangeslinked-page": "Nom de la pàgina:",
        "recentchangeslinked-to": "Mostra els canvis de les pàgines enllaçades amb la pàgina donada",
+       "recentchanges-page-added-to-category": "[[:$1]] afegida a la categoria",
+       "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",
        "upload": "Carregueu un fitxer",
        "uploadbtn": "Carrega un fitxer",
        "reuploaddesc": "Torna al formulari per apujar.",
        "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-dialog-error": "S’ha produït un error",
-       "upload-dialog-warning": "S'ha produït un avís",
        "upload-dialog-button-cancel": "Cancel·la",
        "upload-dialog-button-done": "Fet",
        "upload-dialog-button-save": "Desa",
        "upload-dialog-button-upload": "Carrega",
-       "upload-dialog-label-select-file": "Seleccioneu fitxer",
-       "upload-dialog-label-infoform-title": "Detalls",
-       "upload-dialog-label-infoform-name": "Nom",
-       "upload-dialog-label-infoform-description": "Descripció",
-       "upload-dialog-label-usage-title": "Ús",
-       "upload-dialog-label-usage-filename": "Nom del fitxer",
+       "upload-process-error": "S’ha produït un error",
+       "upload-process-warning": "S'ha produït un avís",
+       "upload-form-label-select-file": "Seleccioneu fitxer",
+       "upload-form-label-infoform-title": "Detalls",
+       "upload-form-label-infoform-name": "Nom",
+       "upload-form-label-infoform-description": "Descripció",
+       "upload-form-label-usage-title": "Ús",
+       "upload-form-label-usage-filename": "Nom del fitxer",
        "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.",
        "filerevert-legend": "Reverteix el fitxer",
        "filerevert-intro": "Esteu revertint '''[[Media:$1|$1]]''' a la [$4 versió de  $3, $2].",
        "filerevert-comment": "Motiu:",
-       "filerevert-defaultcomment": "S'ha revertit a la versió com de $2, $1",
+       "filerevert-defaultcomment": "S'ha revertit a la versió com de $2, $1 ($3)",
        "filerevert-submit": "Reverteix",
        "filerevert-success": "S'ha revertit '''[[Media:$1|$1]]''' a la [$4 versió de $3, $2].",
        "filerevert-badversion": "No hi ha cap versió local anterior d'aquest fitxer amb la marca horària que es proporciona.",
        "undeletepage": "Mostra i restaura pàgines esborrades",
        "undeletepagetitle": "'''A continuació teniu revisions eliminades de [[:$1]]'''.",
        "viewdeletedpage": "Visualitza les pàgines eliminades",
-       "undeletepagetext": "{{PLURAL:|S'ha eliminat la pàgina següent, però encara és a l'arxiu i pot ser restaurada|S'han eliminat les $1 pàgines següents, però encara són a l'arxiu i poden ser restaurades}}.\nL'arxiu pot ser netejat periòdicament.",
+       "undeletepagetext": "{{PLURAL:$1|S'ha eliminat la pàgina següent, però encara és a l'arxiu i pot ser restaurada|S'han eliminat les $1 pàgines següents, però encara són a l'arxiu i poden ser restaurades}}.\nL'arxiu pot ser netejat periòdicament.",
        "undelete-fieldset-title": "Restaura revisions",
        "undeleteextrahelp": "Per a restaurar l'historial sencer de la pàgina, deixeu totes les caselles sense seleccionar i feu clic a '''''{{int:undeletebtn}}'''''.\nPer a realitzar una restauració selectiva, marqueu les caselles que corresponguin a les revisions que voleu recuperar, i feu clic a '''''{{int:undeletebtn}}'''''.",
        "undeleterevisions": "{{PLURAL:$1|Una revisió suprimida|$1 revisions suprimides}}",
        "movepagetext": "Amb el formulari següent reanomenareu una pàgina, movent tot el seu historial al nou nom.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol.\nPodeu actualitzar automàticament les redireccions que apuntin al títol original.\nSi no ho feu, assegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nSerà de la vostra responsabilitat verificar que els enllaços segueixin apuntant cap a on se suposa que ho han de fer.\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ó sense 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ó!'''\nAçò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; \nassegureu-vos d'entendre les conseqüències que comporta abans de seguir endavant.",
        "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.",
-       "movearticle": "Reanomena la pàgina",
        "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.",
        "movenologintext": "Heu de ser un usuari registrat i estar [[Special:UserLogin|dintre d'una sessió]]\nper reanomenar una pàgina.",
        "api-error-badaccess-groups": "No teniu permís per a carregar fitxers en aquest wiki.",
        "api-error-badtoken": "Error intern: argument incorrecte.",
        "api-error-copyuploaddisabled": "Les càrregues via URL estan desactivades en aquest servidor.",
-       "api-error-duplicate": "Ja hi ha {{PLURAL:$1|[$2 un altre fitxer]|[$2 altres fitxers]}} en aquest lloc web amb el mateix contingut.",
-       "api-error-duplicate-archive": "Aquí ja hi ha hagut {{PLURAL:$1|[$2 un altre fitxer]|[$2 altres fitxers]}} amb el mateix contingut, i {{PLURAL:$1|va ser esborrat|varen ser esborrats}}.",
-       "api-error-duplicate-archive-popup-title": "Duplica {{PLURAL:$1|el fitxer|els fitxers}} que ja s'han eliminat",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fitxer duplicat|Fitxers duplicats}}",
+       "api-error-duplicate": "Ja hi ha {{PLURAL:$1|un altre fitxer|altres fitxers}} en aquest lloc web amb el mateix contingut.",
+       "api-error-duplicate-archive": "Aquí ja hi ha hagut {{PLURAL:$1|un altre fitxer|altres fitxers}} amb el mateix contingut, i {{PLURAL:$1|va ser esborrat|varen ser esborrats}}.",
        "api-error-empty-file": "El fitxer que heu tramès està buit.",
        "api-error-emptypage": "No es permet la creació de pàgines noves en blanc.",
        "api-error-fetchfileerror": "Error intern: quelcom no ha funcionat en accedir al fitxer.",
index 8350f12..0029b49 100644 (file)
        "protect": "Ларъяр",
        "protect_change": "хийца",
        "protectthispage": "Ларъе хӀара агӀо",
-       "unprotect": "Ð\93Ó\80аÑ\80оллеÑ\85 ÐºÑ\8aаÑ\81Ñ\82а",
-       "unprotectthispage": "Ð\93Ó\80аÑ\80оллеÑ\85 ÐºÑ\8aаÑ\81Ñ\82а",
+       "unprotect": "Ð\9bаÑ\80Ñ\8aÑ\8fÑ\80 Ñ\85ийÑ\86аÑ\80",
+       "unprotectthispage": "ХийÑ\86а Ñ\85Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80она Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80",
        "newpage": "Керла агӀонаш",
        "talkpage": "Дийцаре йилла хӀара агӀо",
        "talkpagelinktext": "Дийцаре",
        "nstab-template": "Кеп",
        "nstab-help": "ГӀо",
        "nstab-category": "Категори",
+       "mainpage-nstab": "Коьрта агӀо",
        "nosuchaction": "Ишта дийриг дац",
        "nosuchactiontext": "ДӀаязйина URL нийса яц.\nURL язъеш гӀалат даьлла хила мега.\nИза кхин {{SITENAME}} пороектехь гӀалат хила мега.",
        "nosuchspecialpage": "Иштта белхан агӀо яц",
        "readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
        "protectedpagewarning": "'''ДӀахьедар. ХӀара агӀо ларйина ю хийцам цабайта, иза хийца я нисъян а бакъо йолуш куьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тӀаьххьара бина болу хийцамна тептар чура:",
        "semiprotectedpagewarning": "'''ДӀахьедо.''' ХӀара агӀо ларйина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьххьаралера дӀаязбина хаам:",
-       "cascadeprotectedwarning": "<div id=\"cascadeprotectedwarning\" style=\"border:1px solid #ee0; padding:10px; background:#ffa; margin-bottom:1em\">[[file:Padlock.svg|left|25px|ДовгӀа|link=]]\nХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:</div>",
+       "cascadeprotectedwarning": "<strong>ДӀахьедар:</strong> ХӀара агӀо таян бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча {{PLURAL:$1|1=и агӀо латийна кхечу агӀонашца|и агӀо латийна кхечу агӀонашца}} хӀоттделлачу ларйиначух:",
        "templatesused": "{{PLURAL:$1|1=Кеп, лелош ю|Кепаш, лелош ю}} хӀокху агӀон башхонца:",
        "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелойлу}} оцу хьалх хьожучу агӀонца:",
        "templatesusedsection": "ХӀокху декъан чохь {{PLURAL:$1|1=лелош йолу кеп|лелош йолу кепаш}}:",
        "mergehistory-go": "Гайта цхьаьнатухуш долу нисдарш",
        "mergehistory-submit": "Цхьаьнатоха нисдарш",
        "mergehistory-empty": "Цхьаьнатоха нисдарш цакарий.",
-       "mergehistory-success": "$3 {{PLURAL:$3|нисдар|нисдарш}} [[:$1]] чура кхиамца {{PLURAL:$3|дехьа даьккхина|дехьа дехна}} [[:$2]] чу.",
+       "mergehistory-done": "$3 {{PLURAL:$3|нисдар|нисдарш}} $1 чура кхиамца {{PLURAL:$3|дехьа даьккхина|дехьа дехна}} [[:$2]] чу.",
        "mergehistory-fail": "АгӀонийн истореш вовшахтоха цаделира, дехар до агӀона параметаршка а, хене а хьажа.",
        "mergehistory-no-source": "Коьрта агӀо «$1» яц.",
        "mergehistory-no-destination": "Ӏалашон агӀо «$1» яц.",
        "editusergroup": "Хийца декъашхочун бакъо",
        "editinguser": "Хийца декъашхочуьна бакъо '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
        "userrights-editusergroup": "Хийца декъашхочун бакъо",
-       "saveusergroups": "Ð\94екÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð±Ð°ÐºÑ\8aонаÑ\88 Ó\8fалаÑ\88ян",
+       "saveusergroups": "Ð\94екÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð±Ð°ÐºÑ\8aонаÑ\88 Ó\80алаÑ\88Ñ\8aян",
        "userrights-groupsmember": "Декъашхо:",
        "userrights-groupsmember-auto": "Бакъонашан тоба:",
        "userrights-groups-help": "Хьона хийца ло декъашхочун бакъонаш.\n* Бакъона цӀера юххехь билгало елахь, цуна и бакъо йолуш ю.\n* Билгало яцахь — декъашхочун и бакъо яц.\n* Знако * билгала до ахьа бакъо еллачул тӀаьхьа хьона и дӀаяккха цалуш хилар.",
        "upload-file-error": "Чоьхьара гӀалат",
        "upload-misc-error": "Чуяккхаран цадевза гӀалат",
        "upload-http-error": "Даьлла гӀалат HTTP: $1",
+       "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 яц.",
        "movepagetext": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман тептар кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажорг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\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'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
        "movepagetalktext": "ТӀе хӀоьттина йолу дийцаре агӀо ишта цӀе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''\n\n*Еса йоцу дийцаре агӀо йолуш ю оцу цӀарца я\n*Ахьа къастаман харжам цабиняхь а къастам хӀотточехь.\n\nИшта чу ханчохь, ахьа дехьа яккха йезар ю я куьйга хӀоттайар, нагахь иза хьашт ялахь.",
-       "movearticle": "ЦӀе хийца агӀон",
        "moveuserpage-warning": "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
        "movecategorypage-warning": "<strong>ДӀахьедар:</strong> Хьо категорин агӀон цӀе хийца гӀерта. Дехар до, терго йе, хӀокху агӀона бен цӀе хуьйцур яц, шира чу категори чура массо агӀонаш керла категори чу йохур <em>яц</em>.",
        "movenologintext": "АгӀона цӀе хийца [[Special:UserLogin|системин чугӀо]].",
        "tooltip-ca-viewsource": "ХӀара агӀо ларъеш ю, хийцамаш ца-байта, амма хьо хьажа а, копи яккхан а мегар ду",
        "tooltip-ca-history": "ХӀокху агӀона хийцамаш болу тептар",
        "tooltip-ca-protect": "Ларъе агӀо хийцамаш цабайта",
-       "tooltip-ca-unprotect": "Ð\94lадаккÑ\85а Ñ\85lокÑ\85Ñ\83 Ð°Ð³lонна Ð´Ð¾Ð»Ñ\83 Ð³Ð°Ñ\80олла",
+       "tooltip-ca-unprotect": "ХийÑ\86а Ñ\85Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80она Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80",
        "tooltip-ca-delete": "ДӀаяккха хӀара агӀо",
        "tooltip-ca-move": "АгӀон цӀе хийца",
        "tooltip-ca-watch": "ТӀетоха хӀара агӀо сан тергаме могӀанан юкъа",
        "watchlistedit-raw-submit": "МогӀам Ӏалашбар",
        "watchlistedit-raw-done": "Хьан тергаман могӀам Ӏалашбина",
        "watchlistedit-raw-added": "{{PLURAL:$1|ТӀетоьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|ДӀадаьккхина}} $1 {{PLURAL:$1|дӀаяздар}}:",
        "watchlistedit-clear-title": "Тергаман могӀам дӀацӀанбар",
        "watchlistedit-clear-legend": "Тергаман могӀам дӀацӀанбан",
        "watchlistedit-clear-explain": "Хьан тергаман могӀам чура массо дӀяздарш дӀадаьра ду",
        "watchlistedit-clear-titles": "Корта:",
        "watchlistedit-clear-submit": "Тергаман могӀам дӀацӀанбан (иза сацадан лурдац)",
        "watchlistedit-clear-done": "Хьан тергаман могӀам дӀацӀанбина",
-       "watchlistedit-clear-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|ДӀадаьккхина}} $1 {{PLURAL:$1|дӀаяздар}}:",
        "watchlistedit-too-many": "Кхузахь гайта тӀехь дукха агӀонаш ю.",
        "watchlisttools-clear": "Тергаман могӀам дӀацӀанбан",
        "watchlisttools-view": "МогӀам чура агӀонийн хийцамаш",
        "logentry-delete-restore": "$1 {{GENDER:$2|меттахӀоттайина|меттахӀоттайина}} агӀо $3",
        "logentry-delete-event": "$1 {{GENDER:$2|хийцина}} гуш хилар {{PLURAL:$5|1=$5 дӀаяздаран|$5 дӀаяздаршан}} тептаран → $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|хийцина}} {{PLURAL:$5|1=$5 верси|$5 версеш}} гуш хилар $3: $4 агӀорахь",
-       "logentry-delete-event-legacy": "$1 {{GENDER:$2|хийцина}} $3 агӀона тептаран дӀаяздарш гуш хилар",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|хийцина}} $3 тептаран дӀаяздарш гуш хилар",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|хийцина}} $3 агӀона верси гуш хилар",
        "logentry-suppress-delete": "$1 {{GENDER:$2|дӀаяьккхина}} агӀо $3",
        "logentry-suppress-event": "$1 къайлаха {{GENDER:$2|хийцина}} тептаран {{PLURAL:$5|1=$5 дӀаяздар|$5 дӀаяздарш}} гуш хилар $3: $4 чохь",
        "feedback-thanks-title": "Баркалла!",
        "searchsuggest-search": "Лахар",
        "searchsuggest-containing": "чуьраниг…",
-       "api-error-duplicate": "Иштта чулацам болу {{PLURAL:$1|1=[$2 кхин файл]|[$2 кхин файлаш]}} йолуш ю",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|1=Файлан|Файлийн}} дубликат.",
+       "api-error-duplicate": "Иштта чулацам болу {{PLURAL:$1|кхин файл|кхин файлаш}} йолуш ю.",
        "api-error-empty-file": "Ахьа яхьийтина файл еса ю.",
        "api-error-mustbeposted": "Чоьхьара гӀалат: дехаро хьехам схьабоьху HTTP POST.",
        "api-error-noimageinfo": "Кхиамца чуяьккхина, амма серверо файлахь лаьцна цхьаа хаам битина бац.",
index 9e309af..ed28fb6 100644 (file)
        "mergehistory-go": "Na'annok i mandañayon na tinilaika siha",
        "mergehistory-submit": "Na'daña i ribision siha",
        "mergehistory-empty": "Tåya' mandañayon na ribision siha.",
-       "mergehistory-success": "Munhåyan muna'daña [[:$2]] yan i $3 {{PLURAL:$3|na ribision|na ribision siha}} gi [[:$1]].",
+       "mergehistory-done": "Munhåyan muna'daña [[:$2]] yan i $3 {{PLURAL:$3|na ribision|na ribision siha}} gi $1.",
        "mergehistory-fail": "Ti siña muna'daña i historia siha, pot fabot ripåra ta'lo i påhina yan i ora pine'lo.",
        "mergehistory-no-source": "Tåya' na påhina mo'na $1.",
        "mergehistory-no-destination": "Tåya' na påhina destinasion $1.",
        "listredirects": "Na'lista eyu i manmadirihi ta'lo",
        "unusedtemplates": "Plantiyas siha ti ma'usa",
        "randompage": "Maseha håfa na påhina",
+       "randomincategory-submit": "Hånao",
        "randomredirect": "Muna'dirihi maseha manu guatu",
        "doubleredirects": "Mandoble na inachetton ma'dirihi siha",
        "brokenredirects": "Manmayulang na muna'dirihi siha",
        "blocklogentry": "ha chomma' [[$1]] ya u funhayan gi $2 $3",
        "movepagetext": "U'usa i sigiente fotma para u matulaika i na'an i påhina, tumulaika historia-ña para i nuebu na nå'an.\nPara u madirihi i titulon orihinåt para i nuebu.\nSiña ha' un tulaika i påhina siha ni manmadirihi guatu i titulon orihinåt.\nYanggen munga hao, na'seguro na un chek i pahinan madirihi [[Special:DoubleRedirects|doble]] pat [[Special:BrokenRedirects|manmayamak]] siha.\nHågu ha' responsible muna'seguro na manmakontinua para i destinasion-ñiha i inachetton siha.\n\nFanapunta fan na anggen guåha esta otru påhina mafa'na'an i titulo nuebu, '''ti''' para makånya i påhina, solu tåya' ha' gi sanhalom destinasion pat tåya' historia-ña tinilika eyu ni mana'dirihi.\nKumeke'ilek-ña este na siña un tulaika tatte i na'an i påhina an guåha linachi-mu, ya ti siña un na'overwrite i påhina siha ni manggaige esta.\n\n'''Adahi!'''\nFa'na'an tinilaika dinidok yan ti maekspekta sempre anggen mageftungo' i påhina;\nna'seguro fan na un komprende i humuyongña i bidada-mu sempre.",
        "movepagetalktext": "Para u kånya i påhinan kombetsasion ni i påhina \"solo:\"\n*Guåha esta un påhinan kombetsasion ni parehu i na'an-ña, pat\n*Un funas i matka gi sanpapa' na kahon.\n\nPot sienkasu i hilo', nesesario ha' na un kånya pat un na'daña i påhina yanggen malago'-mu.",
-       "movearticle": "Kånya i påhina:",
        "newtitle": "Para i nuebu na titulo:",
        "move-watch": "Pulan este na påhina",
        "movepagebtn": "Kånya i påhina",
index 48c7193..2b75231 100644 (file)
        "mergehistory-go": "دەستکارییەکانی شیاوی کردنەیەک نیشان بدە",
        "mergehistory-submit": "پێداچوونەوەکان بکە یەک",
        "mergehistory-empty": "ناتواندرێت هیچ یەک لە پێداچوونەوەکان بخرێتە ‌سەریەک.",
-       "mergehistory-success": "$3 {{PLURAL:$3|پێداچوونەوە}}ی [[:$1]] بە سەرکەوتوویی خرایە سەر [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|پێداچوونەوە}}ی $1 بە سەرکەوتوویی خرایە سەر [[:$2]].",
        "mergehistory-fail": "کردنەیەکی مێژوو جێبەجێ ناکرێ، تکایە دیسان پارامەترەکانی پەڕە و کات تاوتوێ بکە.",
        "mergehistory-no-source": "پەڕەی سەرچاوەی $1 بوونی نییە.",
        "mergehistory-no-destination": "پەڕەی مەبەستی $1 بوونی نییە.",
        "filerevert-legend": "پێچەوانەکردنەوەی پەڕگە",
        "filerevert-intro": "خەریکی پەڕگەی '''[[Media:$1|$1]]''' دەگەڕینیتەوە بۆ [$4 وەشانی $3، $2].",
        "filerevert-comment": "هۆکار:",
-       "filerevert-defaultcomment": "گەڕێندراوە بۆ وەشانی $2، $1",
+       "filerevert-defaultcomment": "گەڕێندراوە بۆ وەشانی $2، $1 ($3)",
        "filerevert-submit": "گەڕاندنەوە",
        "filerevert-success": "'''[[Media:$1|$1]]''' گەڕێندراوەتەوە بۆ [$4 وەشانی $3، $2].",
        "filerevert-badversion": "وەشانێکی پێشووی ئەم  پەڕگە بەو کاتە ڕاچاوکراوه ‌نەدۆزرایەوە.",
        "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ئەمە بزانە کە پەڕەکە <strong>ناگوازرێتەوە</strong> ئەگەر پێشتر پەڕەیەک بە ناوە نوێکەوە ھەبێت، مەگەر ئەوەی کە ڕەوانەکەرێک بێت و مێژووی دەستکاریی پێشووی نەبێت.\nئەمە یانی ئەگەر ھەڵەیەک بکەیت دەتوانی ناوی پەڕەکە بگۆڕییەوە بۆ ناوی پێشووی، و ناتوانی بیخەیتە جێگەی پەڕەیەک کە ئێستا ھەیە.\n\n<strong>ھۆشدار!</strong>\nئەمە دەتوانێت گۆڕانێکی زۆر نابەجێ و چاوەڕوان‌نەکراو بێت بۆ پەڕەیەکی بەناوبانگ؛\nتکایە پێش گۆڕینی ناو دڵنیا بە بیرت لە ئاکامەکەی کردووەتەوە.",
        "movepagetalktext": "پەڕەی لێدوانی پەیوەندیدار بە شێوەی خۆگەڕ لەگەڵی دەگوازرێتەوە، <strong>مەگەر:</strong>\n* پەڕەیەکی لێدوانی ناواڵا پێشتر لە ژێر ناوە نوێکەدا ھەبێت، یان\n* ئەو چوارچێوەی ژێرەوە لێنەدراو بکەیت.\n\nلەو دۆخانەدا، ئەگەر بتەوێت دەبێ بە دەستی پەڕەکە بگوازیتەوە یان تێکەڵیان بکەیت.",
-       "movearticle": "ئەم پەڕەیە بگوازەوە:",
        "moveuserpage-warning": "<strong>ھۆشدار:</strong> تۆ خەریکی گواستنەوەی پەڕەیەکی بەکارھێنەری. تکایە ئەمە لەبەرچاو بگرە تەنیا پەڕەکە دەگوازرێتەوە و ناوی بەکارھێنەر <em>ناگۆڕدرێ</em>.",
        "movecategorypage-warning": "<strong>ھۆشدار:</strong> تۆ خەریکی گواستنەوەی پەڕەی پۆلی. تکایە ئەمە لەبەرچاو بگرە تەنیا پەڕەکە دەگوازرێتەوە و پەڕەکانی ناو پۆلە کۆنەکە <em>ناچێتە</em> ناو پۆلە نوێکەوە.",
        "movenologintext": "بۆ گواستنەوەی پەڕەیەک، ئەشێ ببی بە ئەندام و [[Special:UserLogin|لە ژوورەوە]] بیت.",
index aee7150..3c35360 100644 (file)
        "nstab-template": "Šablona",
        "nstab-help": "Nápověda",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Hlavní strana",
        "nosuchaction": "Neznámý úkon",
        "nosuchactiontext": "Činnost („action“) uvedená v URL je neplatná.\nZřejmě jste se při zadávání adresy překlepli nebo jste přešli na chybný odkaz.\nMůže se ale jednat také o chybu v softwaru {{GRAMMAR:2sg|{{SITENAME}}}}.",
        "nosuchspecialpage": "Neexistující speciální stránka",
        "createacct-captcha": "Bezpečnostní kontrola",
        "createacct-imgcaptcha-ph": "Opište výše zobrazený text",
        "createacct-submit": "Vytvořit účet",
-       "createacct-another-submit": "Vytvořit jiný účet",
+       "createacct-another-submit": "Vytvořit účet",
        "createacct-benefit-heading": "{{grammar:4sg|{{SITENAME}}}} tvoří lidé jako vy.",
        "createacct-benefit-body1": "{{PLURAL:$1|editace|editace|editací}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stránka|stránky|stránek}}",
        "passwordreset-emailsent": "E-mail pro získání nového hesla byl odeslán.",
        "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 e-mailové adresy",
-       "changeemail-text": "Vyplněním tohoto formuláře si změníte e-mailovou adresu. Pro potvrzení změny budete muset zadat své heslo.",
+       "changeemail": "Změna nebo odstranění e-mailové adresy",
+       "changeemail-text": "Vyplněním tohoto formuláře si změníte e-mailovou adresu. Pro potvrzení změny budete muset zadat své heslo. Pokud byste chtěli úplně odstranit e-mailovou adresu ze svého účtu, nechte při vyplňování formuláře pole pro novou adresu prázdné.",
        "changeemail-no-info": "K této stránce mají přímý přístup jen přihlášení uživatelé.",
        "changeemail-oldemail": "Stávající e-mailová adresa:",
        "changeemail-newemail": "Nová e-mailová adresa:",
+       "changeemail-newemail-help": "Toto pole by mělo zůstat prázdné, pokud chcete odstranit svou e-mailovou adresu. Pokud bude e-mailová adresa odstraněná, nebudete si moct obnovit zapomenuté heslo a přijímat e-maily z této wiki.",
        "changeemail-none": "(žádná)",
        "changeemail-password": "Vaše heslo do {{gender:2sg|{{SITENAME}}}}:",
        "changeemail-submit": "Změnit e-mail",
        "changeemail-throttled": "Provedli jste příliš mnoho pokusů o přihlášení.\nČekejte prosím $1 a zkuste to znovu.",
+       "changeemail-nochange": "Zadejte prosím odlišnou e-mailovou adresu.",
        "resettokens": "Reinicializace klíčů",
        "resettokens-text": "Na této stránce můžete reinicializovat klíče, které umožňují přístup k jistým soukromým údajům spojeným s vaším účtem.\n\n{{GENDER:|Měl|Měla|Měli}} byste to provést v případě, že jste je omylem někomu {{GENDER:|prozradil|prozradila|prozradili}}, nebo byl váš účet narušen.",
        "resettokens-no-tokens": "Neexistují žádné klíče, které by bylo možno reinicializovat.",
        "permissionserrorstext-withaction": "Z {{PLURAL:$1|následujícího důvodu|následujících důvodů}} nemáte oprávnění $2:",
        "recreate-moveddeleted-warn": "'''Upozornění: Pokoušíte se znovuzaložit stránku, která byla v minulosti smazána.'''\n\nZvažte, zda je vhodné v editaci této stránky pokračovat.\nNíže vidíte soupis přesunů a smazání této stránky:",
        "moveddeleted-notice": "Tato stránka byla smazána.\nPodrobnosti si můžete prohlédnout v níže zobrazeném seznamu provedených přesunů a smazání této stránky.",
+       "moveddeleted-notice-recent": "Omlouváme se, ale tato stránka byla nedávno (v posledních 24 hodinách) smazána. Pro úplnost je níže zobrazen soupis přesunů a smazání této stránky.",
        "log-fulllog": "Zobrazit všechny záznamy",
        "edit-hook-aborted": "Editace byla bez bližšího vysvětlení zrušena přípojným bodem.",
        "edit-gone-missing": "Stránku se nepodařilo aktualizovat.\nZřejmě byla smazána.",
        "mergehistory-go": "Zobrazit slučitelné editace",
        "mergehistory-submit": "Sloučit verze",
        "mergehistory-empty": "Nelze sloučit žádnou verzi.",
-       "mergehistory-success": "$3 {{PLURAL:$3|verze|verze|verzí}} stránky [[:$1]] {{PLURAL:$3|byla úspěšně sloučena|byly úspěšně sloučeny|bylo úspěšně sloučeno}} do stránky [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|verze|verze|verzí}} stránky $1 {{PLURAL:$3|byla úspěšně sloučena|byly úspěšně sloučeny|bylo úspěšně sloučeno}} do stránky [[:$2]].",
        "mergehistory-fail": "Sloučení historií nelze provést. Překontrolujte zadané stránky a jejich historii.",
        "mergehistory-fail-toobig": "Nelze provést sloučení historie, protože by se přesouvalo více revizí, než je limit $1.",
        "mergehistory-no-source": "Zdrojová stránka $1 neexistuje.",
        "prefs-watchlist-token": "Klíč k seznamu sledovaných stránek:",
        "prefs-misc": "Různé",
        "prefs-resetpass": "Změnit heslo",
-       "prefs-changeemail": "Změnit e-mail",
+       "prefs-changeemail": "Změnit nebo odstranit e-mailovou adresu",
        "prefs-setemail": "Nastavit e-mailovou adresu",
        "prefs-email": "Nastavení e-mailu",
        "prefs-rendering": "Vzhled",
        "group-bot": "Boti",
        "group-sysop": "Správci",
        "group-bureaucrat": "Byrokraté",
-       "group-suppress": "Dohlížitelé",
+       "group-suppress": "Utajovatelé",
        "group-all": "(všichni)",
        "group-user-member": "{{GENDER:$1|uživatel|uživatelka|uživatel}}",
        "group-autoconfirmed-member": "automaticky {{GENDER:$1|schválený uživatel|schválená uživatelka|schválený uživatel}}",
        "group-bot-member": "{{GENDER:$1|bot|botka|bot}}",
        "group-sysop-member": "{{GENDER:$1|správce|správkyně|správce}}",
        "group-bureaucrat-member": "{{GENDER:$1|byrokrat|byrokratka|byrokrat}}",
-       "group-suppress-member": "{{GENDER:$1|dohlížitel|dohlížitelka|dohlížitel}}",
+       "group-suppress-member": "{{GENDER:$1|utajovatel|utajovatelka|utajovatel}}",
        "grouppage-user": "{{ns:project}}:Uživatelé",
        "grouppage-autoconfirmed": "{{ns:project}}:Automaticky schválení uživatelé",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:Správci",
        "grouppage-bureaucrat": "{{ns:project}}:Byrokraté",
-       "grouppage-suppress": "{{ns:project}}:Dohlížitelé",
+       "grouppage-suppress": "{{ns:project}}:Utajovatelé",
        "right-read": "Čtení stránek",
        "right-edit": "Editace stránek",
        "right-createpage": "Zakládání stránek (které nejsou diskusní)",
        "recentchangeslinked-summary": "Níže je seznam nedávných změn stránek odkazovaných ze zadané stránky (nebo patřících do dané kategorie). Vaše [[Special:Watchlist|sledované stránky]] jsou '''zvýrazněny'''.",
        "recentchangeslinked-page": "Název stránky:",
        "recentchangeslinked-to": "Zobrazit změny na stránkách odkazujících na zadanou stránku",
+       "recentchanges-page-added-to-category": "Stránka [[:$1]] zařazena do kategorie",
+       "recentchanges-page-added-to-category-bundled": "Stránka [[:$1]] a {{PLURAL:$2|jedna další zařazeny|$2 další zařazeny|$2 dalších zařazeno}} do kategorie",
+       "recentchanges-page-removed-from-category": "Stránka [[:$1]] vyřazena z kategorie",
+       "recentchanges-page-removed-from-category-bundled": "Stránka [[:$1]] a {{PLURAL:$2|jedna další vyřazeny|$2 další vyřazeny|$2 dalších vyřazeno}} z kategorie",
        "upload": "Načíst soubor",
        "uploadbtn": "Načíst soubor",
        "reuploaddesc": "Zrušit načítání a vrátit se do formuláře.",
        "upload-http-error": "Došlo k chybě HTTP: $1",
        "upload-copy-upload-invalid-domain": "Načítání kopírováním není dostupné z této domény.",
        "upload-dialog-title": "Načtení souboru",
-       "upload-dialog-error": "Došlo k chybě",
-       "upload-dialog-warning": "Objevilo se upozornění",
        "upload-dialog-button-cancel": "Storno",
        "upload-dialog-button-done": "Hotovo",
        "upload-dialog-button-save": "Uložit",
        "upload-dialog-button-upload": "Načíst",
-       "upload-dialog-label-select-file": "Výběr souboru",
-       "upload-dialog-label-infoform-title": "Podrobnosti",
-       "upload-dialog-label-infoform-name": "Název",
-       "upload-dialog-label-infoform-description": "Popis",
-       "upload-dialog-label-usage-title": "Použití",
-       "upload-dialog-label-usage-filename": "Jméno souboru",
+       "upload-process-error": "Došlo k chybě",
+       "upload-process-warning": "Objevilo se upozornění",
+       "upload-form-label-select-file": "Výběr souboru",
+       "upload-form-label-infoform-title": "Podrobnosti",
+       "upload-form-label-infoform-name": "Název",
+       "upload-form-label-infoform-description": "Popis",
+       "upload-form-label-usage-title": "Použití",
+       "upload-form-label-usage-filename": "Jméno souboru",
        "backend-fail-stream": "Soubor $1 nelze streamovat.",
        "backend-fail-backup": "Soubor $1 nelze zazálohovat.",
        "backend-fail-notexists": "Soubor $1 neexistuje.",
        "filerevert-legend": "Vrátit zpět soubor",
        "filerevert-intro": "Vracíte zpět '''[[Media:$1|$1]]''' na [$4 verzi z $3 $2].",
        "filerevert-comment": "Důvod:",
-       "filerevert-defaultcomment": "Navrácena verze nahraná v $2 dne $1.",
+       "filerevert-defaultcomment": "Návrat na verzi z $2, $1 ($3)",
        "filerevert-submit": "Vrátit zpět",
        "filerevert-success": "Soubor '''[[Media:$1|$1]]''' byl vrácen zpět na [$4 verzi z $3 $2].",
        "filerevert-badversion": "Není dostupná předchozí verze tohoto souboru s odpovídající časovou značkou.",
        "nopagetext": "Cílová stránka, kterou jste specifikovali, neexistuje.",
        "pager-newer-n": "{{PLURAL:$1|1 novější|$1 novější|$1 novějších}}",
        "pager-older-n": "{{PLURAL:$1|1 starší|$1 starší|$1 starších}}",
-       "suppress": "Dozor",
+       "suppress": "Utajit",
        "querypage-disabled": "Tato speciální stránka je z výkonnostních důvodů vypnuta.",
        "apihelp": "Nápověda k API",
        "apihelp-no-such-module": "Modul „$1“ nebyl nalezen.",
        "deletepage": "Smazat stránku",
        "confirm": "Potvrdit",
        "excontent": "obsah byl: „$1“",
-       "excontentauthor": "obsah byl: „$1“ (a jediným přispěvatelem byl „[[Special:Contributions/$2|$2]]“)",
+       "excontentauthor": "obsah byl: „$1“ a jediným přispěvatelem byl „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]])",
        "exbeforeblank": "obsah před vyprázdněním byl: „$1“",
        "delete-confirm": "Smazání stránky „$1“",
        "delete-legend": "Smazat",
        "unblockip": "Odblokovat uživatele",
        "unblockiptext": "Tímto formulářem je možno obnovit právo blokované IP adresy či uživatele opět přispívat do {{grammar:2sg|{{SITENAME}}}}.",
        "ipusubmit": "Odblokovat",
-       "unblocked": "{{GENDER:$1|||Uživatel}} [[User:$1|$1]] {{GENDER:$1|byl odblokován|byla odblokována|byl odblokován}}.",
+       "unblocked": "{{GENDER:$1|[[User:$1|$1]]|[[User:$1|$1]]|Uživatel [[User:$1|$1]]}} {{GENDER:$1|byl odblokován|byla odblokována|byl odblokován}}.",
        "unblocked-range": "Rozsah $1 byl odblokován.",
        "unblocked-id": "Blok $1 byl zrušen.",
        "unblocked-ip": "Adresa [[Special:Contributions/$1|$1]] byla odblokována.",
        "move-page-legend": "Přesunout stránku",
        "movepagetext": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nPřesměrování na původní název můžete nechat aktualizovat automaticky.\nPokud nenecháte, nezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe vaší zodpovědností zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna;\npředtím, než změnu provedete, se ujistěte, že chápete důsledky svého kroku.",
        "movepagetext-noredirectfixer": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nNezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe vaší zodpovědností zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka prázdná nebo je přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna; předtím, než změnu provedete, se prosím ujistěte, že chápete důsledky svého kroku.",
-       "movepagetalktext": "Přidružená diskusní stránka, existuje-li, bude automaticky přesunuta společně se stránkou, '''pokud:'''\n* dosud neexistuje neprázdná diskusní stránka pod novým jménem a\n* nezrušíte křížek ve formuláři.\n\nV těchto případech musíte přesunout nebo sloučit stránky manuálně, přejete-li si to.",
-       "movearticle": "Přesunout stránku:",
+       "movepagetalktext": "Pokud zaškrtnete toto pole, přidružená diskusní stránka bude automaticky přesunuta na nový název, leda by tam již neprázdná diskusní stránka existovala.\n\nV takovém případě musíte stránky přesunout nebo sloučit ručně, přejete-li si to.",
        "moveuserpage-warning": "'''Upozornění:''' Chystáte se přesunout uživatelskou stránku. Uvědomte si prosím, že bude přesunuta pouze tato stránka, ale uživatel ''nebude'' přejmenován.",
        "movecategorypage-warning": "<strong>Upozornění:</strong> Chystáte se přesunout stránku kategorie. Uvědomte si, že bude přesunuta pouze tato stránka a že žádné stránky v původní kategorii <em>nebudou</em> do nové překategorizovány.",
        "movenologintext": "Pro přesouvání stránek se musíte [[Special:UserLogin|přihlásit]].",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|založil|založila}} uživatelský účet $3, heslo bylo posláno e-mailem",
        "logentry-newusers-autocreate": "Automaticky byl {{GENDER:$2|založen}} účet $1",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|přesunul|přesunula}} nastavení zámků ze stránky $4 na stránku $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|odemknul|odemknula}} stránku $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|zamknul|zamknula}} stránku $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zamknul|zamknula}} stránku $3 $4 [kaskádovým zámkem]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|změnil|změnila}} úroveň ochrany stránky $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|změnil|změnila}} úroveň ochrany stránky $3 $4 [kaskádový zámek]",
        "logentry-rights-rights": "$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách z $4 na $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|byl automaticky povýšen|byla automaticky povýšena}} z $4 na $5",
        "api-error-badaccess-groups": "Nemáte povoleno nahrávat soubory na tuto wiki.",
        "api-error-badtoken": "Vnitřní chyba: špatný token.",
        "api-error-copyuploaddisabled": "Načítání z URL je na tomto severu zakázáno.",
-       "api-error-duplicate": "Na této wiki již {{PLURAL:$1|existuje [$2 jiný soubor]|existují [$2 jiné soubory]}} se shodným obsahem.",
-       "api-error-duplicate-archive": "[$2 {{PLURAL:$1|Soubor|Soubory}}] se stejným obsahem již zde dříve {{PLURAL:$1|byl|byly}}, ale {{PLURAL:$1|byl smazán|byly smazány}}.",
-       "api-error-duplicate-archive-popup-title": "Duplicitní {{PLURAL:$1|soubor, který byl smazán|soubory, které byly smazány}}.",
-       "api-error-duplicate-popup-title": "Duplicitní {{PLURAL:$1|soubor|soubory}}.",
+       "api-error-duplicate": "Na této wiki již {{PLURAL:$1|existuje jiný soubor|existují jiné soubory}} se shodným obsahem.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Soubor|Soubory}} se stejným obsahem již zde dříve {{PLURAL:$1|byl|byly}}, ale {{PLURAL:$1|byl smazán|byly smazány}}.",
        "api-error-empty-file": "Načtený soubor je prázdný.",
        "api-error-emptypage": "Zakládání prázdných stránek není dovoleno.",
        "api-error-fetchfileerror": "Vnitřní chyba: došlo k chybě při stahování souboru.",
index e162552..ac321dd 100644 (file)
@@ -13,7 +13,8 @@
                        "Xxglennxx",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Tanlinellu cysylltiadau:",
        "mergehistory-go": "Dangos y golygiadau y gellir eu cyfuno",
        "mergehistory-submit": "Cyfuner y diwygiadau",
        "mergehistory-empty": "Ni ellir cyfuno unrhyw ddiwygiadau.",
-       "mergehistory-success": "Cyfunwyd $3 {{PLURAL:$3|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} o [[:$1]] yn llwyddiannus i'r dudalen [[:$2]].",
+       "mergehistory-done": "Cyfunwyd $3 {{PLURAL:$3|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} o $1 yn llwyddiannus i'r dudalen [[:$2]].",
        "mergehistory-fail": "Methodd y cyfuno hanes; a wnewch wirio paramedrau'r dudalen a'r amser unwaith eto.",
        "mergehistory-no-source": "Nid yw'r dudalen gwreiddiol $1 yn bod.",
        "mergehistory-no-destination": "Nid yw'r dudalen cyrchfan $1 yn bod.",
        "filerevert-legend": "Gwrthdroi'r ffeil",
        "filerevert-intro": "Rydych yn gwrthdroi '''[[Media:$1|$1]]''' i'r fersiwn [$4 fel ag yr oedd ar $3, $2].",
        "filerevert-comment": "Rheswm:",
-       "filerevert-defaultcomment": "Wedi adfer fersiwn $2, $1",
+       "filerevert-defaultcomment": "Wedi adfer fersiwn $2, $1 ($3)",
        "filerevert-submit": "Gwrthdroi",
        "filerevert-success": "Mae '''[[Media:$1|$1]]''' wedi cael ei wrthdroi i'r fersiwn [$4 fel ag yr oedd ar $3, $2].",
        "filerevert-badversion": "Nid oes fersiwn lleol cynt o'r ffeil hwn gyda'r amsernod a nodwyd.",
        "movepagetext": "Drwy ddefnyddio'r ffurflen isod, byddwch yn ailenwi tudalen, ac felly yn symud ei holl hanes i'r dudalen a'r enw newydd.\nCaiff y dudalen a'r hen deitl ei throi'n dudalen sy'n ailgyfeirio i'r teitl newydd.\nGallwch ddiweddaru tudalennau ailgyfeirio sy'n cyfeirio at y teitl gwreiddiol yn awtomatig.\nOs ydych yn dewis peidio â gwneud hyn, gwiriwch [[Special:DoubleRedirects|dudalennau ailgyfeirio dwbl]] neu \n[[Special:BrokenRedirects|dudalennau ailgyfeirio nad ydynt yn ailgyfeirio]].\nChi sy'n gyfrifol am sicrhau bod cysylltiadau yn cyfeirio at y tudalennau cywir.\n\nSylwer '''na''' chaiff y dudalen ei symud os oes tudalen a'r enw newydd ar gael yn barod, oni bai bod y dudalen a'r enw newydd yn dudalen ailgyfeirio ac nad oes hanes golygu ganddi.\nMae hyn yn golygu y gallwch ailenwi tudalen yn ôl i'w henw gwreiddiol os ydych yn gwneud camgymeriad, ond na allwch drosysgrifo tudalen sy'n bodoli'n barod.\n\n'''Rhybudd!'''\nGall hwn fod yn newid mawr ac annisgwyl i dudalen boblogaidd;\ngwnewch yn siŵr eich bod yn deall canlyniadau'r broses hon cyn i chi barhau.",
        "movepagetext-noredirectfixer": "Wrth ddefnyddio'r ffurflen isod byddwch yn ail-enwi tudalen, gan symud ei hanes gyfan i'r enw newydd.\nBydd yr hen deitl yn troi'n dudalen ailgyfeirio i'r teitl newydd.\nByddwch gystal â thrwsio [[Special:DoubleRedirects|ailgyfeiriadau dwbl]] ac [[Special:BrokenRedirects|ailgyfeiriadau tor]].\nEich cyfrifoldeb chi yw sicrhau bod cysylltiadau wici'n dal i arwain at y man iawn.\n\nSylwch '''na fydd''' y dudalen yn symud os oes yna dudalen o'r enw newydd ar gael yn barod (heblaw ei bod hi'n wag neu'n ailgyfeiriad heb unrhyw hanes golygu).\nFelly, os y gwnewch gamgymeriad wrth ail-enwi tudalen dylai fod yn bosibl ei hail-enwi eto ar unwaith wrth yr enw gwreiddiol. \nHefyd, mae'n amhosibl ysgrifennu dros ben tudalen sydd yn bodoli'n barod.\n\n'''Dalier Sylw!'''\nGall hwn fod yn newid sydyn a llym i dudalen boblogaidd;\ngwnewch yn siwr eich bod chi'n deall y canlyniadau cyn mynd ati.",
        "movepagetalktext": "Bydd y dudalen sgwrs yn symud gyda'r dudalen hon '''onibai:'''\n*bod tudalen sgwrs wrth yr enw newydd yn bodoli'n barod\n*bod y blwch isod heb ei farcio.\n\nOs felly, gallwch symud y dudalen sgwrs neu ei gyfuno ar ôl symud y dudalen ei hun.",
-       "movearticle": "Symud y dudalen:",
        "moveuserpage-warning": "'''Sylwer:''' Yr ydych ar fin symud tudalen defnyddiwr. Sylwch mai'r dudalen yn unig a gaiff ei symud ac ''na fydd'' y defnyddiwr yn cael ei ail-enwi.",
        "movecategorypage-warning": "<strong>Rhybudd:</strong> Rydych ar fin dileu categori. Sylwch mai dim ond y dudalen a gaiff ei symud, a bydd y tudalennau o fewn yr hen gategori yn aros fel ag yr oeddent.",
        "movenologintext": "Mae'n rhaid bod yn ddefnyddiwr cofrestredig a'ch bod wedi [[Special:UserLogin|mewngofnodi]] cyn medru symud tudalen.",
        "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||[$2 ffeil arall]|[$2 ffeiliau eraill]|[$2 ffeiliau eraill]|[$2 ffeiliau eraill]|[$2 ffeiliau eraill]}} gyda'r un cynnwys {{PLURAL:$1||ynddi|ynddynt|ynddynt|ynddynt|ynddynt}} eisoes ar y wici hwn",
-       "api-error-duplicate-archive": "Fe fu {{PLURAL:$1|[$2 ffeil arall gyda'r un cynnwys ynddi]|[$2 ffeiliau eraill gyda'r un cynnwys ynddynt]}} ar y safle, ond fe'{{PLURAL:$1|i|u}} dilëwyd.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Ffeiliau|Ffeil|Ffeiliau|Ffeiliau|Ffeiliau|Ffeiliau}} dyblyg, sydd eisoes wedi {{PLURAL:$1|eu|ei|eu|eu|eu|eu}} dileu.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ffeiliau|ffeil|ffeiliau|ffeiliau|ffeiliau|ffeiliau}} dyblyg.",
+       "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-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.",
        "api-error-fetchfileerror": "Gwall mewnol: aeth rhywbeth o'i le tra'n cywain y ffeil.",
index 065e734..92dfc57 100644 (file)
@@ -49,7 +49,9 @@
                        "아라",
                        "Thomsen",
                        "Knud Winckelmann",
-                       "Macofe"
+                       "Macofe",
+                       "Jyllanj",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
@@ -84,7 +86,7 @@
        "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",
-       "tog-watchlisthidepatrolled": "Skjul patrujerede ændringer fra overvågningslisten",
+       "tog-watchlisthidepatrolled": "Skjul patruljerede ændringer fra overvågningslisten",
        "tog-ccmeonemails": "Send mig kopier af e-mails som jeg sender til andre brugere",
        "tog-diffonly": "Vis ikke sideindhold neden under versionssammenligninger",
        "tog-showhiddencats": "Vis skjulte kategorier",
        "yourname": "Dit brugernavn:",
        "userlogin-yourname": "Brugernavn",
        "userlogin-yourname-ph": "Indtast dit brugernavn",
-       "createacct-another-username-ph": "Indtast Brugernavn",
+       "createacct-another-username-ph": "Indtast brugernavn",
        "yourpassword": "Din adgangskode:",
        "userlogin-yourpassword": "Adgangskode",
        "userlogin-yourpassword-ph": "Indtast din adgangskode",
        "mergehistory-go": "Vis sammenflettelige versioner",
        "mergehistory-submit": "Sammenflet versioner",
        "mergehistory-empty": "Der findes ingen sammenflettelige udgaver",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versioner}} af [[:$1]] blev flettet sammen med [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versioner}} af $1 blev flettet sammen med [[:$2]].",
        "mergehistory-fail": "Sammenfletningen kunne ikke gennemføres. Vær venlig at kontrollere sidenavne og tidsafgrænsning.",
        "mergehistory-fail-toobig": "Ude af stand til at flette historiken sammen, fordi flere end grænsen på $1 {{PLURAL:$1|version|versioner}} ville blive flyttet.",
        "mergehistory-no-source": "Kildesiden $1 findes ikke.",
        "filerevert-legend": "Gendan fil",
        "filerevert-intro": "<span class=\"plainlinks\">Du gendanner '''[[Media:$1|$1]]''' til [$4 version fra $2, $3].</span>",
        "filerevert-comment": "Begrundelse:",
-       "filerevert-defaultcomment": "Gendannet til version fra $1, $2",
+       "filerevert-defaultcomment": "Gendannet til version fra $1, $2 ($3)",
        "filerevert-submit": "Gendan",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' er gendannet til [$4 version fra $2, $3].</span>",
        "filerevert-badversion": "Der findes ingen lokal udgave af denne fil med det opgivne tidsstempel.",
        "movepagetext": "Når du bruger formularen herunder, vil du få omdøbt en side og flyttet hele sidens historie til det nye navn.\nDen gamle titel vil blive en omdirigeringsside til den nye titel.\nDu kan opdatere omdirigeringer, der peger på den oprindelige titel, automatisk.\nHvis du vælger ikke at opdatere dem automatisk, så sørg for at tjekke efter [[Special:DoubleRedirects|dobbelte]] eller [[Special:BrokenRedirects|dårlige omdirigeringer]].\nDu er ansvarlig for, at alle henvisninger stadig peger derhen, hvor det er meningen de skal pege.\n\nBemærk at siden '''ikke''' kan flyttes, hvis der allerede er en side med den nye titel, medmindre den side er en omdirigering uden nogen redigeringshistorik.\nDet betyder, at du kan flytte en side tilbage hvor den kom fra, hvis du kommer til at lave en fejl, og det betyder, at du ikke kan overskrive en eksisterende side.\n\n'''ADVARSEL!'''\nDette kan være en drastisk og uventet ændring for en populær side; vær sikker på, at du forstår konsekvenserne af dette før du fortsætter.",
        "movepagetext-noredirectfixer": "Brug formularen herunder du vil omdøbe en side og flyttet hele sidens historie til det nye navn.\nDen gamle titel vil blive en omdirigeringsside til den nye titel.\nVær sikker på at tjekke for [[Special:DoubleRedirects|dobbelte]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].\nDu er ansvarlig for at sikre, at alle henvisninger stadig peger på et sted hvor det giver meningen at gå.\n\nBemærk, at siden '''ikke''' kan flyttes hvis der allerede er en side med den nye titel, medmindre den er tom eller er en omdirigering, og har ingen historie.\nDet betyder at du kan omdøbe en side tilbage hvor den kom fra, hvis du laver en fejl, og du kan ikke overskrive en eksisterende side.\n\n'''Advarsel!'''\nDette kan være en drastisk og uventet ændring for en populær side;\ndu skal være sikker på at du forstår konsekvenserne af dette før du fortsætter.",
        "movepagetalktext": "Den tilhørende diskussionsside, hvis der er en, vil automatisk blive flyttet med siden '''medmindre:''' *Du flytter siden til et andet navnerum,\n*En ikke-tom diskussionsside allerede eksisterer under det nye navn, eller\n*Du fjerner markeringen i boksen nedenunder.\n\nI disse tilfælde er du nødt til at flytte eller sammenflette siden manuelt.",
-       "movearticle": "Flyt side",
        "moveuserpage-warning": "'''Advarsel:''' Du er ved at flytte en brugerside. Bemærk at det kun er siden, der vil blive flyttet – brugeren bliver ''ikke'' omdøbt.",
        "movenologintext": "Du skal være registreret bruger og [[Special:UserLogin|logget på]] for at flytte en side.",
        "movenotallowed": "Du har ikke rettigheder til at flytte sider.",
        "api-error-badaccess-groups": "Du har ikke tilladelse til at overføre filer til denne wiki.",
        "api-error-badtoken": "Intern fejl: ugyldigt mærke.",
        "api-error-copyuploaddisabled": "At lægge filer op via hjemmesideadresser er slået fra på denne server.",
-       "api-error-duplicate": "Der er allerede {{PLURAL:$1|[$2 en anden fil]|[$2 nogle andre filer]}} med samme indhold på webstedet.",
-       "api-error-duplicate-archive": "Der var allerede {{PLURAL:$1|en [$2 anden fil]|[$2 nogle andre filer]}} med samme indhold på webstedet, men {{PLURAL:$1|den|de}} blev slettet.",
-       "api-error-duplicate-archive-popup-title": "Duplet af {{PLURAL:$1|fil|filer}}, der allerede er slettet",
-       "api-error-duplicate-popup-title": "Duplet {{PLURAL:$1|fil|filer}}",
+       "api-error-duplicate": "Der er allerede {{PLURAL:$1|en anden fil|nogle andre filer}} med samme indhold på webstedet.",
+       "api-error-duplicate-archive": "Der var allerede {{PLURAL:$1|en anden fil|nogle andre filer}} med samme indhold på webstedet, men {{PLURAL:$1|den|de}} blev slettet.",
        "api-error-empty-file": "Den fil du indsendte var tom.",
        "api-error-emptypage": "Det er ikke tilladt at oprette nye, tomme sider.",
        "api-error-fetchfileerror": "Intern fejl: noget gik galt under hentningen af filen.",
index bf21b13..3de37bc 100644 (file)
        "nstab-template": "Vorlage",
        "nstab-help": "Hilfeseite",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Hauptseite",
        "nosuchaction": "Diese Aktion gibt es nicht",
        "nosuchactiontext": "Die in der URL angegebene Aktion wird von MediaWiki nicht unterstützt.\nEs kann ein Schreibfehler in der URL vorliegen oder es wurde ein fehlerhafter Link angeklickt.\nEs kann sich auch um einen Programmierfehler in der Software, die von {{SITENAME}} benutzt wird, handeln.",
        "nosuchspecialpage": "Spezialseite nicht vorhanden",
        "viewsource": "Quelltext anzeigen",
        "viewsource-title": "Quelltext der Seite $1",
        "actionthrottled": "Aktionsanzahl limitiert",
-       "actionthrottledtext": "Im Rahmen einer Anti-Spam-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.",
+       "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.",
        "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": "Eine Passwortzurücksetzungs-E-Mail wurde versandt.",
+       "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-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",
-       "changeemail-text": "Fülle dieses Formular vollständig aus, um deine E-Mail-Adresse zu ändern. Du musst dein Passwort angeben, um diese Änderung zu bestätigen.",
+       "changeemail": "E-Mail-Adresse ändern oder entfernen",
+       "changeemail-text": "Fülle dieses Formular vollständig aus, um deine E-Mail-Adresse zu ändern. Du musst dein Passwort angeben, um diese Änderung zu bestätigen. Falls du die Zuordnung einer E-Mail-Adresse zu deinem Benutzerkonto aufheben möchtest, lasse das Feld für die neue E-Mail-Adresse leer, wenn du das Formular abschickst.",
        "changeemail-no-info": "Du musst angemeldet sein, um direkt auf diese Seite zugreifen zu können.",
        "changeemail-oldemail": "Aktuelle E-Mail-Adresse:",
        "changeemail-newemail": "Neue E-Mail-Adresse:",
+       "changeemail-newemail-help": "Dieses Feld sollte leer gelassen werden, falls du deine E-Mail-Adresse entfernen möchtest. Du wirst nicht in der Lage sein, ein vergessenes Passwort zurückzusetzen und E-Mails von diesem Wiki zu empfangen, wenn die E-Mail-Adresse entfernt wird.",
        "changeemail-none": "(keine)",
        "changeemail-password": "Dein {{SITENAME}}-Passwort:",
        "changeemail-submit": "E-Mail-Adresse ändern",
        "permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
        "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.",
        "log-fulllog": "Alle Logbucheinträge ansehen",
        "edit-hook-aborted": "Die Bearbeitung wurde ohne Erklärung durch eine Schnittstelle abgebrochen.",
        "edit-gone-missing": "Die Seite konnte nicht aktualisiert werden.\nSie wurde anscheinend gelöscht.",
        "mergehistory-go": "Zeige Versionen, die vereinigt werden können",
        "mergehistory-submit": "Vereinige Versionen",
        "mergehistory-empty": "Es können keine Versionen vereinigt werden.",
-       "mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versionen}} von „[[:$1]]“ erfolgreich nach „[[:$2]]“ vereinigt.",
+       "mergehistory-done": "{{PLURAL:$3|Eine Version wurde|$3 Versionen wurden}} von „$1“ nach „[[:$2]]“ vereinigt.",
        "mergehistory-fail": "Versionsvereinigung nicht möglich, bitte prüfe die Seite und die Zeitangaben.",
        "mergehistory-fail-toobig": "Die Versionsgeschichtenzusammenführung konnte nicht ausgeführt werden, da sonst mehr als {{PLURAL:$1|eine Version|$1 Versionen}} verschoben werden {{PLURAL:$1|würde|würden}}.",
        "mergehistory-no-source": "Ursprungsseite „$1“ ist nicht vorhanden.",
        "prefs-watchlist-token": "Token der Beobachtungsliste:",
        "prefs-misc": "Verschiedenes",
        "prefs-resetpass": "Passwort ändern",
-       "prefs-changeemail": "E-Mail-Adresse ändern",
+       "prefs-changeemail": "E-Mail-Adresse ändern oder entfernen",
        "prefs-setemail": "E-Mail-Adresse festlegen",
        "prefs-email": "E-Mail-Optionen",
        "prefs-rendering": "Aussehen",
        "group-bot": "Bots",
        "group-sysop": "Administratoren",
        "group-bureaucrat": "Bürokraten",
-       "group-suppress": "Oversighter",
+       "group-suppress": "Unterdrücker",
        "group-all": "(alle)",
        "group-user-member": "{{GENDER:$1|Benutzer|Benutzerin}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Automatisch bestätigter Benutzer|Automatisch bestätigte Benutzerin}}",
        "group-bot-member": "Bot",
        "group-sysop-member": "{{GENDER:$1|Administrator|Administratorin}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokrat|Bürokratin}}",
-       "group-suppress-member": "{{GENDER:$1|Oversighter|Oversighterin}}",
+       "group-suppress-member": "{{GENDER:$1|Unterdrücker|Unterdrückerin}}",
        "grouppage-user": "{{ns:project}}:Benutzer",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatisch bestätigte Benutzer",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administratoren",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokraten",
-       "grouppage-suppress": "{{ns:project}}:Oversighter",
+       "grouppage-suppress": "{{ns:project}}:Unterdrücker",
        "right-read": "Seiten lesen",
        "right-edit": "Seiten bearbeiten",
        "right-createpage": "Seiten erstellen (die keine Diskussionsseiten sind)",
        "recentchangeslinked-summary": "Diese Spezialseite listet die letzten Änderungen an den verlinkten Seiten auf (bzw. an in dieser Kategorie enthaltenen Kategorien). Seiten auf deiner [[Special:Watchlist|Beobachtungsliste]] sind <strong>fett</strong> dargestellt.",
        "recentchangeslinked-page": "Seite:",
        "recentchangeslinked-to": "Zeige nur Änderungen an Seiten, die auf diese Seite verlinken",
+       "recentchanges-page-added-to-category": "[[:$1]] zur Kategorie hinzugefügt",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] und {{PLURAL:$2|eine weitere Seite|$2 weitere Seiten}} zur Kategorie hinzugefügt",
+       "recentchanges-page-removed-from-category": "[[:$1]] von der Kategorie entfernt",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] und {{PLURAL:$2|eine weitere Seite|$2 weitere Seiten}} von der Kategorie entfernt",
+       "autochange-username": "Automatische MediaWiki-Änderung",
        "upload": "Datei hochladen",
        "uploadbtn": "Datei hochladen",
        "reuploaddesc": "Abbrechen und zurück zur Hochladen-Seite",
        "upload-options": "Hochladeoptionen",
        "watchthisupload": "Diese Datei beobachten",
        "filewasdeleted": "Eine Datei mit diesem Namen wurde schon einmal hochgeladen und zwischenzeitlich wieder gelöscht. Bitte prüfe zuerst den Eintrag im $1, bevor du die Datei wirklich speicherst.",
+       "filename-thumb-name": "Dies scheint ein Titel für Vorschaubilder zu sein. Lade bitte keine Vorschaubilder zurück auf das gleiche Wiki hoch. Anderenfalls ändere bitte den Dateinamen ab, so dass er aussagekräftiger ist und kein Vorschaubild-Präfix hat.",
        "filename-bad-prefix": "Der Dateiname beginnt mit '''„$1“'''. Dies ist im allgemeinen der von einer Digitalkamera vorgegebene Dateiname und daher nicht sehr aussagekräftig.\nBitte gib der Datei einen Namen, der den Inhalt besser beschreibt.",
        "filename-prefix-blacklist": " #<!-- Diese Zeile darf nicht verändert werden! --> <pre>\n#  Syntax:\n#   * Alles von einem #-Zeichen bis zum Ende der Zeile ist ein Kommentar.\n#   * Jede nicht-leere Zeile ist der Anfang eines typischen Dateinamens, der automatisch von einer Digitalkamera erzeugt wird.\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # einige Mobiltelefone\nIMG # allgemein\nJD # Jenoptik\nMGP # Pentax\nPICT # verschiedene\n #</pre> <!-- Diese Zeile darf nicht verändert werden!-->",
        "upload-success-subj": "Erfolgreich hochgeladen",
        "upload-http-error": "Ein HTTP-Fehler ist aufgetreten: $1",
        "upload-copy-upload-invalid-domain": "Als Kopie hochladbare Dateien sind über diese Domain nicht verfügbar.",
        "upload-dialog-title": "Datei hochladen",
-       "upload-dialog-error": "Es ist ein Fehler aufgetreten",
-       "upload-dialog-warning": "Es ist eine Warnung aufgetreten",
        "upload-dialog-button-cancel": "Abbrechen",
        "upload-dialog-button-done": "Schließen",
        "upload-dialog-button-save": "Speichern",
        "upload-dialog-button-upload": "Hochladen",
-       "upload-dialog-label-select-file": "Datei auswählen",
-       "upload-dialog-label-infoform-title": "Einzelheiten",
-       "upload-dialog-label-infoform-name": "Name",
-       "upload-dialog-label-infoform-description": "Beschreibung",
-       "upload-dialog-label-usage-title": "Verwendung",
-       "upload-dialog-label-usage-filename": "Dateiname",
+       "upload-process-error": "Es ist ein Fehler aufgetreten",
+       "upload-process-warning": "Es ist eine Warnung aufgetreten",
+       "upload-form-label-select-file": "Datei auswählen",
+       "upload-form-label-infoform-title": "Einzelheiten",
+       "upload-form-label-infoform-name": "Name",
+       "upload-form-label-infoform-description": "Beschreibung",
+       "upload-form-label-usage-title": "Verwendung",
+       "upload-form-label-usage-filename": "Dateiname",
+       "foreign-structured-upload-form-label-own-work": "Dies ist mein eigenes Werk",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorien",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-default": "Ich verstehe, dass ich diese Datei auf ein gemeinsames Repositorium hochlade. Ich bestätige, dass ich dies gemäß den dortigen Nutzungs- und Lizenzbedingungen tue.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Falls du diese Datei nicht unter den Bedingungen des gemeinsamen Repositoriums hochladen kannst, schließe bitte diesen Dialog und versuche eine andere Methode.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Du kannst auch [[Special:Upload|die Hochladeseite auf {{SITENAME}}]] ausprobieren, falls diese Datei dort unter ihren Richtlinien hochgeladen werden kann.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "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-wikimediacommons": "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-wikimediacommons": "Du kannst auch [[Special:Upload|die Hochladeseite auf {{SITENAME}}]] ausprobieren, falls die Website das Hochladen dieser Datei unter ihren Richtlinien erlaubt.",
        "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.",
        "filerevert-legend": "Datei zurücksetzen",
        "filerevert-intro": "Du setzt die Datei '''[[Media:$1|$1]]''' auf die [$4 Version vom $2, $3 Uhr] zurück.",
        "filerevert-comment": "Grund:",
-       "filerevert-defaultcomment": "Zurückgesetzt auf die Version vom $1, $2 Uhr",
+       "filerevert-defaultcomment": "Zurückgesetzt auf die Version vom $1, $2 Uhr ($3)",
        "filerevert-submit": "Zurücksetzen",
        "filerevert-success": "'''[[Media:$1|$1]]''' wurde auf die [$4 Version vom $2, $3 Uhr] zurückgesetzt.",
        "filerevert-badversion": "Es gibt keine Version der Datei zu dem angegebenen Zeitpunkt.",
        "nopagetext": "Die angegebene Seite ist nicht vorhanden.",
        "pager-newer-n": "{{PLURAL:$1|nächster|nächste $1}}",
        "pager-older-n": "{{PLURAL:$1|vorheriger|vorherige $1}}",
-       "suppress": "Oversight",
+       "suppress": "Unterdrücken",
        "querypage-disabled": "Diese Spezialseite wurde aus Gründen der Leistungserhaltung deaktiviert.",
        "apihelp": "API-Hilfe",
        "apihelp-no-such-module": "Modul „$1“ nicht gefunden.",
        "emailccsubject": "Kopie deiner Nachricht an $1: $2",
        "emailsent": "E-Mail verschickt",
        "emailsenttext": "Deine E-Mail wurde verschickt.",
-       "emailuserfooter": "Diese E-Mail wurde von „$1“ an „$2“ durch die Funktion „{{int:emailuser}}“ bei {{SITENAME}} gesendet.",
+       "emailuserfooter": "Diese E-Mail wurde von „$1“ an „{{GENDER:$2|$2}}“ durch die Funktion „{{int:emailuser}}“ bei {{SITENAME}} {{GENDER:$1|gesendet}}.",
        "usermessage-summary": "Systemnachricht gespeichert.",
        "usermessage-editor": "System-Messenger",
        "usermessage-template": "MediaWiki:Benutzernachricht",
        "deletepage": "Seite löschen",
        "confirm": "Bestätigen",
        "excontent": "Inhalt war: „$1“",
-       "excontentauthor": "Inhalt war: „$1“ (einziger Bearbeiter: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "Inhalt war: „$1“. Einziger Bearbeiter: [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]])",
        "exbeforeblank": "Inhalt vor dem Leeren der Seite: „$1“",
        "delete-confirm": "Löschen von „$1“",
        "delete-legend": "Löschen",
        "protect-level-sysop": "Nur Administratoren erlauben",
        "protect-summary-cascade": "kaskadierend",
        "protect-expiring": "bis $2, $3 Uhr (UTC)",
-       "protect-expiring-local": "bis $1",
+       "protect-expiring-local": "bis $2, $3 Uhr",
        "protect-expiry-indefinite": "unbeschränkt",
        "protect-cascade": "Kaskadierende Sperre – alle in diese Seite eingebundenen Vorlagen werden ebenfalls gesperrt.",
        "protect-cantedit": "Du kannst die Sperre dieser Seite nicht ändern, da du keine Berechtigung zum Bearbeiten der Seite hast.",
        "move-page-legend": "Seite verschieben",
        "movepagetext": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nDu kannst Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetext-noredirectfixer": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
-       "movepagetalktext": "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''\n*Es existiert bereits eine Diskussionsseite mit diesem Namen, oder\n*du wählst die unten stehende Option ab.\n\nIn diesen Fällen musst du, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.\n\nBitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung bitte '''begründen.'''",
-       "movearticle": "Seite verschieben:",
+       "movepagetalktext": "Falls du dieses Kästchen aktivierst, wird die dazugehörige Diskussionsseite automatisch auf den neuen Titel verschoben, sofern nicht bereits eine nicht-leere Diskussionsseite dort vorhanden ist.\n\nIn diesem Fall musst du die Seite manuell verschieben oder zusammenführen, falls erforderlich.",
        "moveuserpage-warning": "'''Warnung:''' Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
        "movecategorypage-warning": "<strong>Warnung:</strong> Du bist gerade dabei, eine Kategorieseite zu verschieben. Bitte sei dir bewusst, dass nur die Seite verschoben wird. Alle Seiten in der alten Kategorie werden <em>nicht</em> neu kategorisiert.",
        "movenologintext": "Du musst ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.",
        "cant-move-to-user-page": "Du hast nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).",
        "cant-move-category-page": "Du hast keine Berechtigung, um Kategorieseiten zu verschieben.",
        "cant-move-to-category-page": "Du hast keine Berechtigung, um eine Seite zu einer Kategorieseite zu verschieben.",
-       "newtitle": "Ziel:",
+       "newtitle": "Neuer Titel:",
        "move-watch": "Quell- und Zielseite beobachten",
        "movepagebtn": "Seite verschieben",
        "pagemovedsub": "Verschiebung erfolgreich",
        "logentry-newusers-byemail": "Benutzerkonto $3 wurde von $1 {{GENDER:$2|erstellt}} und das Passwort wurde per E-Mail zugesandt",
        "logentry-newusers-autocreate": "Benutzerkonto $1 wurde automatisch {{GENDER:$2|erstellt}}",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|verschob}} die Schutzeinstellungen von $4 nach $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|entfernte}} den Schutz der Seite $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|schützte}} die Seite $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|schützte}} die Seite $3 $4 [kaskadierend]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|änderte}} den Schutzstatus der Seite $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|änderte}} den Schutzstatus der Seite $3 $4 [kaskadierend]",
        "logentry-rights-rights": "$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für $3 von $4 zu $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für $3",
        "logentry-rights-autopromote": "$1 wurde automatisch von $4 zu $5 {{GENDER:$2|zugeordnet}}",
        "api-error-badaccess-groups": "Du hast nicht die Berechtigung Dateien in dieses Wiki hochzuladen.",
        "api-error-badtoken": "Interner Fehler: Der Token ist fehlerhaft.",
        "api-error-copyuploaddisabled": "Das Hochladen via URL wurde auf diesem Server deaktiviert.",
-       "api-error-duplicate": "Es gibt im Wiki bereits {{PLURAL:$1|[$2 eine andere Datei]|[$2 mehrere andere Dateien]}} gleichen Inhalts.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|war bereits [$2 andere Datei]|waren bereits [$2 andere Dateien]}} gleichen Inhalts vorhanden. {{PLURAL:$1|Sie wurde|Sie wurden}} allerdings gelöscht.",
-       "api-error-duplicate-archive-popup-title": "Doppelte {{PLURAL:$1|Datei, die bereits gelöscht wurde|Dateien, die bereits gelöscht wurden}}",
-       "api-error-duplicate-popup-title": "Doppelt vorhandene {{PLURAL:$1|Datei|Dateien}}",
+       "api-error-duplicate": "Es gibt im Wiki bereits {{PLURAL:$1|eine andere Datei|mehrere andere Dateien}} gleichen Inhalts.",
+       "api-error-duplicate-archive": "Es {{PLURAL:$1|war bereits eine andere Datei|waren bereits andere Dateien}} gleichen Inhalts vorhanden. Sie {{PLURAL:$1|wurde|wurden}} allerdings gelöscht.",
        "api-error-empty-file": "Die hochgeladene Datei war leer.",
        "api-error-emptypage": "Es ist nicht erlaubt, neue leere Seiten zu erstellen.",
        "api-error-fetchfileerror": "Interner Fehler: Beim Abrufen der Datei ist ein Fehler aufgetreten.",
index f6fcaf1..2c2770d 100644 (file)
@@ -21,7 +21,8 @@
                        "Microchip08",
                        "아라",
                        "Calak",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
        "mergehistory-go": "Vernayîşê yewbiyayeni bimocne",
        "mergehistory-submit": "revizyonî yew bike",
        "mergehistory-empty": "Revizyonî yew nibenê.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revizyonê|revizyonê}} [[:$1]] u [[:$2]] yew biyê.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revizyonê|revizyonê}} $1 u [[:$2]] yew biyê.",
        "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.",
        "movepagetext": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|double]] ya zi [[Special:BrokenRedirects|broken redirects]] qontrol bıki.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''Teme!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
        "movepagetext-noredirectfixer": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İkaz!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
        "movepagetalktext": "Ma peleyê mınaqeşeyê ena pele otomatik beno, '''ma nıeşken ber, eg:'''\n*Yew peleyê mınaqeşeyê ser ena name rona esto, ya zi\n*Tı quti check nıkerd.\n\nOturse, tı gani peleyê mınaqeşeyê manually beri.",
-       "movearticle": "Pele bere:",
        "moveuserpage-warning": "'''Diqet:''' Ti eka yew pelê karberi beni. Diqet bike teyna pel beni feqat ena pele reyna nameyê newi \"nebeno''.",
        "movenologintext": "qey vurnayişê nameyê peli şıma gani qeyd kerde u cıkewteyê [[Special:UserLogin|sistemi]] bıbiy.",
        "movenotallowed": "desturê şıma çino, şıma pelan bıkırışi",
        "api-error-badaccess-groups": "Ena wiki de dosya barkerdışi rê mısade nêdeyêno.",
        "api-error-badtoken": "Xetaya zerreki: Antışo xırabın.",
        "api-error-copyuploaddisabled": "URL barkerdış ena waster dı qefılyayo.",
-       "api-error-duplicate": "Ena {{PLURAL:$1|ze ke [zey $2]|biya [zey dosya da $2]}} zeq wesiqa biya wendeyê.",
-       "api-error-duplicate-archive": "Ena {{PLURAL:$1|vurneyaya [$2 zey na dosya]| [zerrey cı zey $2 dosya]}} aseno,feqet {{PLURAL:$1|ena dosya|tewr veri}} besterneyaya.",
-       "api-error-duplicate-archive-popup-title": "Ena {{PLURAL:$1|Dosya besterneyaya|dosya}} xora  besterneyaya.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|dosyaya|dosyaya}} dılet",
+       "api-error-duplicate": "Ena {{PLURAL:$1|ze ke zeq|biya zey dosya da}} zeq wesiqa biya wendeyê.",
+       "api-error-duplicate-archive": "Ena {{PLURAL:$1|vurneyaya zey na dosya|zerrey cı zey dosya}} aseno,feqet {{PLURAL:$1|ena dosya|tewr veri}} besterneyaya.",
        "api-error-empty-file": "Dosyaya ke şıma rışta venga.",
        "api-error-emptypage": "Newi, pelaya veng vıraştışi rê mısade nêdeyêno.",
        "api-error-fetchfileerror": "Xırabiya zerrek:Dosya grotış dı tay çi raşt nêşı.",
index 2dc526c..50f5994 100644 (file)
@@ -18,7 +18,8 @@
                        "Tlustulimu Nepl1",
                        "아라",
                        "TMg",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Wótkaze pódšmarnuś:",
        "mergehistory-go": "Wersije, kótarež daju se zjadnośiś, pokazaś",
        "mergehistory-submit": "Wersije zjadnośiś",
        "mergehistory-empty": "Njadaju se žedne wersije zjadnośiś.",
-       "mergehistory-success": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wót [[:$1]] wuspěšnje do [[:$2]] {{PLURAL:$3|zjadnośona|zjadnośonej|zjadnośone|zjadnośone}}.",
+       "mergehistory-done": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wót $1 wuspěšnje do [[:$2]] {{PLURAL:$3|zjadnośona|zjadnośonej|zjadnośone|zjadnośone}}.",
        "mergehistory-fail": "Njemóžno stawizny zjadnośiś, pśeglědaj pšosym bok a casowe parametry.",
        "mergehistory-no-source": "Žrědłowy bok $1 njeeksistěrujo.",
        "mergehistory-no-destination": "Celowy bok $1 njeeksistěruje.",
        "movepagetext": "Z pomocu slědujucego formulara móžoš bok pśemjenjowaś, pśi comž se jogo wersije k nowemu mjenjoju pśesuwaju.\nStary titel wordujo dalejpósrědnjeński bok k nowemu titeloju.\nMóžoš awtomatiski aktualizěrowaś dalejposrědkowanja, kótarež pokazuju na originalny titel.\nJolic njocoš, pśeglědaj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|defektnymi daleposrědkowanjami]].\nSy zagronity, až wótkaze wjedu tam, źož maju wjasć.\n\nŹiwaj na to, až se bok '''nje'''pśesuwa, jolic jo južo bok z nowym titelom, snaźkuli slědny jo dalejpósrědnjenje a njama stare wobźěłane wersije. To ma groniś, až móžoš bok zasej slědk pśemjenjowaś, jolic cyniš zmólku, a njemóžoš eksistěrujucy bok pśepisaś.\n\n'''WARNOWANJE!'''\nTo móžo byś drastiska a njewocakowana změna za popularny bok;\npšosym zawěsć, až konsekwency rozmijoš, nježli až pókšacujoš.",
        "movepagetext-noredirectfixer": "Z pomocu slědujucego formulara móžoš bok pśemjenjowaś, pśi comž se jogo wersije k nowemu mjenjoju pśesuwaju.\nStary titel wordujo dalejpósrědnjeński bok k nowemu titeloju.\nMóžoš awtomatiski aktualizěrowaś dalejposrědkowanja, kótarež pokazuju na originalny titel.\nJolic njocoš, pśeglědaj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|defektnymi daleposrědkowanjami]].\nSy zagronity, až wótkaze wjedu tam, źož maju wjasć.\n\nŹiwaj na to, až se bok '''nje'''pśesuwa, jolic jo južo bok z nowym titelom, snaźkuli jo prozny abo dalejpósrědnjenje a njama stare wobźěłane wersije. To ma groniś, až móžoš bok zasej slědk pśemjenjowaś, jolic cyniš zmólku, a njemóžoš eksistěrujucy bok pśepisaś.\n\n'''WARNOWANJE!'''\nTo móžo byś drastiska a njewocakowana změna za popularny bok;\npšosym źiwaj na to, až rozumijoš konsekwency, nježli až pókšacujoš.",
        "movepagetalktext": "Pśisłušny diskusijny bok se sobu pśesunjo, '''ale nic gaž:'''\n* eksistěrujo južo diskusijny bok z toś tym mjenim, abo gaž\n* wótwólijoš toś tu funkciju.\n\nW toś tyma padoma dej wopśimjeśe boka manualnje se pśesunuś resp. gromadu wjasć, jolic až to coš.",
-       "movearticle": "Bok pśesunuś",
        "moveuserpage-warning": "'''Warnowanje:''' Coš rowno wužywarski bok pśesunuś. Pšosym wobmysli, až jano bok se pśesunjo a wužiwaŕ '''nje'''buźo se pśemjenjowaś.",
        "movenologintext": "Musyš zregistrěrowany wužywaŕ a [[Special:UserLogin|pśizjawjony]] byś, aby pśesunuł bok.",
        "movenotallowed": "Njamaš pšawo pśesuwaś boki.",
        "api-error-badaccess-groups": "Njamaš pšawo dataje do toś togo wikija nagraś.",
        "api-error-badtoken": "Nutśikowna zmólka: Wopacny token",
        "api-error-copyuploaddisabled": "Nagrawanje pśez URL jo na toś tom serwerje znjemóžnjone.",
-       "api-error-duplicate": "{{PLURAL:$1|Jo|Stej|Su|Jo}} južo {{PLURAL:$1|[$2 druga dataja]|[$2 drugej dataji]|[$2 druge dataje]|[$2 drugich datajow]}} z tym samym wopśimjeśim na sedle",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Jo była [$2 druga dataja]|Stej byłej [$2 drugej dataji]|Su byli [$2 druge dataje]|Jo było [$2 drugich datajow]}} južo na websedle z tym samym wopśimjeśim, ale {{PLURAL:$1|jo se wulašowała|stej se wulašowałej|su se wulašowali|jo se wulašowało}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Dwójna dataja, kótaraž jo|Dwójnej dataji, kótarejž stej|Dwójne dataje, kótarež su|Dwójne dataje, kótarež su}} se južo {{PLURAL:$1|wulašowała|wulašowałej|wulašowali|wulašowali}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Dwójna dataja|Dwójnej dataji|Dwójne dataje|Dwójne dataje}}",
+       "api-error-duplicate": "{{PLURAL:$1|Jo|Stej|Su|Jo}} južo {{PLURAL:$1|druga dataja|drugej dataji|druge dataje|drugich datajow}} z tym samym wopśimjeśim na sedle",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Jo była druga dataja|Stej byłej drugej dataji|Su byli druge dataje|Jo było drugich datajow}} južo na websedle z tym samym wopśimjeśim, ale {{PLURAL:$1|jo se wulašowała|stej se wulašowałej|su se wulašowali|jo se wulašowało}}.",
        "api-error-empty-file": "Dataja, kótaruž sy nagrał, jo prozna była.",
        "api-error-emptypage": "Napóranje nowych, proznych bokow njejo dowólone.",
        "api-error-fetchfileerror": "Nutśikowna zmólka: Pśi wobstarowanju dataje něco njejo se raźiło.",
index 56af462..79eb333 100644 (file)
        "mergehistory-list": "Susuyan niditan milo pisompuruon",
        "mergehistory-submit": "Pisompuruo sinimakan",
        "mergehistory-empty": "Inggaa sinimakan do milo pisompuruon",
-       "mergehistory-success": "$3 {{PLURAL:$3|sinimakan|tongosinimakan}} montok[[:$1]] nokopisompuru noh id [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|sinimakan|tongosinimakan}} montok$1 nokopisompuru noh id [[:$2]].",
        "mergehistory-fail": "Awu milo do pisompuruon susuyan, mangai imuriai iri bolikon om nuludan do timpu.",
        "mergehistory-no-source": "Wowonod bolikon $1 awu poinsuang.",
        "mergehistory-no-destination": "Korikoton do bolikon $1 awu poinsuang.",
        "block-log-flags-nocreate": "awu milo momonsoi akaun",
        "movepagetext": "Momoguno do poom id siriba diti kopongolon do ngaran bolikon om popoundalih oinsanan susuyan data dau in ngaran kawawagu.\nTuluhon dau mantad potilombuson id nokoolihon tuluhon bolikon  kawawagu.\nMilo ko nogi do mongodoropi di nokoolihon di momoguno do tuluhon antad maya do kangkaraja oporian.\nMada ko nopo do momili dilo, simakon no poingonop it [[Special:DoubleRedirects|nosugut]] toi \n[[Special:BrokenRedirects|lombuson naraag]].\nKitonggungan ko do momorisa di noputan do pointopot ot korikoton.\n\nIntaai no do bolikon '''awu''' kopinda nung haro no bolikon id tuluhon kawawagu diri, suai ko ingaa suang toi kilinombuson om ingaa susuyan niditan di pogulu poh.\nKomoyon do milo ko nogi do mongolon ngaran bolikon gumuli hilo tiyonon diri nung kosilap ko om awu ko nogi kapamalapau di bolikon nokosuang mantad.\n\n\n'''Pansarahan!'''\nMilo iti do kawalih tagayo om awu nopoimanan montok bolikon di aramaiti;\nkalansanan do karati ko kopio do nunu kotutukon do karajanu pogulu po do potilombuson.",
        "movepagetalktext": "Bolikon bolotok it kokomoi maan popimporio do poundalih piampaion dilo '''awu kohompit:'''\n* Iso bolikon bolotok it kisuang om kiharo it pinungaranan do wagu, toi\n* maai pugaso tanda rait id kutak siriba diti.\n\nId kis dilo, mositi do momoguno do karalan-ralanon longonon nung popindaon toi posungkuonnu ot bolikon dilo.",
-       "movearticle": "Popinda bolikon:",
        "newtitle": "Mongoi tuluhon kawawagu:",
        "move-watch": "Intangai bolikon wowonod om bolikon dimpoton",
        "movepagebtn": "Popinda bolikon",
index 8da702b..08dfe43 100644 (file)
@@ -4,7 +4,9 @@
                        "जनक राज भट्ट",
                        "बिप्लब आनन्द",
                        "रमेश सिंह बोहरा",
-                       "राम प्रसाद जोशी"
+                       "राम प्रसाद जोशी",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "सम्बन्ध निम्न रेखाङ्कन:",
        "mergehistory-go": "जोड्ड मिल्न्या सम्पादनहरू",
        "mergehistory-submit": "पुनरावलोकहरू जोड",
        "mergehistory-empty": "कोइलै पुनरावलोकनहरू जोड्ड नाइँमिल्लो ।",
-       "mergehistory-success": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  [[:$1]]बठे सफलतापूर्वक [[:$2]]मी थपियो ।",
+       "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बठे सफलतापूर्वक [[:$2]]मी थपियो ।",
        "mergehistory-autocomment": " [[:$1]] लाई [[:$2]] मी जोडियो",
        "mergehistory-comment": " [[:$1]] लाई[[:$2]] मी जोडियो : $3",
        "mergehistory-same-destination": "स्रोत र गन्तव्य पाना एउटै हुनसक्दैनन्",
        "fileexists": "यै नामको फाइल पैल्ली नैं छ, यदि तम परिवर्तन गद्या कुरडीमू सुनिश्चित छैनौ भण्या कृपया <strong>[[:$1]]</strong> जाँच गर।\n[[$1|thumb]]",
        "filewasdeleted": "यै नामको एक फाइल पहिली पनि अपलोड गरिबर पछि हटाई सकियाको छ।\nपुनः अपलोड गद्दु पूर्व तम $1 लाई निक्करी जाँच गर ।",
        "upload-dialog-title": "चित्र अपलोड गर",
-       "upload-dialog-error": "गल्ती भयो",
-       "upload-dialog-warning": "सूचना हुनु",
        "upload-dialog-button-cancel": "रद्द",
        "upload-dialog-button-done": "सकियो",
        "upload-dialog-button-save": "सङ्ग्रह गद्या",
        "upload-dialog-button-upload": "अपलोड",
-       "upload-dialog-label-select-file": "फाइल छान",
-       "upload-dialog-label-infoform-title": "विवरण",
-       "upload-dialog-label-infoform-name": "नाऊ",
-       "upload-dialog-label-infoform-description": "बेलिविस्तार",
-       "upload-dialog-label-usage-title": "रिती",
-       "upload-dialog-label-usage-filename": "फाइल नाउ",
+       "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": "फाइल नाउ",
        "uploadstash-nofiles": "तमरा कोइ पनि स्टाश गर्याका फाइलहरू नाइथिन् ।",
        "uploadstash-badtoken": "त्यो कार्य असफलभयो , सायद तमरो सम्पादन अधिकार समाप्त भयो । पुन: प्रयास गर ।",
        "uploadstash-refresh": "फाइलहरूको सूची ताजा गर्न्या",
        "logentry-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड अरेका छन्}}",
        "feedback-bugornote": "यदि तमी कुनै प्राविधिक समस्यालाई विस्तारले सम्झाउन तयार छौ भण्या कृपया [$1 बग राख]।\nयदि हैन, भण्या तमी तल दियाको सरल फारमको प्रयोग गद्दसक्द्याहौ । तमरो टिप्पणी, तमरो प्रयोगकर्ता नाम र तमरो ब्राउजरको नाम सहित \"[$3 $2]\" पानामी जोडिन्याछ ।",
        "searchsuggest-search": "खोज",
-       "api-error-duplicate": "यै साइटमी पहिलीबठे यस्तै सामग्री {{PLURAL:$1|भयाको [$2 अर्को फाइल छ]|भयाका  [$2 केहि अरु फाइलहरू छन्]}} ।",
-       "api-error-duplicate-archive": "यै साइटमी पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भयाको [$2 अर्को फाइल थियो]|भयाका  [$2 केहि अरु फाइलहरू थिए]}} ।\nतर {{PLURAL:$1|यो मेट्याको थियो|यी मेटायाका थिए}} ।",
-       "api-error-duplicate-archive-popup-title": "पैल्ली  {{PLURAL:$1|मेट्याको फाइलको|मेट्याका फाइलहरूको}} नकल प्रति बनाउन्या।",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|फाइल|फाइलहरू}} नकल प्रति बनाउन्या",
+       "api-error-duplicate": "यै साइटमी पहिलीबठे यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल छ|भयाका  केहि अरु फाइलहरू छन्}} ।",
+       "api-error-duplicate-archive": "यै साइटमी पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल थियो|भयाका केहि अरु फाइलहरू थिए}} ।\nतर {{PLURAL:$1|यो मेट्याको थियो|यी मेटायाका थिए}} ।",
        "expand_templates_preview_fail_html": "<em>किनकि {{SITENAME}} सिधै एचटिएमयल सक्षम छ र तमीले लग इन गर्या छैनौ, पूर्वावलोकन लुकाइयाको छ ताकि सम्भावित जाभास्क्रिप्ट आक्रमणलाई रोक्द सकियोस् ।</em>\n\n<strong>यदि यो मान्य पूर्ववावलोकन प्रयास हो भण्या पुन प्रयास गर ।</strong>\nयदि यसले कार्य पूर्ण भएन भण्या [[Special:UserLogout|लग आउट गरिबर]] फेरी लग इन गर्या ।",
        "expand_templates_preview_fail_html_anon": "<em>किनकि {{SITENAME}} सिधै एचटिएमयल सक्षम छ र तमीले लग इन गर्या छैनौ, पूर्वावलोकन लुकाइयाको छ ताकि सम्भावित जाभास्क्रिप्ट आक्रमणलाई रोक्द सकियोस् ।</em>\n\n<strong>यदि यो मान्य पूर्वावलोकन प्रयास हो भण्या कृपया [[Special:UserLogin|लग इन गरिबर]] पुनः प्रयास गर्या ।</strong>",
        "default-skin-not-found": "ओह! तमरो विकिको पूर्व निर्धारित खोल जस्तो कि <code dir=\"ltr\">$wgDefaultSkin</code> मी बताइयाको<code>$1</code>, उपलब्ध नाईथिन् ।\n\nतमरो इन्स्टलेसन यी खोलहरूलाई सम्मिलित गर्दछ {{PLURAL:$4|खोल|खोलहरू}}। हेर [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: खोललाई सम्मिलित गर्नु] ताकि तमीलाई जानकारी होस् कि कसरि {{PLURAL:$4|उसलाई|उसलाई सम्मिलित गर्न सकियोस् र निर्धारितलाई तय गद्दे}}।\n\n$2\n\n; यदि तमीले अहिले मीडियाविकि इन्स्टाल गर्याका छौ:\n: तमीले सम्भवत गिटबठे इन्स्टाल गर्याका छौ, वा सिधै स्रोत कोडबठे गर्याका छौ जैको लागि कुनै अर्कै तारिका प्रयोग गरियाको छ । यो आशा अनुरूप छ । कोशिश गर केहि खोलहरू\n[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's मीडियाविकिको खोल डाइरेक्ट्रीबाट डाउनलोड गद्या], जैको लागि तमी:\n:* डाउनलोड गर [https://www.mediawiki.org/wiki/Download टरबल इन्स्टालर], जुन कयौं खोलहरू र विस्तारमी उपलब्ध छन्। तमी खोलहरूको कोड <code>skins/</code> त्यसको डाइरेक्ट्रीबाट कपी-पेस्ट गद्द सक्द्या हौ। \n:* व्यक्तिगत खोलहरू टरबलबठे डाउनलोड गर\n[https://www.mediawiki.org/wiki/Special:SkinDistributor मीडिया विकि] बठे।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins गिटको प्रयोग गरेर डाउनलोड गद्द सकन्छौ]।\n: यदि तमी विकासकर्ता हौ भण्या यसो गद्दा तमरो गिट-रिपजिटरीमी केहि हुनुहुँदैन । \n; यदि तमीले अहिले मीडियाविकिलाई अपग्रेड गर्याका छौ:\n: मीडियाविकि १.२४ र यैको नवीन रूप स्वतः रूपले खोलहरूलाई सक्षम गद्दैनन् (हेर [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:खोलहरूको स्वतः खोज])। तमी निम्नलिखितलाई पेस्ट गद्द सकन्छौ: {{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 e79ad80..3b83b34 100644 (file)
        "mergehistory-go": "Fà vèder al mudéfichi che pōlen èser unîdi",
        "mergehistory-submit": "Unés al versiòun",
        "mergehistory-empty": "Nisòna versiòun da unîr",
-       "mergehistory-success": "{{PLURAL:$3|'Na versiòun ed [[:$1]] l'é stêda unîda|$3 versiòn ed [[:$1]] în stêdi unîdi}} al la stòria ed [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|'Na versiòun ed $1 l'é stêda unîda|$3 versiòn ed $1 în stêdi unîdi}} al la stòria ed [[:$2]].",
        "mergehistory-fail": "Impusébil unîr al stòri. Verifichêr la pàgina e al règoli dal mumèint.",
        "mergehistory-fail-toobig": "Imposébil fêr l'uniòun ed la stòria cun pió 'd $1{{PLURAL:$1|revisiòun}} da spustêr",
        "mergehistory-no-source": "La pàgina 'd urégin $1 l'an gh'é mìa.",
        "block-log-flags-nocreate": "Registrasiòun bluchêda",
        "move-page": "Spustamèint ed $1",
        "move-page-legend": "Spustamèint ed pàgina",
-       "movearticle": "Spôsta la pàgina:",
        "movepagebtn": "Spôsta la pàgina",
        "movelogpage": "Spustamèint",
        "revertmove": "armèt",
index 03e3cbb..fb3f59c 100644 (file)
@@ -42,7 +42,8 @@
                        "Milicevic01",
                        "Ah3kal",
                        "Macofe",
-                       "Stam.nikos"
+                       "Stam.nikos",
+                       "Giorgos456"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "nstab-template": "Πρότυπο",
        "nstab-help": "Σελίδα βοήθειας",
        "nstab-category": "Κατηγορία",
+       "mainpage-nstab": "Αρχική σελίδα",
        "nosuchaction": "Δεν υπάρχει τέτοια ενέργεια.",
        "nosuchactiontext": "Η ενέργεια που καθορίστηκε από την διεύθυνση URL δεν είναι έγκυρη.\nΕνδέχεται να πληκτρολογήσατε λανθασμένα την διεύθυνση URL ή να ακολουθήσατε έναν μη έγκυρο σύνδεσμο.\nΜπορεί επίσης να είναι σημάδι κάποιου σφάλματος του λογισμικού που χρησιμοποιεί ο ιστότοπος {{SITENAME}}.",
        "nosuchspecialpage": "Δεν υπάρχει τέτοια ειδική σελίδα",
        "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": "Î\88Ï\87ει Î±Ï\80οÏ\83Ï\84αλεί email ÎµÏ\80αναÏ\86οÏ\81άς κωδικού.",
+       "passwordreset-emailsent": "Î\91ν Î±Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î· ÎºÎ±Ï\84αÏ\87Ï\89Ï\81Ï\85μένη Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η email Î³Î¹Î± Ï\84ον Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\83αÏ\82, Ï\84Ï\8cÏ\84ε Î¸Î± Ï\83Ï\84αλεί Î­Î½Î± Î¼Î®Î½Ï\85μα email Î±Ï\81Ï\87ικοÏ\80οίηÏ\83ης κωδικού.",
        "passwordreset-emailsent-capture": "Έχει αποσταλεί email επαναφοράς κωδικού, το οποίο φαίνεται πιο κάτω.",
        "passwordreset-emailerror-capture": "Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο  {{GENDER:$2|χρήστη}}: $1",
-       "changeemail": "Αλλαγή της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
-       "changeemail-text": "ΣÏ\85μÏ\80ληÏ\81Ï\8eÏ\83Ï\84ε Î±Ï\85Ï\84ή Ï\84η Ï\86Ï\8cÏ\81μα Î³Î¹Î± Î½Î± Î±Î»Î»Î¬Î¾ÎµÏ\84ε Ï\84η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 Ï\83αÏ\82. Î\98α Ï\80Ï\81έÏ\80ει Î½Î± ÎµÎ¹Ï\83άγεÏ\84ε Ï\84ον ÎºÏ\89δικÏ\8c Ï\83αÏ\82 Î³Î¹Î± Î½Î± ÎµÏ\80ιβεβαιÏ\89θεί Î±Ï\85Ï\84ή Î· Î±Î»Î»Î±Î³Î®.",
+       "changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
+       "changeemail-text": "ΣÏ\85μÏ\80ληÏ\81Ï\8eÏ\83Ï\84ε Î±Ï\85Ï\84ή Ï\84η Ï\86Ï\8cÏ\81μα Î³Î¹Î± Î½Î± Î±Î»Î»Î¬Î¾ÎµÏ\84ε Ï\84η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 Ï\83αÏ\82. Î\98α Ï\80Ï\81έÏ\80ει Î½Î± ÎµÎ¹Ï\83άγεÏ\84ε Ï\84ον ÎºÏ\89δικÏ\8c Ï\83αÏ\82 Î³Î¹Î± Î½Î± ÎµÏ\80ιβεβαιÏ\8eÏ\83εÏ\84ε Ï\84ην Î±Î»Î»Î±Î³Î® Î±Ï\85Ï\84ή. Î\91ν Î¸Î± Î¸Î­Î»Î±Ï\84ε Î½Î± Î±Ï\86αιÏ\81έÏ\83εÏ\84ε Ï\84η Ï\83Ï\8dνδεÏ\83η Î¿Ï\80οιαÏ\83δήÏ\80οÏ\84ε Î´Î¹ÎµÏ\8dθÏ\85νÏ\83ηÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 Î¼Îµ Ï\84ο Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\83αÏ\82, Î±Ï\86ήÏ\83Ï\84ε Ï\84η Î½Î­Î± Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 ÎºÎµÎ½Î® ÎºÎ±Ï\84ά Ï\84ην Ï\85Ï\80οβολή Ï\84ηÏ\82 Ï\86Ï\8cÏ\81μαÏ\82.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "changeemail-oldemail": "Τρέχουσα διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "changeemail-newemail": "Νέα διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "mergehistory-go": "Εμφάνιση τροποποιήσεων που μπορούν να συγχωνευθούν",
        "mergehistory-submit": "Συγχώνευση εκδόσεων",
        "mergehistory-empty": "Καμία έκδοση δεν μπορεί να συγχωνευθεί.",
-       "mergehistory-success": "$3 {{PLURAL:$3|έκδοση|εκδόσεις}} του [[:$1]] συγχωνεύθηκαν επιτυχώς στο [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|έκδοση|εκδόσεις}} του $1 συγχωνεύθηκαν επιτυχώς στο [[:$2]].",
        "mergehistory-fail": "Αδύνατη η εκτέλεση της συγχώνευσης ιστορικού, παρακαλούμε κάντε επανέλεγχο των παραμέτρων σελίδας και χρόνου.",
        "mergehistory-fail-toobig": "Δεν είναι δυνατό να πραγματοποιηθεί η συγχώνευση ιστορικών, καθώς πάνω από $1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} θα μετακινούνταν.",
        "mergehistory-no-source": "Η σελίδα πηγής $1 δεν υπάρχει.",
        "prefs-watchlist-token": "Σημείο λίστας παρακολούθησης:",
        "prefs-misc": "Διάφορες ρυθμίσεις",
        "prefs-resetpass": "Αλλαγή κωδικού",
-       "prefs-changeemail": "Αλλαγή διεύθυνσης ηλεκτρονικού ταχυδρομείου",
+       "prefs-changeemail": "Î\91λλαγή Î® Î±Ï\86αίÏ\81εÏ\83η Ï\84ηÏ\82 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83ηÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85",
        "prefs-setemail": "Ορίστε μια διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "prefs-email": "Επιλογές e-mail",
        "prefs-rendering": "Εμφάνιση",
        "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 ακόμα σελίδες}} αφαιρέθηκαν από την κατηγορία",
        "upload": "Ανέβασμα αρχείου",
        "uploadbtn": "Ανέβασμα αρχείου",
        "reuploaddesc": "Επιστροφή στη φόρμα φόρτωσης",
        "upload-http-error": "Εμφανίστηκε κάποιο σφάλμα HTTP: $1",
        "upload-copy-upload-invalid-domain": "Δεν υπάρχουν διαθέσιμα ανεβάσματα αντιγράφων από αυτό τον τομέα.",
        "upload-dialog-title": "Ανέβασμα αρχείου",
-       "upload-dialog-error": "Ένα σφάλμα συνέβη",
-       "upload-dialog-warning": "Προέκυψε μία προειδοποίηση",
        "upload-dialog-button-cancel": "Ακύρωση",
        "upload-dialog-button-done": "Ολοκληρώθηκε",
        "upload-dialog-button-save": "Αποθήκευση",
        "upload-dialog-button-upload": "Ανέβασμα",
-       "upload-dialog-label-select-file": "Επιλογή αρχείου",
-       "upload-dialog-label-infoform-title": "Λεπτομέρειες",
-       "upload-dialog-label-infoform-name": "Όνομα",
-       "upload-dialog-label-infoform-description": "Περιγραφή",
-       "upload-dialog-label-usage-title": "Χρήση",
-       "upload-dialog-label-usage-filename": "Όνομα αρχείου",
+       "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-infoform-categories": "Κατηγορίες",
+       "foreign-structured-upload-form-label-infoform-date": "Ημερομηνία",
+       "foreign-structured-upload-form-label-own-work-message-default": "Καταλαβαίνω ότι είμαι φόρτωμα αυτό το αρχείο σε ένα κοινόχρηστο αρχείο. Επιβεβαιώνω ότι είμαι τόσο ακόλουθες τους όρους της υπηρεσίας και πολιτικές αδειοδότησης.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Εάν δεν είστε σε θέση να ανεβάσετε αυτό το αρχείο στο πλαίσιο των πολιτικών της shared repository, παρακαλώ κλείστε αυτό το παράθυρο διαλόγου και να επιχειρήσετε μια άλλη μέθοδος.",
        "backend-fail-stream": "Αδύνατη η μετάδοση του αρχείου $1.",
        "backend-fail-backup": "Αδύνατη η δημιουργία αντίγραφου ασφαλείας του αρχείου $1.",
        "backend-fail-notexists": "Το αρχείο $1 δεν υπάρχει.",
        "filerevert-legend": "Επαναφορά αρχείου",
        "filerevert-intro": "Επαναφέρετε το '''[[Media:$1|$1]]''' στην [$4 εκδοχή της $3, $2].",
        "filerevert-comment": "Αιτία:",
-       "filerevert-defaultcomment": "Αναστράφηκε στην εκδοχή της $2, $1",
+       "filerevert-defaultcomment": "Αναστράφηκε στην εκδοχή της $2, $1 ($3)",
        "filerevert-submit": "Αναστροφή",
        "filerevert-success": "Το '''[[Media:$1|$1]]''' έχει αναστραφεί στην [$4 εκδοχή της $3, $2].",
        "filerevert-badversion": "Δεν υπάρχει προηγούμενη τοπική έκδοση αυτού του αρχείου με την χρονική σφραγίδα που παραχωρήθηκε.",
        "nopagetext": "Η σελίδα στόχος που καταχωρίσατε δεν υπάρχει.",
        "pager-newer-n": "{{PLURAL:$1|1 νεώτερου|$1 νεώτερων}}",
        "pager-older-n": "{{PLURAL:$1|1 παλαιότερο|$1 παλαιότερα}}",
-       "suppress": "ΠαÏ\81Ï\8cÏ\81αμα",
+       "suppress": "ΠεÏ\81ιοÏ\81ιÏ\83μÏ\8cÏ\82",
        "querypage-disabled": "Αυτή η ειδική σελίδα είναι απενεργοποιημένη για λόγους απόδοσης.",
        "apihelp": "Βοήθεια API",
        "apihelp-no-such-module": "Το Module \"$1\" δεν βρέθηκε.",
        "emailccsubject": "Αντίγραφο του μηνυματός σας στο $1: $2",
        "emailsent": "Το μήνυμα έχει σταλεί",
        "emailsenttext": "Το μήνυμά σας έχει σταλεί.",
-       "emailuserfooter": "Αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου στάλθηκε από {{GENDER:$1|το χρήστη|τη χρήστρια}} $1 σ{{GENDER:$2|το χρήστη|τη χρήστρια}} $2 μέσω της λειτουργίας «{{int:emailuser}}» στο {{SITENAME}}.",
+       "emailuserfooter": "Αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου στάλθηκε από {{GENDER:$1|το χρήστη|τη χρήστρια}} $1 {{GENDER:$2|στο χρήστη|στη χρήστρια}} $2 μέσω της λειτουργίας «{{int:emailuser}}» στο {{SITENAME}}.",
        "usermessage-summary": "Φεύγετε από τις ειδοποιήσεις συστήματος.",
        "usermessage-editor": "Μηνύματα συστήματος",
        "usermessage-template": "MediaWiki:UserMessage",
        "deletepage": "Διαγραφή σελίδας",
        "confirm": "Επιβεβαίωση",
        "excontent": "το περιεχόμενο ήταν: '$1'",
-       "excontentauthor": "το περιεχόμενο ήταν: '$1' (και οι μοναδικές συνεισφορές ήταν του '$2')",
+       "excontentauthor": "το περιεχόμενο ήταν: \"$1\", (και οι μοναδικές συνεισφορές ήταν του \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|συζήτηση]])",
        "exbeforeblank": "το περιεχόμενο πριν τη διαγραφή ήταν: «$1»",
        "delete-confirm": "Διαγραφή του \"$1\"",
        "delete-legend": "Διαγραφή",
        "changecontentmodel-title-label": "Τίτλος σελίδας",
        "changecontentmodel-model-label": "Νέο μοντέλο περιεχομένου",
        "changecontentmodel-reason-label": "Αιτία:",
+       "changecontentmodel-success-title": "Το περιεχόμενο πρότυπο άλλαξε",
        "logentry-contentmodel-change": "{{GENDER:$2|Ο|Η}} $1 άλλαξε το πρότυπο περιεχομένου της σελίδας $3 από «$4» σε «$5»",
        "logentry-contentmodel-change-revertlink": "αναστροφή",
        "logentry-contentmodel-change-revert": "αναστροφή",
        "move-page-legend": "Μετακίνηση σελίδας",
        "movepagetext": "Χρησιμοποιώντας τη φόρμα που ακολουθεί θα γίνει μετονομασία σελίδας, μεταφέροντας όλο το ιστορικό της στο νέο όνομα.\nΟ παλιός τίτλος της σελίδας θα γίνει σελίδα ανακατεύθυνσης προς τον νέο τίτλο.\nΜπορείτε να ενημερώσετε αυτόματα τις ανακατευθύνσεις που οδηγούν στον αρχικό τίτλο.\nΑν επιλέξετε να μην ενημερωθούν αυτόματα, μην ξεχάσετε να ελέγξετε για [[Special:DoubleRedirects|διπλές]] ή [[Special:BrokenRedirects|κατεστραμμένες ανακατευθύνσεις]].\nΕίναι δική σας ευθύνη να επιβεβαιώσετε ότι οι σύνδεσμοι εξακολουθούν να δείχνουν προς τη σωστή κατεύθυνση.\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": "Η σελίδα συζήτησης που αντιστοιχεί, εάν υπάρχει, θα μετακινηθεί αυτόματα μαζί με αυτήν '''έκτός αν:'''\n*Μετακινείτε τη σελίδα σε διαφορετική περιοχή (namespace),\n*Υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή, ή\n*Έχετε αφαιρέσει τη σημείωση (check) από το κουτάκι που υπάρχει παρακάτω.\n\nΣε αυτές τις περιπτώσεις, θα πρέπει να μετακινήσετε (ή να ενσωματώσετε αν το θέλετε) τη σελίδα με αντιγραφή-και-επικόλληση.",
-       "movearticle": "Μετακίνηση σελίδας",
+       "movepagetalktext": "Αν τσεκάρετε αυτό το κουτί, η σχετιζόμενη σελίδα συζήτησης θα μετακινηθεί αυτόματα στο νέο τίτλο, εκτός αν υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή.\n\nΣε αυτή την περίπτωση, θα πρέπει να μετακινήσετε ή να συγχωνεύσετε τη σελίδα με το χέρι αν είναι επιθυμητό.",
        "moveuserpage-warning": "'''Προσοχή:''' Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Σημειώστε παρακαλώ ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης '''δεν''' θα μετονομαστεί.",
        "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πάτε να μετακινήσετε μια σελίδα κατηγορίας. Παρακαλούμε να σημειωθεί ότι μόνο η σελίδα θα μετακινηθεί και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα επανακατηγοριοποιηθούν στη νέα κατηγορία.",
        "movenologintext": "Για να μετακινήσετε μια σελίδα πρέπει να είστε εγγεγραμένος χρήστης και [[Special:UserLogin|να έχετε συνδεθεί]] στο Wiκi.",
        "cant-move-to-user-page": "Δεν έχετε άδεια για να μετακινήσετε μια σελίδα σε σελίδα χρήστη (παρά μόνο σε υποσελίδα χρήστη).",
        "cant-move-category-page": "Δεν έχετε άδεια να μετακινείτε σελίδες κατηγοριών.",
        "cant-move-to-category-page": "Δεν έχετε άδεια να μετακινήσετε μια σελίδα σε σελίδα της κατηγορίας.",
-       "newtitle": "νέοÏ\82 Ï\84ίÏ\84λοÏ\82",
+       "newtitle": "Î\9dέοÏ\82 Ï\84ίÏ\84λοÏ\82:",
        "move-watch": "Παρακολούθησε αυτή τη σελίδα",
        "movepagebtn": "Μετακίνηση σελίδας",
        "pagemovedsub": "Η μετακίνηση ήταν επιτυχής",
        "api-error-badaccess-groups": "Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.",
        "api-error-badtoken": "Εσωτερικό σφάλμα: εσφαλμένο διακριτικό.",
        "api-error-copyuploaddisabled": "Η επιφόρτωση από URL είναι απενεργοποιημένη σε αυτόν το διακομιστή.",
-       "api-error-duplicate": "{{PLURAL:$1|Υπάρχει  [$2 άλλο αρχείο]|Υπάρχουν [$2 άλλα αρχεία]}} ήδη στον ιστότοπο με το ίδιο περιεχόμενο.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Υπήρχε ήδη [$2 άλλο αρχείο] |Υπήρχαν ήδη [$2 άλλα αρχεία]}} στον ιστότοπο με το ίδιο περιεχόμενο, αλλά {{PLURAL:$1|διαγράφηκε|διαγράφηκαν}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Διπλότυπο αρχείο που έχει|Διπλότυπα αρχεία που έχουν}}  ήδη διαγραφεί",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Διπλότυπο αρχείο|Διπλότυπα αρχεία}}",
+       "api-error-duplicate": "Υπάρχει το{{PLURAL:$1|είναι ένα άλλο αρχείο|είναι κάποια άλλα αρχεία}} ήδη στο site με το ίδιο περιεχόμενο.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Υπήρχε ήδη άλλο αρχείο|Υπήρχαν ήδη άλλα αρχεία}} στον ιστότοπο με το ίδιο περιεχόμενο, αλλά {{PLURAL:$1|διαγράφηκε|διαγράφηκαν}}.",
        "api-error-empty-file": "Το αρχείο που υποβάλλατε ήταν κενό.",
        "api-error-emptypage": "Η δημιουργία νέων, κενών σελιδών δεν επιτρέπετε.",
        "api-error-fetchfileerror": "Εσωτερικό σφάλμα: κάτι πήγε στραβά κατά την ανάκτηση του αρχείου.",
        "api-error-stashfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-publishfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-stasherror": "Παρουσιάστηκε ένα σφάλμα κατά το ανέβασμα του αρχείου στην κρύπτη.",
+       "api-error-stashzerolength": "Ο διακομιστής δεν θα μπορούσε να κρύψει το αρχείο, επειδή είχε μηδενικό μήκος.",
        "api-error-timeout": "Ο διακομιστής δεν αποκρίθηκε εντός του αναμενόμενου χρόνου.",
        "api-error-unclassified": "Προέκυψε ένα άγνωστο σφάλμα.",
        "api-error-unknown-code": "Άγνωστο σφάλμα: \"$1\"",
        "right-pagelang": "Αλλαγή γλώσσας σελίδας",
        "action-pagelang": "αλλαγή της γλώσσας σελίδας",
        "log-name-pagelang": "Αρχείο καταγραφών αλλαγών γλώσσας",
+       "log-description-pagelang": "Αυτό είναι ένα αρχείο καταγραφής των αλλαγών στη σελίδα γλώσσες.",
        "logentry-pagelang-pagelang": "{{GENDER:$2|Ο|Η}} $1 άλλαξε τη γλώσσα σελίδας της σελίδας $3 από $4 σε $5.",
+       "default-skin-not-found": "Ουπς! Το default skin για το wiki, που ορίζεται στο <code dir=\"ltr\">$wgDefaultSkin</code> ως <code>$1</code>, δεν είναι διαθέσιμη.\n\nΗ εγκατάσταση φαίνεται να περιλαμβάνει τις ακόλουθες {{PLURAL:$4|δερμάτων|δέρματα}}. Δείτε [https://www.mediawiki.org/wiki/Manual:Skin_configuration Εγχειρίδιο: Δέρμα διαμόρφωση] για πληροφορίες σχετικά με τον τρόπο για να ενεργοποιήσετε {{PLURAL:$4|it|και να επιλέξετε το default}}.\n\n$2\n\n; Αν έχετε μόλις εγκαταστήσει το MediaWiki:\n: Πιθανότατα εγκατεστημένο από το git, ή απευθείας από τον πηγαίο κώδικα χρησιμοποιώντας κάποια άλλη μέθοδο. Αυτό είναι αναμενόμενο. Δοκιμάστε να εγκαταστήσετε κάποια δέρματα από [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org δέρματος, κατάλογος]:\n:* Τη λήψη του [https://www.mediawiki.org/wiki/Download tarball installer], το οποίο έρχεται με πολλά δέρματα και επεκτάσεις. Μπορείτε να αντιγράψετε και να επικολλήσετε τα <code>δέρματα/</code> directory.\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 Χρησιμοποιώντας το Git για να κατεβάσετε τα δέρματα].\n: Το κάνεις αυτό δεν πρέπει να παρεμβαίνει με το git repository αν είσαι MediaWiki προγραμματιστής.\n\n; Αν έχετε μόλις αναβαθμίσει MediaWiki:\n: Το MediaWiki 1.24 και νεότερα πλέον να ενεργοποιεί αυτόματα τα εγκατεστημένα δέρματα (βλέπε [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Εγχειρίδιο: Δέρμα autodiscovery]). Μπορείτε να επικολλήσετε το παρακάτω {{PLURAL:$5|γραμμή|γραμμές}} σε <code>LocalSettings.php</code> για να ενεργοποιήσετε {{PLURAL:$5|η|all}} εγκατασταθεί {{PLURAL:$5|δερμάτων|δέρματα}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Αν έχετε μόλις τροποποιήσατε <code>LocalSettings.php</code>:\n: Ελέγξτε το δέρμα ονόματα για τυπογραφικά λάθη.",
+       "default-skin-not-found-no-skins": "Ουπς! Το default skin για το wiki, που ορίζεται στο <code>$wgDefaultSkin</code> ως <code>$1</code>, δεν είναι διαθέσιμη.\n\nΔεν έχετε κανένα εγκατεστημένο δέρματα.\n\n; Αν έχετε μόλις εγκαταστήσει ή να αναβαθμιστούν MediaWiki:\n: Πιθανότατα εγκατεστημένο από το git, ή απευθείας από τον πηγαίο κώδικα χρησιμοποιώντας κάποια άλλη μέθοδο. Αυτό είναι αναμενόμενο. Το MediaWiki 1.24 και νεότερη έκδοση δεν περιλαμβάνει κανένα από τα δέρματα στο κύριο αποθετήριο. Δοκιμάστε να εγκαταστήσετε κάποια δέρματα από [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org δέρματος, κατάλογος]:\n:* Τη λήψη του [https://www.mediawiki.org/wiki/Download tarball installer], το οποίο έρχεται με πολλά δέρματα και επεκτάσεις. Μπορείτε να αντιγράψετε και να επικολλήσετε τα <code>δέρματα/</code> directory.\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 Χρησιμοποιώντας το Git για να κατεβάσετε τα δέρματα].\n: Το κάνεις αυτό δεν πρέπει να παρεμβαίνει με το git repository αν είσαι MediaWiki προγραμματιστής. Δείτε [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": "Στατιστικά πολυμέσων",
        "mediastatistics-header-text": "Μορφές κειμένου",
        "mediastatistics-header-executable": "Εκτελέσιμα",
        "mediastatistics-header-archive": "Συμπιεσμένες μορφές",
+       "json-warn-trailing-comma": "$1 σύροντας {{PLURAL:$1|κόμμα|κόμματα είχαν}} αφαιρεθεί από JSON",
        "json-error-unknown": "Υπήρξε πρόβλημα με το JSON. Σφάλμα: $1",
        "json-error-depth": "Το μέγιστο βάθος στοίβας έχει ξεπεραστεί",
        "json-error-state-mismatch": "Μη έγκυρο ή λάθος μορφοποιημένο JSON",
index 6218d70..2005ee8 100644 (file)
        "viewsource": "View source",
        "viewsource-title": "View source for $1",
        "actionthrottled": "Action throttled",
-       "actionthrottledtext": "As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
+       "actionthrottledtext": "As an anti-abuse measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
        "protectedpagetext": "This page has been protected to prevent editing or other actions.",
        "viewsourcetext": "You can view and copy the source of this page.",
        "viewyourtext": "You can view and copy the source of <strong>your edits</strong> to this page.",
        "createacct-imgcaptcha-help": "",
        "createacct-imgcaptcha-ph": "Enter the text you see above",
        "createacct-submit": "Create your account",
-       "createacct-another-submit": "Create another account",
+       "createacct-another-submit": "Create account",
        "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
        "createacct-benefit-icon1": "icon-edits",
        "createacct-benefit-head1": "{{NUMBEROFEDITS}}",
        "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": "A password reset email has been sent.",
+       "passwordreset-emailsent": "If this is a registered email address for your account, 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 email address",
+       "changeemail": "Change or remove email address",
        "changeemail-summary": "",
-       "changeemail-text": "Complete this form to change your email address. You will need to enter your password to confirm this change.",
+       "changeemail-text": "Complete this form to change your email address. You will need to enter your password to confirm this change. If you would like to remove the association of any email address from your account, leave the new email address blank when submitting the form.",
        "changeemail-no-info": "You must be logged in to access this page directly.",
        "changeemail-oldemail": "Current email address:",
        "changeemail-newemail": "New email address:",
+       "changeemail-newemail-help": "This field should be left blank if you want to remove your email address. You will not be able to reset a forgotten password and will not receive emails from this wiki if the email address is removed.",
        "changeemail-none": "(none)",
        "changeemail-password": "Your {{SITENAME}} password:",
        "changeemail-submit": "Change email",
        "mergehistory-go": "Show mergeable edits",
        "mergehistory-submit": "Merge revisions",
        "mergehistory-empty": "No revisions can be merged.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} of $1 {{PLURAL:$3|was|were}} merged into [[:$2]].",
        "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
        "mergehistory-fail-toobig" : "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.",
        "mergehistory-no-source": "Source page $1 does not exist.",
        "prefs-watchlist-token": "Watchlist token:",
        "prefs-misc": "Misc",
        "prefs-resetpass": "Change password",
-       "prefs-changeemail": "Change email address",
+       "prefs-changeemail": "Change or remove email address",
        "prefs-setemail": "Set an email address",
        "prefs-email": "Email options",
        "prefs-rendering": "Appearance",
        "group-bot": "Bots",
        "group-sysop": "Administrators",
        "group-bureaucrat": "Bureaucrats",
-       "group-suppress": "Oversights",
+       "group-suppress": "Suppressors",
        "group-all": "(all)",
        "group-user-member": "{{GENDER:$1|user}}",
        "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmed user}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureaucrat}}",
-       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "group-suppress-member": "{{GENDER:$1|suppressor}}",
        "grouppage-user": "{{ns:project}}:Users",
        "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed users",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administrators",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "grouppage-suppress": "{{ns:project}}:Suppress",
        "right-read": "Read pages",
        "right-edit": "Edit pages",
        "right-createpage": "Create pages (which are not discussion pages)",
        "recentchangeslinked-summary": "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).\nPages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
        "recentchangeslinked-page": "Page name:",
        "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
+       "recentchanges-page-added-to-category": "[[:$1]] added to category",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} added to category",
+       "recentchanges-page-removed-from-category": "[[:$1]] removed from category",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} removed from category",
+       "autochange-username": "MediaWiki automatic change",
        "upload": "Upload file",
        "uploadbtn": "Upload file",
        "reuploaddesc": "Cancel upload and return to the upload form",
        "upload-options": "Upload options",
        "watchthisupload": "Watch this file",
        "filewasdeleted": "A file of this name has been previously uploaded and subsequently deleted.\nYou should check the $1 before proceeding to upload it again.",
+       "filename-thumb-name": "This looks like a thumbnail title. Please do not upload thumbnails back to the same wiki. Otherwise, please fix the filename so it is more meaningful, and does not have the thumbnail prefix.",
        "filename-bad-prefix": "The name of the file you are uploading begins with <strong>\"$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.\nPlease choose a more descriptive name for your file.",
        "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-success-subj": "Successful upload",
        "upload-http-error": "An HTTP error occurred: $1",
        "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
        "upload-dialog-title": "Upload file",
-       "upload-dialog-error": "An error occurred",
-       "upload-dialog-warning": "A warning occurred",
        "upload-dialog-button-cancel": "Cancel",
        "upload-dialog-button-done": "Done",
        "upload-dialog-button-save": "Save",
        "upload-dialog-button-upload": "Upload",
-       "upload-dialog-label-select-file": "Select file",
-       "upload-dialog-label-infoform-title": "Details",
-       "upload-dialog-label-infoform-name": "Name",
-       "upload-dialog-label-infoform-description": "Description",
-       "upload-dialog-label-usage-title": "Usage",
-       "upload-dialog-label-usage-filename": "File name",
+       "upload-process-error": "An error occurred",
+       "upload-process-warning": "A warning occurred",
+       "upload-form-label-select-file": "Select file",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Name",
+       "upload-form-label-infoform-description": "Description",
+       "upload-form-label-usage-title": "Usage",
+       "upload-form-label-usage-filename": "File name",
+       "foreign-structured-upload-form-label-own-work": "This is my own work",
+       "foreign-structured-upload-form-label-infoform-categories": "Categories",
+       "foreign-structured-upload-form-label-infoform-date": "Date",
+       "foreign-structured-upload-form-label-own-work-message-default": "I understand that I am uploading this file to a shared repository. I confirm that I am doing so following the terms of service and licensing policies there.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "If you are not able to upload this file under the policies of the shared repository, please close this dialog and try another method.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if this file can be uploaded there under their policies.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "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-wikimediacommons": "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-wikimediacommons": "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.",
        "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.",
        "filerevert-legend": "Revert file",
        "filerevert-intro": "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
        "filerevert-comment": "Reason:",
-       "filerevert-defaultcomment": "Reverted to version as of $2, $1",
+       "filerevert-defaultcomment": "Reverted to version as of $2, $1 ($3)",
        "filerevert-submit": "Revert",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
        "filerevert-badversion": "There is no previous local version of this file with the provided timestamp.",
        "nopagetext": "The target page you have specified does not exist.",
        "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
        "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
-       "suppress": "Oversight",
+       "suppress": "Suppress",
        "querypage-disabled": "This special page is disabled for performance reasons.",
        "apihelp": "API help",
        "apihelp-summary": "",
        "emailccsubject": "Copy of your message to $1: $2",
        "emailsent": "Email sent",
        "emailsenttext": "Your email message has been sent.",
-       "emailuserfooter": "This email was sent by $1 to $2 by the \"{{int:emailuser}}\" function at {{SITENAME}}.",
+       "emailuserfooter": "This email was {{GENDER:$1|sent}} by $1 to {{GENDER:$2|$2}} by the \"{{int:emailuser}}\" function at {{SITENAME}}.",
        "usermessage-summary": "Leaving system message.",
        "usermessage-editor": "System messenger",
        "usermessage-template": "MediaWiki:UserMessage",
        "deletepage": "Delete page",
        "confirm": "Confirm",
        "excontent": "content was: \"$1\"",
-       "excontentauthor": "content was: \"$1\" (and the only contributor was \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "content was: \"$1\", and the only contributor was \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "content before blanking was: \"$1\"",
        "delete-confirm": "Delete \"$1\"",
        "delete-legend": "Delete",
        "move-page-legend": "Move page",
        "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
        "movepagetext-noredirectfixer": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
-       "movepagetalktext": "The associated talk page will be automatically moved along with it <strong>unless:</strong>\n*A non-empty talk page already exists under the new name, or\n*You uncheck the box below.\n\nIn those cases, you will have to move or merge the page manually if desired.",
-       "movearticle": "Move page:",
+       "movepagetalktext": "If you check this box, the associated talk page will be automatically moved to new title, unless a non-empty talk page already exists there.\n\nIn this case, you will have to move or merge the page manually if desired.",
        "moveuserpage-warning": "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
        "movecategorypage-warning": "<strong>Warning:</strong> You are about to move a category page. Please note that only the page will be moved and any pages in the old category will <em>not</em> be recategorized into the new one.",
        "movenologintext": "You must be a registered user and [[Special:UserLogin|logged in]] to move a page.",
        "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
        "cant-move-category-page": "You do not have permission to move category pages.",
        "cant-move-to-category-page": "You do not have permission to move a page to a category page.",
-       "newtitle": "To new title:",
+       "newtitle": "New title:",
        "move-watch": "Watch source page and target page",
        "movepagebtn": "Move page",
        "pagemovedsub": "Move succeeded",
        "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",
        "sqlite-has-fts": "$1 with full-text search support",
        "sqlite-no-fts": "$1 without full-text search support",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
        "logentry-newusers-byemail": "User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email",
        "logentry-newusers-autocreate": "User account $1 was {{GENDER:$2|created}} automatically",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|moved}} protection settings from $4 to $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|removed}} protection from $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protected}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protected}} $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|changed}} protection level for $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|changed}} protection level for $3 $4 [cascading]",
        "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
        "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
index 0ff7744..d3508b1 100644 (file)
@@ -40,7 +40,9 @@
                        "아라",
                        "Fitoschido",
                        "Sudastelaro",
-                       "Ochilov"
+                       "Ochilov",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Substreki ligilojn",
        "nstab-template": "Ŝablono",
        "nstab-help": "Helpo",
        "nstab-category": "Kategorio",
+       "mainpage-nstab": "Ĉefpaĝo",
        "nosuchaction": "Ne ekzistas tia ago",
        "nosuchactiontext": "La ago nomita de la URL estas malvalida.\nEble vi mistajpis la URL-on, aŭ sekvis malvalidan ligilon.\nEble ankaŭ ĉi tiel indikus problemon de la programaro de {{SITENAME}}.",
        "nosuchspecialpage": "Ne ekzistas tia speciala paĝo",
        "mergehistory-go": "Montri kunigeblajn redaktojn",
        "mergehistory-submit": "Kunigi versiojn",
        "mergehistory-empty": "Neniuj versioj estas kunigeblaj.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versio|versioj}} de [[:$1]] sukcese {{PLURAL:$3|kunigita|kunigitaj}} en [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versio|versioj}} de $1 sukcese {{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.",
        "filerevert-legend": "Restarigi dosieron",
        "filerevert-intro": "Vi restarigas '''[[Media:$1|$1]]''' al la [$4 versio de $3, $2].",
        "filerevert-comment": "Kialo:",
-       "filerevert-defaultcomment": "Restarigita al versio ekde $2, $1",
+       "filerevert-defaultcomment": "Restarigita al versio ekde $2, $1 ($3)",
        "filerevert-submit": "Restarigi",
        "filerevert-success": "'''[[Media:$1|$1]]''' estis restarigita al [$4 versio ekde $3, $2].",
        "filerevert-badversion": "Ne estas antaŭa loka versio de ĉi tiu dosiero ĉe tiu tempo.",
        "movepagetext": "Per la jena formulo vi povas ŝanĝi la nomon de iu paĝo, kunportante ĝian historion de redaktoj al la nova nomo.\nLa antaŭa titolo fariĝos alidirektilo al la nova titolo.\nVi povas ĝisdatigi alidirektilojn kiu indikas la originalan titolon aŭtomate.\nSe vi elektas ĝisdatigi permane, bonvolu kontroli [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|rompitajn alidirektilojn]].\nVi estas responsa por certigi ke ligilojn direktas fidinde.\n\nNotu, ke la paĝo '''ne''' estos movita se jam ekzistas paĝo ĉe la nova titolo, krom se tiu loko estas malplena aŭ alidirektilo al ĉi tiu paĝo, kaj sen antaŭa redaktohistorio.\nPro tio, vi ja povos removi la paĝon je la antaŭa titolo se vi mistajpus, kaj ne povas forviŝi ekzistantan paĝon per movo.\n\n'''AVERTO!'''\nTio povas esti drasta kaj neatendita ŝanĝo por populara paĝo;\nbonvolu certigi vin, ke vi komprenas ties konsekvencojn antaŭ ol vi antaŭeniru.",
        "movepagetext-noredirectfixer": "Per jena formularo vi povas alinomigi paĝon, kaj movi tutan ĝian redaktohistorion al la nova nomo. \nLa antaŭa titolo alidirektigos onin al la nova titolo.\nKontrolu pri [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|nefunkciantajn alidirektilojn]].\nVi respondecas pri tio ke ligoj restas montrantaj ĝustadirekten.\n\nKonsciu ke la paĝo '''ne'' estas movota se jam ekzistas paĝo havanta la novan titolon, krom se ĝi maplenas aŭ estas alidirektilo sen antaŭa redaktohistorio.\nTio ĉi signifas ke vi povas alinomigi paĝon reen al antaŭa nomo se vi eraras, kaj vi ke vi ne povas anstataŭigi ekzistantan paĝon.\n\n'''Averto!''\nEblas ke tio ĉi estas drasta kaj neatendita ŝanĝo de populara paĝo;\nAntaŭ daŭrigi, bonvolu certiĝi, ke vi komprenas la konsekvencojn de tiuj ĉi ŝanĝo.",
        "movepagetalktext": "La movo aŭtomate kunportos la diskuto-paĝon, se tia ekzistas, '''krom se:'''\n*Vi movas la paĝon tra nomspacoj (ekz de ''Nomo'' je ''User:Nomo''),\n*Ne malplena diskuto-paĝo jam ekzistas je la nova nomo, aŭ\n*Vi malelektas la suban ŝaltilon.\n\nTiujokaze, vi nepre permane kunigu la diskuto-paĝojn se vi tion deziras.",
-       "movearticle": "Alinomi paĝon",
        "moveuserpage-warning": "<strong>Averto:</strong> Vi preskaŭ alinomas paĝon de uzanto. Bonvolu noti ke nur la paĝo estos alinomita kaj la uzanto mem <em>ne</em> estos alinomita.",
        "movecategorypage-warning": "<strong>Averto:</strong> Vi baldaŭ movos kategorian paĝon. Bonvolu noti ke, nur la paĝo estos movita, kaj la paĝoj en la malnova kategorio <em>ne</em> transiros en la novan kategorion.",
        "movenologintext": "Vi nepre estu registrita uzanto kaj [[Special:UserLogin|ensalutu]] por rajti movi paĝojn.",
        "api-error-badaccess-groups": "Vi ne havas permeson alŝuti dosierojn al tiu ĉi vikio.",
        "api-error-badtoken": "Interna eraro: fuŝaĵo.",
        "api-error-copyuploaddisabled": "Alŝuto per URL-adreso estas malebligata en tiu ĉi servilo.",
-       "api-error-duplicate": "Jam estas {{PLURAL:$1|[$2 alia dosiero]|[$2 pluraj aliaj dosieroj]}} de sama enhavo en la retejo.",
-       "api-error-duplicate-archive": "Jam estis {{PLURAL:$1|[$2 alia dosiero]|[$2 pluraj aliaj dosieroj]}} de sama enhavo en la retejo, sed {{PLURAL:$1|ĝi estis forigita|ili estis forigitaj}}.",
-       "api-error-duplicate-archive-popup-title": "Duoblaj {{PLURAL:$1|dosiero|dosieroj}} kiuj jam estas forigitaj",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duobla dosiero|Duoblaj dosieroj}}",
+       "api-error-duplicate": "Jam estas {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} de sama enhavo en la retejo.",
+       "api-error-duplicate-archive": "Jam estis {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} de sama enhavo en la retejo, sed {{PLURAL:$1|ĝi estis forigita|ili estis forigitaj}}.",
        "api-error-empty-file": "La dosiero kiun vi sendis estis malplena.",
        "api-error-emptypage": "Kreo de novaj malplenaj paĝoj ne estas permesita.",
        "api-error-fetchfileerror": "Interna eraro: io misfunkciis dum la dosiera prenado.",
index 280c8c6..4e86994 100644 (file)
        "nstab-template": "Plantilla",
        "nstab-help": "Ayuda",
        "nstab-category": "Categoría",
+       "mainpage-nstab": "Página principal",
        "nosuchaction": "No existe esa acción",
        "nosuchactiontext": "La acción especificada en la URL no es válida.\nEs posible que hayas escrito mal la URL o que hayas seguido un enlace incorrecto.\nEsto también podría indicar un error en el software utilizado por {{SITENAME}}.",
        "nosuchspecialpage": "No existe esa página especial",
        "viewsource": "Ver código",
        "viewsource-title": "Ver el código de «$1»",
        "actionthrottled": "Acción limitada",
-       "actionthrottledtext": "Como medida contra el ''spam'', la acción que estás realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y has excedido ese límite. Por favor inténtalo de nuevo en unos minutos.",
+       "actionthrottledtext": "Como medida contra los abusos, la acción que estás realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y has excedido ese límite.\nInténtalo de nuevo en unos minutos.",
        "protectedpagetext": "Esta página ha sido protegida para evitar su edición u otras acciones.",
        "viewsourcetext": "Puedes ver y copiar el código fuente de esta página.",
        "viewyourtext": "Puedes ver y copiar el código de <strong>tus ediciones</strong> en esta página.",
        "createacct-captcha": "Comprobación de seguridad",
        "createacct-imgcaptcha-ph": "Escribe el texto de arriba",
        "createacct-submit": "Crea tu cuenta",
-       "createacct-another-submit": "Crear otra cuenta",
+       "createacct-another-submit": "Crear cuenta",
        "createacct-benefit-heading": "Personas como tú son las que construyen {{SITENAME}}.",
        "createacct-benefit-body1": "{{PLURAL:$1|edición|ediciones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "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": "Se ha enviado un correo electrónico para el restablecimiento de tu contraseña.",
+       "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-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 la dirección de correo electrónico",
+       "changeemail": "Cambiar o eliminar la dirección de correo electrónico",
        "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes escribir tu contraseña para confirmar este cambio.",
        "changeemail-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
        "changeemail-oldemail": "Dirección de correo electrónico actual:",
        "permissionserrorstext-withaction": "No tienes permiso para $2, por {{PLURAL:$1|el siguiente motivo|los siguientes motivos}}:",
        "recreate-moveddeleted-warn": "<strong>Atención: estás volviendo a crear una página que ha sido borrada anteriormente.</strong>\n\nPiensa si es adecuado continuar editando la página.\nA continuación, se proporciona el registro de borrado y traslados de esta página para más información:",
        "moveddeleted-notice": "Esta página ha sido borrada.\nA continuación, se proporciona el registro de borrados y traslados de la página para más información.",
+       "moveddeleted-notice-recent": "Esta página se ha eliminado recientemente (dentro de las últimas 24 horas).\nEl registro de eliminación y traslado de la página se muestran a continuación como referencia.",
        "log-fulllog": "Ver el registro completo",
        "edit-hook-aborted": "Una extensión ha evitado la edición.\nNo hay explicación disponible.",
        "edit-gone-missing": "No se ha podido actualizar la página.\nParece haber sido borrada.",
        "mergehistory-go": "Mostrar ediciones fusionables",
        "mergehistory-submit": "Fusionar revisiones",
        "mergehistory-empty": "No hay revisiones fusionables.",
-       "mergehistory-success": "Se {{PLURAL:$3|fusionó una revisión|fusionaron $3 revisiones}} de «[[:$1]]» en «[[:$2]]» correctamente.",
+       "mergehistory-done": "Se {{PLURAL:$3|fusionó una revisión|fusionaron $3 revisiones}} de $1 en [[:$2]].",
        "mergehistory-fail": "No se puede realizar la fusión de historiales, por favor revisa la página y los parámetros de tiempo.",
        "mergehistory-fail-toobig": "No se puede fusionar el historial ya que más del límite de $1 {{PLURAL:$1|revisión|revisiones}} se moverían.",
        "mergehistory-no-source": "La página origen $1 no existe.",
        "textmatches": "Resultados por texto de página",
        "notextmatches": "No hay resultados por texto de página",
        "prevn": "$1 {{PLURAL:$1|anterior|anteriores}}",
-       "nextn": "{{PLURAL:$1|$1}} siguientes",
+       "nextn": "{{PLURAL:$1|siguiente|siguientes $1}}",
        "prev-page": "página anterior",
        "next-page": "página siguiente",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "prefs-watchlist-token": "Clave de lista de seguimiento:",
        "prefs-misc": "Miscelánea",
        "prefs-resetpass": "Cambiar contraseña",
-       "prefs-changeemail": "Cambiar la dirección de correo electrónico",
+       "prefs-changeemail": "Cambiar o eliminar la dirección de correo electrónico",
        "prefs-setemail": "Establecer una dirección de correo electrónico",
        "prefs-email": "Opciones de correo electrónico",
        "prefs-rendering": "Apariencia",
        "recentchangeslinked-summary": "Esta página es una lista de los últimos cambios en las páginas enlazadas desde una página dada (o en las pertenecientes a una categoría dada). Las páginas que están en tu [[Special:Watchlist|lista de seguimiento]] aparecen en <strong>negrita</strong>.",
        "recentchangeslinked-page": "Nombre de la página:",
        "recentchangeslinked-to": "Mostrar los cambios en páginas enlazadas con la página seleccionada",
+       "recentchanges-page-added-to-category": "[[:$1]] añadida a la categoría",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] y {{PLURAL:$2|una página|$2 páginas}} añadidas a la categoría",
+       "recentchanges-page-removed-from-category": "[[:$1]] eliminada de la categoría",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] y {{PLURAL:$2|una página|$2 páginas}} eliminadas de la categoría",
+       "autochange-username": "Cambio automático de MediaWiki",
        "upload": "Subir archivo",
        "uploadbtn": "Subir un archivo",
        "reuploaddesc": "Cancelar subida y volver al formulario",
        "upload-permitted": "{{PLURAL:$2|Tipo de archivo permitido|Tipos de archivo permitidos}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Tipo de archivo preferido|Tipos de archivo preferidos}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Tipo de archivo prohibido|Tipos de archivo prohibidos}}: $1.",
-       "uploadlogpage": "Subidas de archivos",
+       "uploadlogpage": "Registro de subidas",
        "uploadlogpagetext": "Debajo se muestra una lista de los últimos archivos subidos.\nVéase la [[Special:NewFiles|galería de archivos nuevos]] para una vista más estilizada",
        "filename": "Nombre del archivo",
        "filedesc": "Resumen",
        "uploaddisabled": "Se desactivó la subida de archivos.",
        "copyuploaddisabled": "Se desactivó la subida de archivos mediante URL.",
        "uploaddisabledtext": "Se desactivó la subida de archivos.",
-       "php-uploaddisabledtext": "La subida de archivos está deshabilitada en PHP. Por favor compruebe <code>file_uploads</code> en php.ini.",
+       "php-uploaddisabledtext": "La subida de archivos está deshabilitada en PHP.\nComprueba la opción <code>file_uploads</code>.",
        "uploadscripted": "Este archivo contiene script o código HTML que puede ser interpretado erróneamente por un navegador web.",
        "upload-scripted-pi-callback": "No se pueden cargar archivos que contengan instrucciones de procesamiento en forma de hojas de estilo XML.",
        "uploaded-script-svg": "Se encontró el elemento habilitado para secuencias de órdenes «$1» en el archivo SVG cargado.",
        "uploadjava": "El archivo es un ZIP que contiene un archivo .class de Java.\nNo se permite subir archivos Java, porque pueden causar que se puedan saltar restricciones de seguridad.",
        "upload-source": "Archivo origen",
        "sourcefilename": "Nombre del archivo origen:",
-       "sourceurl": "Dirección original:",
+       "sourceurl": "URL de origen:",
        "destfilename": "Nombre del archivo de destino:",
        "upload-maxfilesize": "Tamaño máximo del archivo: $1",
        "upload-description": "Descripción de archivo",
        "upload-warning-msg": "Hubo un problema con tu subida desde [$2]. Puedes regresar al [[Special:Upload/stash/$1|formulario de subida]] para corregir este problema.",
        "upload-proto-error": "Protocolo incorrecto",
        "upload-proto-error-text": "Para subir archivos desde otra página la URL debe comenzar por <code>http://</code> o <code>ftp://</code>.",
-       "upload-file-error": "Error interno al subir el archivo",
+       "upload-file-error": "Error interno",
        "upload-file-error-text": "Ha ocurrido un error interno mientras se intentaba crear un archivo temporal en el servidor. Contacta con un [[Special:ListUsers/sysop|administrador]].",
        "upload-misc-error": "Error desconocido en la subida",
        "upload-misc-error-text": "Ha ocurrido un error durante la subida.\nVerifica que la URL es válida y accesible e inténtalo de nuevo.\nSi el problema persiste, contacta con un [[Special:ListUsers/sysop|administrador]].",
        "upload-http-error": "Ha ocurrido un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "No se pueden realizar subidas remotas desde este dominio.",
        "upload-dialog-title": "Subir archivo",
-       "upload-dialog-error": "Ha ocurrido un error",
-       "upload-dialog-warning": "Ha ocurrido una advertencia",
        "upload-dialog-button-cancel": "Cancelar",
        "upload-dialog-button-done": "Hecho",
        "upload-dialog-button-save": "Guardar",
        "upload-dialog-button-upload": "Subir",
-       "upload-dialog-label-select-file": "Seleccionar archivo",
-       "upload-dialog-label-infoform-title": "Detalles",
-       "upload-dialog-label-infoform-name": "Nombre",
-       "upload-dialog-label-infoform-description": "Descripción",
-       "upload-dialog-label-usage-title": "Uso",
-       "upload-dialog-label-usage-filename": "Nombre del archivo",
+       "upload-process-error": "Ha ocurrido un error",
+       "upload-process-warning": "Ha ocurrido una advertencia",
+       "upload-form-label-select-file": "Seleccionar archivo",
+       "upload-form-label-infoform-title": "Detalles",
+       "upload-form-label-infoform-name": "Nombre",
+       "upload-form-label-infoform-description": "Descripción",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nombre del archivo",
+       "foreign-structured-upload-form-label-own-work": "Esto es mi trabajo propio",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorías",
+       "foreign-structured-upload-form-label-infoform-date": "Fecha",
        "backend-fail-stream": "No se pudo transmitir el archivo «$1».",
-       "backend-fail-backup": "No pudo hacer copia de seguridad del archivo «$1».",
+       "backend-fail-backup": "No se pudo hacer copia de seguridad del archivo «$1».",
        "backend-fail-notexists": "El archivo  $1  no existe.",
        "backend-fail-hashes": "No se pudieron obtener los \"hashes\" de los archivos para compararlos.",
        "backend-fail-notsame": "Ya existe un archivo distinto en \"$1\".",
        "filerevert-legend": "Reversión de archivos",
        "filerevert-intro": "Estás por revertir <strong>[[Media:$1|$1]]</strong> a la [$4 versión del $2 a las $3].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Revertido a la versión subida el $1 a las $2",
+       "filerevert-defaultcomment": "Revertido a la versión del $1 a las $2 ($3)",
        "filerevert-submit": "Revertir",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> ha sido revertido a la [$4 versión del $2 a las $3].",
        "filerevert-badversion": "No existe versión local previa de este archivo con esa marca de tiempo.",
        "nopagetext": "La página destino que has especificado no existe.",
        "pager-newer-n": "{{PLURAL:$1|1 siguiente|$1 siguientes}}",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
-       "suppress": "Supresor de ediciones",
+       "suppress": "Supresor",
        "querypage-disabled": "Esta página especial está deshabilitada por motivos de rendimiento.",
        "apihelp": "Ayuda de la API",
        "apihelp-no-such-module": "No se encontró el módulo \"$1\".",
        "deletedcontributions": "Contribuciones borradas de usuario",
        "deletedcontributions-title": "Contribuciones borradas de usuario",
        "sp-deletedcontributions-contribs": "contribuciones",
-       "linksearch": "Enlaces externos",
+       "linksearch": "Búsqueda de enlaces externos",
        "linksearch-pat": "Patrón de búsqueda:",
        "linksearch-ns": "Espacio de nombres:",
        "linksearch-ok": "Buscar",
        "emailccsubject": "Copia de tu mensaje a $1: $2",
        "emailsent": "Correo electrónico enviado",
        "emailsenttext": "Se ha enviado tu mensaje de correo electrónico.",
-       "emailuserfooter": "Este correo electrónico fue enviado por $1 a $2 a través de la función «Enviar un correo electrónico a este usuario» en {{SITENAME}}.",
+       "emailuserfooter": "Este correo electrónico fue {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} a través de la función «{{int:emailuser}}» en {{SITENAME}}.",
        "usermessage-summary": "Dejando un mensaje de sistema.",
        "usermessage-editor": "Mensajero del sistema",
        "watchlist": "Lista de seguimiento",
        "deletepage": "Borrar esta página",
        "confirm": "Confirmar",
        "excontent": "el contenido era: «$1»",
-       "excontentauthor": "el contenido era: «$1» (y el único autor fue «[[Special:Contributions/$2|$2]]»)",
+       "excontentauthor": "el contenido era: «$1», y el único autor fue «[[Special:Contributions/$2|$2]]» ([[User talk:$2|discusión]])",
        "exbeforeblank": "El contenido antes de blanquear era: «$1»",
        "delete-confirm": "Borrar «$1»",
        "delete-legend": "Borrar",
        "undeletehistory": "Si restauras la página, todas sus revisiones se restaurarán en el historial.\nSi una nueva página con el mismo nombre se ha creado desde que se borró la original, las versiones restauradas aparecerán en el historial previo.",
        "undeleterevdel": "No se deshará el borrado si éste resulta en el borrado parcial de la última revisión de la página. En tal caso, desmarque o muestre las revisiones borradas más recientes. Las revisiones de archivos que no tiene permitido ver no se restaurarán.",
        "undeletehistorynoadmin": "El artículo ha sido borrado. La razón de su eliminación se indica abajo en el resumen, así como los detalles de las ediciones realizadas antes del borrado. El texto completo del artículo está disponible sólo para usuarios con permisos de administrador.",
-       "undelete-revision": "Edición borrada de $1 (fechada $4, a $5) por $3:",
+       "undelete-revision": "Edición borrada de $1 (fechada el $4, a las $5) por $3:",
        "undeleterevision-missing": "Revisión no válida o perdida. Puede deberse a un enlace incorrecto,\no a que la revisión haya sido restaurada o eliminada del archivo.",
        "undelete-nodiff": "No existe una revisión previa.",
        "undeletebtn": "Restaurar",
        "move-page-legend": "Renombrar página",
        "movepagetext": "Mediante el siguiente formulario puedes renombrar una página, moviendo todo su historial al nombre nuevo.\nEl título anterior redirigirá al nuevo.\nPuedes actualizar automáticamente las redirecciones que apuntan al título original.\nSi eliges no hacerlo, asegúrate de revisar posibles redirecciones [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|rotas]].\nTú eres responsable de asegurar que los enlaces continúen funcionando correctamente.\n\nNota que la página <strong>no</strong> se moverá si ya hay una página con el título nuevo, a menos de que ésta sea una redirección y no tenga historial de ediciones pasadas.\nEsto significa que puedes deshacer el renombrado en caso de un error, y que no puedes sobreescribir una página existente.\n\n<strong>Aviso</strong>\nEsto puede representar un cambio drástico e inesperado para una página popular;\nasegúrate de entender las consecuencias de esta acción antes de proceder.",
        "movepagetext-noredirectfixer": "Usando el siguiente formulario se renombrará una página, trasladando todo su historial al nuevo nombre.\nEl título anterior se convertirá en una redirección al nuevo título.\nAsegúrate de no dejar [[Special:DoubleRedirects|redirecciones dobles]] o [[Special:BrokenRedirects|rotas]].\nTú eres responsable de hacer que los enlaces sigan apuntando adonde se supone que deberían hacerlo.\n\nRecuerda que la página '''no''' será renombrada si ya existe una página con el nuevo título, a no ser que sea una página vacía o una redirección sin historial.\nEsto significa que podrás renombrar una página a su título original si has cometido un error, pero que no podrás sobrescribir una página existente.\n\n'''¡Aviso!'''\nEste puede ser un cambio drástico e inesperado para una página popular;\npor favor, asegúrate de entender las consecuencias del procedimiento antes de seguir adelante.",
-       "movepagetalktext": "La página de discusión asociada se trasladará automáticamente con ella <strong>a menos que:</strong>\n*Una página de discusión no vacía ya exista con el nombre nuevo, o\n*Desmarques la casilla debajo.\n\nEn esos casos, deberás trasladar o fusionar manualmente la página si así lo quieres.",
-       "movearticle": "Renombrar página",
+       "movepagetalktext": "Si marcas esta casilla, la página de discusión asociada se trasladará automáticamente al título nuevo a menos que ya exista una página de discusión no vacía allí.\n\nEn este caso, deberás trasladar o fusionar manualmente la página si así lo quieres.",
        "moveuserpage-warning": "<strong>Advertencia:</strong> estás a punto de trasladar una página de usuario. Ten en cuenta que solo se trasladará la página; el usuario <em>no</em> se renombrará.",
        "movecategorypage-warning": "<strong>Advertencia:</strong> estás a punto de trasladar una página de categoría. Ten en cuenta que se trasladará sólo la página, y las páginas en la antigua categoría <em>no</em> se recategorizarán en la nueva.",
        "movenologintext": "Es necesario ser usuario registrado y [[Special:UserLogin|haber iniciado sesión]] para renombrar una página.",
        "cant-move-to-user-page": "No tienes permiso para trasladar una página a una página de usuario (excepto a subpáginas de usuario).",
        "cant-move-category-page": "No tienes permiso para trasladar páginas de categoría.",
        "cant-move-to-category-page": "No tienes permiso para trasladar una página a una página de categoría.",
-       "newtitle": "A título nuevo:",
+       "newtitle": "Título nuevo:",
        "move-watch": "Vigilar páginas de origen y destino",
        "movepagebtn": "Renombrar página",
        "pagemovedsub": "Renombrado realizado con éxito",
        "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 trasladar [[$1]]",
+       "delete_and_move_reason": "Borrada para permitir el traslado de \"[[$1]]\"",
        "selfmove": "Los títulos de origen y destino son los mismos;\nno se puede trasladar una página sobre sí misma.",
        "immobile-source-namespace": "No se pueden trasladar páginas en el espacio de nombres «$1»",
        "immobile-target-namespace": "No se puede trasladar páginas al espacio de nombres «$1»",
        "markedaspatrollederrornotify": "Error al marcar como verificado.",
        "patrol-log-page": "Registro de revisiones",
        "patrol-log-header": "Este es un registro de revisiones verificadas.",
-       "log-show-hide-patrol": "$1 registro de patrullaje",
+       "log-show-hide-patrol": "$1 registro de verificación",
        "log-show-hide-tag": "$1 registro de etiquetas",
        "deletedrevision": "Borrada revisión antigua $1",
        "filedeleteerror-short": "Error al borrar el archivo: $1",
        "version-software-version": "Versión",
        "version-entrypoints": "URL del punto de entrada",
        "version-entrypoints-header-entrypoint": "Punto de entrada",
-       "version-entrypoints-header-url": "Dirección URL",
+       "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Ruta del artículo]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]",
        "version-libraries": "Bibliotecas instaladas",
        "logentry-newusers-byemail": "La cuenta de usuario $3 ha sido {{GENDER:$2|creada}} por $1 y la contraseña ha sido enviada por correo",
        "logentry-newusers-autocreate": "La cuenta $1 se {{GENDER:$2|creó}} automáticamente",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|trasladó}} las preferencias de protección de $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|eliminó}} la protección de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protegió}} a $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegió}} a $3 $4 [en cascada]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4 [en cascada]",
        "logentry-rights-rights": "$1 modificó los grupos a los que pertenece $3: de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|modificó}} los grupos a los que pertenece $3",
        "logentry-rights-autopromote": "$1 ha sido {{GENDER:$2|promocionado|promocionada}} automáticamente de $4 a $5",
        "feedback-back": "Volver",
        "feedback-bugcheck": "¡Perfecto! Únicamente comprueba que no sea un [$1 fallo conocido].",
        "feedback-bugnew": "Lo he comprobado. Informar de un nuevo fallo.",
-       "feedback-bugornote": "Si estás preparado para describir en detalle un problema técnico, [$1 informa de un bug] por favor.\n\nEn otro caso, puedes usar el siguiente formulario. Tu comentario será añadido a la página [$3 $2], junto con tu nombre de usuario y el navegador que usas.",
+       "feedback-bugornote": "Si estás preparado para describir en detalle un problema técnico, [$1 informa de un error].\nEn otro caso, puedes usar el siguiente formulario. Tu comentario se añadirá a la página \"[$3 $2]\", junto con tu nombre de usuario.",
        "feedback-cancel": "Cancelar",
        "feedback-close": "Hecho",
        "feedback-external-bug-report-button": "Enviar una tarea técnica",
        "feedback-submit": "Enviar",
        "feedback-terms": "Entiendo que la información de mi agente de usuario incluye información sobre la versión exacta de mi navegador y mi sistema operativo y serán compartidos públicamente junto a mis comentarios.",
        "feedback-termsofuse": "Acepto proporcionar comentarios de acuerdo con los Términos de uso.",
-       "feedback-thanks": "¡Gracias! Su comentario ha sido anotado en la página [$2  $1].",
+       "feedback-thanks": "¡Gracias! Tus comentarios se han publicado en la página \"[$2 $1]\".",
        "feedback-thanks-title": "¡Muchas gracias!",
        "feedback-useragent": "Agente de usuario:",
        "searchsuggest-search": "Buscar",
        "api-error-badaccess-groups": "No puedes cargar archivos en este wiki.",
        "api-error-badtoken": "Error interno: Símbolo incorrecto.",
        "api-error-copyuploaddisabled": "La subida por URL está desactivada en este servidor.",
-       "api-error-duplicate": "Ya existe{{PLURAL:$1| [$2 otro archivo]|[$2 n otros archivos]}} en el sitio con el mismo contenido.",
-       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existía [$2 otro archivo]|existían [$2 otros archivos]}} en el sitio con el mismo contenido, pero {{PLURAL:$1|fue|fueron}} {{PLURAL:$1|eliminado|eliminados}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Archivo|Archivos}} {{PLURAL:$1|duplicado|duplicados}} que ya se han eliminado",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Archivo|Archivos}} {{PLURAL:$1|duplicado|duplicados}}",
+       "api-error-duplicate": "Ya {{PLURAL:$1|existe otro archivo|existen otros archivos}} en el sitio con el mismo contenido.",
+       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existía otro archivo|existían otros archivos}} en el sitio con el mismo contenido, pero {{PLURAL:$1|fue eliminado|fueron eliminados}}.",
        "api-error-empty-file": "El archivo que enviaste estaba vacío.",
        "api-error-emptypage": "No se pueden crear páginas nuevas que estén vacías.",
        "api-error-fetchfileerror": "Error interno: Algo salió mal mientras se obtenía el archivo.",
index a2bf8e7..c74ef89 100644 (file)
@@ -25,7 +25,8 @@
                        "Boxmein",
                        "Roland",
                        "Postituvi",
-                       "Purodha"
+                       "Purodha",
+                       "Macofe"
                ]
        },
        "tog-underline": "Linkide allakriipsutus:",
        "nstab-template": "Mall",
        "nstab-help": "Juhend",
        "nstab-category": "Kategooria",
+       "mainpage-nstab": "Esileht",
        "nosuchaction": "Sellist toimingut pole.",
        "nosuchactiontext": "Viki ei tunne internetiaadressile vastavat tegevust.\nVõimalik, et sa sisestasid aadressi valesti või kasutasid vigast linki.\nSamuti ei ole välistatud, et tarkvaras, mida {{SITENAME}} kasutatab, on viga.",
        "nosuchspecialpage": "Sellist erilehekülge pole.",
        "createacct-captcha": "Turvakontroll",
        "createacct-imgcaptcha-ph": "Sisesta ülalnähtav tekst",
        "createacct-submit": "Loo konto",
-       "createacct-another-submit": "Loo teine konto",
+       "createacct-another-submit": "Loo konto",
        "createacct-benefit-heading": "{{SITENAME}} on sinusuguste inimeste tehtud.",
        "createacct-benefit-body1": "{{PLURAL:$1|muudatus|muudatust}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lehekülg|lehekülge}}",
        "changeemail-password": "Sinu parool {{GRAMMAR:inessive|{{SITENAME}}}}:",
        "changeemail-submit": "Muuda e-posti aadress",
        "changeemail-throttled": "Oled proovinud liiga palju kordi sisse logida.\nPalun oota $1, enne kui uuesti proovid.",
+       "changeemail-nochange": "Palun sisesta teistsugune uus e-posti aadress.",
        "resettokens": "Lubade lähtestamine",
        "resettokens-text": "Saad lähtestada load, mida on vaja siin sinu kontoga seotud kindlatele eraandmetele ligipääsuks.\n\nPeaksid load lähtestama, kui jagasid neid kogemata või kui su konto on kellegi teise võimusesse sattunud.",
        "resettokens-no-tokens": "Lähtestatavad load puuduvad.",
        "permissionserrorstext-withaction": "Sul pole lubatud {{lcfirst:$2}} {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
        "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.",
        "log-fulllog": "Vaata kogu logi",
        "edit-hook-aborted": "Laiendusliides katkestas muutmise täpsemat selgitust andmata.",
        "edit-gone-missing": "Polnud võimalik lehekülge uuendada.\nTundub, et see on kustutatud.",
        "mergehistory-go": "Näita liidetavaid muudatusi",
        "mergehistory-submit": "Liida redaktsioonid",
        "mergehistory-empty": "Ühtegi redaktsiooni ei saa liita.",
-       "mergehistory-success": "Lehekülje [[:$1]] {{PLURAL:$3|üks redaktsioon|$3 redaktsiooni}} liideti lehega [[:$2]].",
+       "mergehistory-done": "Lehekülje $1 {{PLURAL:$3|üks redaktsioon|$3 redaktsiooni}} liideti lehega [[:$2]].",
        "mergehistory-fail": "Muudatuste ajaloo liitmine ebaõnnestus. Palun kontrolli lehekülje ja aja parameetreid.",
        "mergehistory-fail-toobig": "Ajalugusid ei õnnestu liita, sest teisaldada tuleks rohkem kui {{PLURAL:$1|üks redaktsioon|$1 redaktsiooni}}, mis on piirmäär.",
        "mergehistory-no-source": "Alliklehekülge $1 pole olemas.",
        "recentchangeslinked-summary": "Siin on loetletud määratud leheküljelt viidatud (või määratud kategooria) lehekülgedel tehtud viimased muudatused.\nSinu [[Special:Watchlist|jälgimisloendi]] leheküljed on  '''rasvaselt''' esile toodud.",
        "recentchangeslinked-page": "Lehekülje nimi:",
        "recentchangeslinked-to": "Näita hoopis muudatusi lehekülgedel, mis sellele lehele lingivad",
+       "recentchanges-page-added-to-category": "kategooriasse lisatud \"[[:$1]]\"",
+       "recentchanges-page-added-to-category-bundled": "kategooriasse lisatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}",
+       "recentchanges-page-removed-from-category": "kategooriast eemaldatud \"[[:$1]]\"",
+       "recentchanges-page-removed-from-category-bundled": "kategooriast eemaldatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}",
        "upload": "Faili üleslaadimine",
        "uploadbtn": "Laadi fail üles",
        "reuploaddesc": "Tagasi üleslaadimise vormi juurde.",
        "upload-http-error": "HTTP-viga: $1",
        "upload-copy-upload-invalid-domain": "Sellest domeenist pole kopeerimise teel üleslaadimine võimalik.",
        "upload-dialog-title": "Faili üleslaadimine",
-       "upload-dialog-error": "Esines tõrge",
-       "upload-dialog-warning": "Esines hoiatus",
        "upload-dialog-button-cancel": "Loobu",
        "upload-dialog-button-done": "Valmis",
        "upload-dialog-button-save": "Salvesta",
        "upload-dialog-button-upload": "Laadi üles",
-       "upload-dialog-label-select-file": "Vali fail",
-       "upload-dialog-label-infoform-title": "Üksikasjad",
-       "upload-dialog-label-infoform-name": "Pealkiri",
-       "upload-dialog-label-infoform-description": "Kirjeldus",
-       "upload-dialog-label-usage-title": "Kasutus",
-       "upload-dialog-label-usage-filename": "Failinimi",
+       "upload-process-error": "Esines tõrge",
+       "upload-process-warning": "Esines hoiatus",
+       "upload-form-label-select-file": "Vali fail",
+       "upload-form-label-infoform-title": "Üksikasjad",
+       "upload-form-label-infoform-name": "Pealkiri",
+       "upload-form-label-infoform-description": "Kirjeldus",
+       "upload-form-label-usage-title": "Kasutus",
+       "upload-form-label-usage-filename": "Failinimi",
        "backend-fail-stream": "Faili $1 ei saanud edastada.",
        "backend-fail-backup": "Faili $1 ei saanud varundada.",
        "backend-fail-notexists": "Faili $1 pole olemas.",
        "filerevert-legend": "Faili taastamine",
        "filerevert-intro": "Sa taastad faili '''[[Media:$1|$1]]''' seisuga [$4 $3, $2] kasutusel olnud versiooni.",
        "filerevert-comment": "Põhjus:",
-       "filerevert-defaultcomment": "Ennistati versioon seisuga $1, kell $2",
+       "filerevert-defaultcomment": "Ennistati versioon seisuga $1, kell $2 ($3)",
        "filerevert-submit": "Taasta",
        "filerevert-success": "Faili '''[[Media:$1|$1]]''' seisuga [$4 $3, $2 kasutusel olnud versioon] on taastatud.",
        "filerevert-badversion": "Ette antud ajatempliga kohalik versioon sellest failist puudub.",
        "deletepage": "Kustuta lehekülg",
        "confirm": "Kinnita",
        "excontent": "sisu oli: '$1'",
-       "excontentauthor": "sisu oli: '$1' (ja ainuke kirjutaja oli '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "sisu oli: \"$1\"; ainuke kirjutaja oli \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|arutelu]])",
        "exbeforeblank": "sisu enne lehekülje tühjendamist: '$1'",
        "delete-confirm": "Lehekülje \"$1\" kustutamine",
        "delete-legend": "Kustutamine",
        "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetalktext": "Koos artiklileheküljega teisaldatakse automaatselt ka arutelulehekülg, '''välja arvatud juhtudel, kui:'''\n*uue pealkirja all on juba arutelulehekülg, mis pole tühi;\n*jätad alloleva märkeruudu valimata.\n\nNeil juhtudel saad lehekülje soovi korral käsitsi teisaldada või liita.",
-       "movearticle": "Teisalda lehekülg",
        "moveuserpage-warning": "'''Hoiatus:''' Oled teisaldamas kasutajalehekülge. Pane tähele, et teisaldatakse ainult lehekülg ja kasutajat '''ei''' nimetata ümber.",
        "movecategorypage-warning": "<strong>Hoiatus:</strong> Oled teisaldamas kategoorialehekülge. Pane palun tähele, et teisaldatakse vaid see lehekülg ja ühtegi vanas kategoorias sisalduvat lehekülge <em>ei</em> kategoriseerita ümber uude kategooriasse.",
        "movenologintext": "Lehekülje teisaldamiseks pead registreeruma ja [[Special:UserLogin|sisse logima]].",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|lõi}} kasutajakonto $3 ja parool saadeti e-kirjatsi",
        "logentry-newusers-autocreate": "Konto $1 {{GENDER:$2|loodi}} automaatselt",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|teisaldas}} kaitsesätted leheküljelt $4 leheküljele $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|eemaldas}} lehekülje $3 kaitse",
+       "logentry-protect-protect": "$1 {{GENDER:$2|kaitses}} lehekülje $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|kaitses}} lehekülje $3 $4 [kaskaadkaitse]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|muutis}} lehekülje $3 kaitsetaset $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|muutis}} lehekülje $3 kaitsetaset $4 [kaskaadkaitse]",
        "logentry-rights-rights": "$1 {{GENDER:$2|muutis}} kasutaja $3 rühmaliikmesust; enne oli $4, nüüd on $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|muutis}} kasutaja $3 rühmaliikmesust",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|viidi}} automaatselt üle teise rühma; enne oli $4, nüüd on $5",
        "api-error-badaccess-groups": "Sul pole selles vikis üleslaadimisõigust.",
        "api-error-badtoken": "Sisemine tõrge: Sobimatu nimi.",
        "api-error-copyuploaddisabled": "URLi kaudu üleslaadimine on selles serveris keelatud.",
-       "api-error-duplicate": "Siin on {{PLURAL:$1|[$2 teine samasisuline fail]|[$2 mõned teised samasisulised failid]}} juba olemas.",
-       "api-error-duplicate-archive": "Siin {{PLURAL:$1|on [$2 teine samasisuline fail]|olid [$2 mõned teised samasisulised failid]}} juba olemas, aga {{PLURAL:$1|see|need}} kustutati.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplikaatfail|Duplikaatfailid}}, mis on juba kustutatud",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duplikaatfail|Duplikaatfailid}}",
+       "api-error-duplicate": "Siin on {{PLURAL:$1|teine samasisuline fail|mõned teised samasisulised failid}} juba olemas.",
+       "api-error-duplicate-archive": "Siin {{PLURAL:$1|on teine samasisuline fail|olid mõned teised samasisulised failid}} juba olemas, aga {{PLURAL:$1|see|need}} kustutati.",
        "api-error-empty-file": "Üleslaaditav fail on tühi.",
        "api-error-emptypage": "Uute tühjade lehekülgede loomine pole lubatud.",
        "api-error-fetchfileerror": "Sisemine tõrge: Midagi läks faili kättesaamisel valesti.",
index 4d582fb..905853d 100644 (file)
        "nstab-template": "Txantiloi",
        "nstab-help": "Laguntza orrialdea",
        "nstab-category": "Kategoria",
-       "nosuchaction": "Ekintza hori ez da existitizen",
+       "mainpage-nstab": "Azala",
+       "nosuchaction": "Ekintza hori ez da existitzen",
        "nosuchactiontext": "URL bidez zehaztutako ekintza okerra da.\nURLa gaizki idatzi duzu, edo hautsitako lotura jarraitu duzu.\nHonek akatsa indikatzen du {{SITENAME}}-(e)n.",
-       "nosuchspecialpage": "Ez da aparteko orrialde hori existitzen",
+       "nosuchspecialpage": "Orri berezi hori ez existitzen",
        "nospecialpagetext": "<strong>Orri berezi baliogabe bat eskatu duzu.</strong>\n\nBada orri berezien zerrenda bat, [[Special:SpecialPages|{{int:specialpages}}]] orrian.",
        "error": "Errorea",
        "databaseerror": "Datu-base errorea",
        "createacct-captcha": "Segurtasun froga",
        "createacct-imgcaptcha-ph": "Sartu gainean ikusten duzun testua",
        "createacct-submit": "Kontua sortu",
-       "createacct-another-submit": "Beste kontu bat sortu",
+       "createacct-another-submit": "Kontu bat sortu",
        "createacct-benefit-heading": "{{SITENAME}} zu bezalako pertsonek egiten dute.",
        "createacct-benefit-body1": "{{PLURAL:$1|edizio bat|$1 edizio}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Orrialde 1|$1 orrialde}}",
        "rev-deleted-text-permission": "Orrialdearen berrikuspen hau '''ezabatua''' 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": "Orrialdearen berrikuspen hau '''ezabatua''' izan da.\nZuk ikusteko aukera daukazu; xehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] ikus ditzakezu.",
+       "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-suppressed-text-view": "Berrikuspen hau '''ezabatua''' izan da.\nAdministratzaile bezala ikus dezakezu; xehetasun gehiagorako [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ezabapen erregistrora joan].",
        "rev-deleted-no-diff": "Ezin duzu ezberdintasun hau ikusi, berrikuspenetako bat '''ezabatua''' izan delako.\nXehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] aurki ditzakezu.",
        "rev-suppressed-no-diff": "Ezin duzu ezberdintasunik ikusi berrikuspenen bat '''ezabatua''' izan delako.",
        "revdelete-legend": "Berrikuspen mugapenak ezarri:",
        "revdelete-hide-text": "Berrikuspenaren testua ezkutatu",
        "revdelete-hide-image": "Fitxategiaren edukia ezkutatu",
-       "revdelete-hide-name": "Ezkutatu ekintza eta helburua",
+       "revdelete-hide-name": "Ezkutatu helburua eta parametroak",
        "revdelete-hide-comment": "Aldaketaren iruzkina ezkutatu",
        "revdelete-hide-user": "Egilearen erabiltzaile izena/IPa ezkutatu",
        "revdelete-hide-restricted": "Mugapen hauek administratzaileei zein besteei aplikatu",
        "mergehistory-go": "Aldaketa bateragarriak erakutsi",
        "mergehistory-submit": "Berrikuspenak bateratu",
        "mergehistory-empty": "Ezin da berrikuspenik bateratu",
-       "mergehistory-success": "[[:$1]](e)ko {{PLURAL:$3|berrikuspen|berrikuspen}} bateratu egin dira [[:$2]](e)n.",
+       "mergehistory-done": "$1(e)ko {{PLURAL:$3|berrikuspen|berrikuspen}} bateratu egin dira [[:$2]](e)n.",
        "mergehistory-fail": "Ezin izan da historia bateratu; egiaztatu orrialde eta denbora parametroak.",
        "mergehistory-no-source": "Ez da $1 jatorrizko orrialdea existitzen.",
        "mergehistory-no-destination": "Ez da $1 helburu orrialdea existitzen.",
        "upload-http-error": "HTTP errorea gertatu da: $1",
        "upload-copy-upload-invalid-domain": "Domeinu honetan ezin dira igoerak kopiatu.",
        "upload-dialog-title": "Igo fitxategia",
-       "upload-dialog-error": "Errore bat gertatu da",
        "upload-dialog-button-cancel": "Utzi",
        "upload-dialog-button-done": "Egina",
        "upload-dialog-button-save": "Gorde",
        "upload-dialog-button-upload": "Igo",
-       "upload-dialog-label-select-file": "Fitxategia Aukeratu",
-       "upload-dialog-label-infoform-title": "Xehetasunak",
-       "upload-dialog-label-infoform-name": "Izena",
-       "upload-dialog-label-infoform-description": "Deskribapena",
-       "upload-dialog-label-usage-title": "Erabilera",
-       "upload-dialog-label-usage-filename": "Fitxategiaren izena",
+       "upload-process-error": "Errore bat gertatu da",
+       "upload-form-label-select-file": "Fitxategia Aukeratu",
+       "upload-form-label-infoform-title": "Xehetasunak",
+       "upload-form-label-infoform-name": "Izena",
+       "upload-form-label-infoform-description": "Deskribapena",
+       "upload-form-label-usage-title": "Erabilera",
+       "upload-form-label-usage-filename": "Fitxategiaren izena",
+       "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.",
        "backend-fail-backup": "Ezin izan da \"$1\" fitxategiaren backup egin.",
        "backend-fail-notexists": "$1 fitxategia ez da existitzen.",
        "deletepage": "Orrialdea ezabatu",
        "confirm": "Baieztatu",
        "excontent": "edukia hau zen: '$1'",
-       "excontentauthor": "edukia hau zen: \"$1\" (parte hartu duen lankide bakarra: \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "edukia hau zen: \"$1\" (parte hartu duen lankide bakarra: \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "hustu aurreko edukiera: '$1'",
        "delete-confirm": "\"$1\" ezabatu",
        "delete-legend": "Ezabatu",
        "undeletedrevisions-files": "{{PLURAL:$1|berrikuspen|berrikuspen}} eta {{PLURAL:$2|fitxategi|fitxategi}} leheneratu dira",
        "undeletedfiles": "{{PLURAL:$1|fitxategi|fitxategi}} leheneratu dira",
        "cannotundelete": "Ezabatutako birgaitzean akatsa: $1",
-       "undeletedpage": "'''$1 leheneratu egin da'''\n\n[[Special:Log/delete|Ezabaketa erregistrora]] jo azken ezabaketa eta leheneraketak ikusteko.",
-       "undelete-header": "Berriki ezabatutako orrialdeak ikusteko [[Special:Log/delete|ezabaketa erregistrora]] jo.",
+       "undeletedpage": "'''«$1» leheneratu da'''\n\nAzken ezabatze eta leheneratzeak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
+       "undelete-header": "Berriki ezabatutako orriak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
        "undelete-search-title": "Ezabatutako orrialdeak bilatu",
        "undelete-search-box": "Ezabatutako orrialdeak bilatu",
        "undelete-search-prefix": "Honela hasten diren orrialdeak erakutsi:",
        "move-page-legend": "Orrialdea mugitu",
        "movepagetext": "Inprimaki hau erabiliz, orri baten izena aldatuko da, eta haren historia izen berrira eramango.\nIzenburu zaharra izenburu berrirantz birbideratutako orri bihurtuko da.\nJatorrizko izenburura doazen birbideratzeak automatikoki egunera ditzakezu.\nHalako eguneratze automatikorik ez egitea aukeratzen baduzu, egiazta itzazu birbideratze [[Special:DoubleRedirects|bikoitzak]] eta [[Special:BrokenRedirects|apurtuak]].\nZure ardura da loturak behar den tokirantz bideratzea.\n\nGogoan izan ezazu ezazu: orriaren izena <strong>ez</strong> da aldatuko baldin jarri nahi duzun izenburua duen orria dagoeneko sortuta badago, salbu eta historiarik gabeko birbideratze orri bat bada.\nHau da, nahasten baldin bazara, mugitu duzun orria lehengo izenburura itzultzeko modua badago, eta ezin duzun lehendik sortuta dagoen orri bat gainidatzi.\n\n<strong>Kontuz!</strong>\nOso erabilia den orri batean, aldaketa hau bat-batekoa eta ustekabekoa izan liteke;\nzalantzarik baldin baduzu, lehenbizi adieraz ezazu zure asmoa eztabaida orrian, beste wikilarien iritziak jasotzeko.",
        "movepagetalktext": "Dagokion eztabaida orrialdea berarekin batera mugitu da, honako kasu hauetan '''ezik:'''\n* Hutsik ez dagoen eztabaida orrialde bat existitzen bada izen berrian.\n* Beheko koadroa hautatzen ez baduzu.\n\nKasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
-       "movearticle": "Mugitu orria",
        "moveuserpage-warning": "'''Oharra:''' Lankide orrialde bat mugitzera zoaz. Kontutan izan orrialde bakarrik mugituko duzula eta '''ez''' duzula lankide izena aldatuko.",
        "movenologintext": "Orrialde bat mugitzeko erregistratutako lankidea izan behar duzu eta [[Special:UserLogin|saioa hasi]].",
        "movenotallowed": "Ez daukazu orrialdeak mugitzeko baimenik.",
        "cant-move-user-page": "Ez duzu lankide orrialdeak mugitzeko eskumenik (azpiorrialdeetatik at).",
        "cant-move-to-user-page": "Ez duzu orrialde bat lankide orrialde batera mugitzeko eskumenik (lankide azpiorrialde batera izan ezik).",
        "cant-move-to-category-page": "Ez duzu baimenik orrialde bat kategoria-orrialde batera mugitzeko.",
-       "newtitle": "Izenburu berria",
+       "newtitle": "Izenburu berria:",
        "move-watch": "Orrialde hau jarraitu",
        "movepagebtn": "Mugitu orria",
        "pagemovedsub": "Mugimendua eginda",
        "tooltip-ca-nstab-main": "Eduki orrialdea ikusi",
        "tooltip-ca-nstab-user": "Lankide orrialdea ikusi",
        "tooltip-ca-nstab-media": "Media orrialdea ikusi",
-       "tooltip-ca-nstab-special": "Hau aparteko orrialde bat da, ezin duzu orrialdea aldatu.",
+       "tooltip-ca-nstab-special": "Hau orri berezi bat da, ezin duzu orria aldatu.",
        "tooltip-ca-nstab-project": "Proiektuaren orrialdea ikusi",
        "tooltip-ca-nstab-image": "Irudiaren orrialdea ikusi",
        "tooltip-ca-nstab-mediawiki": "Sistemaren mezua ikusi",
        "compare-rev2": "2. berrikuspena",
        "compare-submit": "Alderatu",
        "compare-invalid-title": "Zehaztutako izenburua ez dago zuzen.",
-       "compare-title-not-exists": "Zehazturiko izenburua ez da existitzen.",
+       "compare-title-not-exists": "Adierazi duzun izenburua ez da existitzen.",
        "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.",
        "searchsuggest-containing": "edukian...",
        "api-error-badaccess-groups": "Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.",
        "api-error-badtoken": "Barne akatsa: token okerra.",
-       "api-error-duplicate-popup-title": "Fitxategi {{PLURAL:$1|bikoiztua|bikoiztuak}}.",
        "api-error-empty-file": "Bidali duzun fitxategia hutsik dago.",
        "api-error-emptypage": "Berria sortzerako garaian orrialde hutsak ezin dira erabili.",
        "api-error-fetchfileerror": "Barne akatsa: zerbait gaizki joan da fitxategia eskuratzerakoan.",
index 3529566..ad61892 100644 (file)
@@ -9,7 +9,8 @@
                        "아라",
                        "Babanwalia",
                        "Henares",
-                       "MarcoAurelio"
+                       "MarcoAurelio",
+                       "Macofe"
                ]
        },
        "tog-underline": "Surrayal atihus:",
        "protectedpage": "Página protegia",
        "jumpto": "Sartal a:",
        "jumptonavigation": "Güiquipeandu",
-       "jumptosearch": "Landeal",
+       "jumptosearch": "landeal",
        "aboutsite": "Al tentu {{SITENAME}}",
        "aboutpage": "Project:Enjolmación",
        "copyright": "Continiu disponibri bahu $1.",
        "nstab-template": "Prantilla",
        "nstab-help": "Páhina d'ayua",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Página prencipal",
        "nosuchaction": "Nu desisti tal ación",
        "nosuchactiontext": "La URL nu es vália.\nEs possibri que aigas marrau escribiendu la direción, u aigas siguiu un atiju encorretu.\nTamién es possibri que se trati dun marru entelnu de {{SITENAME}}.\nespecificá ena URL",
        "nosuchspecialpage": "Nu desisti tal páhina especial",
        "mergehistory-go": "Muestral eicionis uñificabris",
        "mergehistory-submit": "Uñifical revisionis",
        "mergehistory-empty": "Nu es posibri uñifical denguna revisión.",
-       "mergehistory-success": "S'án mesturau $3 {{PLURAL:$3|revisión|revisionis}} de [[:$1]] en [[:$2]].",
+       "mergehistory-done": "S'án mesturau $3 {{PLURAL:$3|revisión|revisionis}} de $1 en [[:$2]].",
        "mergehistory-fail": "Nu es posibri uñifical los estorialis. Pol favol, compreba la páhina i los parámetrus de tiempu.",
        "mergehistory-no-source": "La páhina huenti $1 nu desisti.",
        "mergehistory-no-destination": "La páhina e destinu $1 nu desisti.",
        "group-sysop": "Çahorilis",
        "group-bureaucrat": "Alministraoris",
        "group-all": "(tó)",
-       "group-user-member": "{{GENDER:$1|Usuáriu}}",
-       "group-autoconfirmed-member": "Usuáriu autuconfirmau",
+       "group-user-member": "{{GENDER:$1|usuáriu|usuária}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|usuáriu autuconfirmau|usuária autoconfirmada}}",
        "group-bot-member": "Bot",
        "group-sysop-member": "Çahoril",
        "group-bureaucrat-member": "Alministraol",
        "filerevert-legend": "Revertil archivu",
        "filerevert-intro": "Estás revirtiendu '''[[Media:$1|$1]]''' a la [$4 velsión del $3 a las $2].",
        "filerevert-comment": "Comentáriu:",
-       "filerevert-defaultcomment": "Revertiu a la velsión de $2, $1",
+       "filerevert-defaultcomment": "Revertiu a la velsión de $2, $1 ($3)",
        "filerevert-submit": "Revertil",
        "filerevert-success": "S'á revertiu '''[[Media:$1|$1]]''' a [$4 velsión de $3, $2].",
        "filerevert-badversion": "Nu desisti denguna velsión local prévia d'esti archivu cola fecha aseñalá.",
        "confirmdeletetext": "Vas a esborral una páhina/imahin i el su estorial de horma permanenti.\nPol favol, confirma que realmenti quieis hazel esu, qu'entiendis las consecuencias, i que lo hazis dalcuerdu cola\n[[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Ación acabihá",
        "deletedtext": "S'á esborrau \"$1\" corretamenti.\nConsurta $2 pa vel los úrtimus esborraus.",
-       "dellogpage": "Rustrihu d´esborrau",
+       "dellogpage": "Rustrihu d'esborrau",
        "dellogpagetext": "Embahu se muestra una lista colos úrtimus esborraus.",
        "deletionlog": "rustrihu d´esborrau",
        "reverted": "Revertiu a la úrtima revisión",
        "namespace": "Espáciu de nombris:",
        "invert": "Invertil seleción",
        "blanknamespace": "(Prencipal)",
-       "contributions": "Endirguis el usuáriu",
+       "contributions": "Endirguis {{GENDER:$1|el usuáriu|la usuária}}",
        "contributions-title": "Contribucionis del usuáriu a $1",
        "mycontris": "Los mis endirguis",
        "contribsub2": "Pa $1 ($2)",
        "move-page-legend": "Movel páhina",
        "movepagetext": "Gastandu el hormuláriu d'embahu se chambará el nombri la páhina, moviendu el su estorial al nuevu nombri, i rederihiendu el entítulu antigu al nuevu.\nLos atihus al entítulu antigu nu chambarán; cúdia colas dobris redirecionis i los atihus eschangaus.\nEris responsabri e que los atihus acontinin llevandu andi se suponi que tienin que lleval.\n\nPol otra parti, la páhina '''nu''' se moverá si ya desisti una páhina con el nombri nuevu, a nu sel que seya una páhina vacia u una redireción. Estu senifica que pueis gorvel a poneli el nombri antigu en chascu e marru, peru nu t'es posibri sobriescrebil una páhina ya desistenti.\n\n'''Avisu!'''\nEn páhinas popularis, esta ación puei arrepresental un chambu emportanti;\npol favol, asigurati e qu'entiendis las consecuéncias enantis d'acontinal.",
        "movepagetalktext": "La caraba asociá se moverá con el artículu, '''a nus sel que:'''\n*Ya desista otra caraba con el mesmu nombri, u\n*Nu comprebis la caha d'embahu.\n\nEn dambus los dos chascus, si lo deseas, tendrás que movel u mestural la páhina manualmenti.",
-       "movearticle": "Movel páhina:",
        "movenologintext": "Ebis estal rustriu i [[Special:UserLogin|entral ena tu cuenta]] pa movel una páhina.",
        "movenotallowed": "Nu tinis premissu pa mual páginas.",
        "movenotallowedfile": "Nu tinis premissus pa mual archivus.",
        "iranian-calendar-m10": "10 mes Jalāli",
        "iranian-calendar-m11": "11 mes Jalāli",
        "iranian-calendar-m12": "12 mes Jalāli",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|caraba]])",
        "version": "Velsión",
        "version-extensions": "Estensionis istalás",
        "version-specialpages": "Páhinas especialis",
index 095f7e6..ca92a78 100644 (file)
@@ -47,7 +47,8 @@
                        "Signal89",
                        "Macofe",
                        "Danialbehzadi",
-                       "MRG90"
+                       "MRG90",
+                       "Mahdy Saffar"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "nstab-template": "الگو",
        "nstab-help": "صفحهٔ راهنما",
        "nstab-category": "رده",
+       "mainpage-nstab": "صفحه اصلی",
        "nosuchaction": "چنین عملی وجود ندارد",
        "nosuchactiontext": "عمل مشخص‌شده در نشانی اینترنتی نامجاز است.\nممکن است نشانی اینترنتی را اشتباه وارد کرده باشید یا پیوند مشکل‌داری را دنبال کرده باشید.\nهمچنین ممکن است ایرادی در نرم‌افزار استفاده‌شده در {{SITENAME}} وجود داشته باشد.",
        "nosuchspecialpage": "چنین صفحهٔ ویژه‌ای وجود ندارد",
        "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|صفحه}}",
        "passwordreset-emailsent": "یک نامهٔ بازنشانی گذرواژه فرستاده شده‌است.",
        "passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
        "passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1",
-       "changeemail": "تغییر نشانی ایمیل",
+       "changeemail": "تغییر یا حذف نشانی ایمیل",
        "changeemail-text": "این فرم را تکمیل کنید تا آدرس ایمیلتان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.",
        "changeemail-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "changeemail-oldemail": "آدرس ایمیل کنونی:",
        "changeemail-password": "گذرواژهٔ {{SITENAME}} شما:",
        "changeemail-submit": "تغییر ایمیل",
        "changeemail-throttled": "شما به مراتب برای ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
+       "changeemail-nochange": "لطفاً رایانامهٔ جدید و متفاوتی وارد کنید.",
        "resettokens": "بازنشانی شناساننده‌ها",
        "resettokens-text": "شما می توانید شناساننده‌ها که اجازهٔ دسترسی به برخی داده‌های خصوصی مرتبط با حسابتان را می‌دهد بازنشانی کنید.\nدر صورتی باید این کار را انجام دهید که تصادقاً آن‌ها را با کسی در میان گذاشته‌اید یا به حسابتان نفوذ شده است.",
        "resettokens-no-tokens": "هیچ شناساننده‌ای برای بازنشانی وجود ندارد.",
        "permissionserrorstext-withaction": "شما اجازهٔ $2 را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
        "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به نظرمی‌رسد که صفحه حذف شده باشد.",
        "mergehistory-go": "نمایش تاریخچه قابل ادغام",
        "mergehistory-submit": "ادغام نسخه‌ها",
        "mergehistory-empty": "هیچ‌یک از نسخه‌ها قابل ادغام نیستند.",
-       "mergehistory-success": "$3 نسخه از [[:$1]]  با موفقیت در [[:$2]] ادغام {{PLURAL:$3|شد}}.",
+       "mergehistory-done": "$3 نسخه از $1  با موفقیت در [[:$2]] ادغام {{PLURAL:$3|شد}}.",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
        "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "prefs-watchlist-token": "رمز فهرست پی‌گیری:",
        "prefs-misc": "متفرقه",
        "prefs-resetpass": "تغییر گذرواژه",
-       "prefs-changeemail": "تغییر نشانی ایمیل",
+       "prefs-changeemail": "تغییر یا حذف نشانی ایمیل",
        "prefs-setemail": "تنظیم آدرس ایمیل",
        "prefs-email": "گزینه‌های ایمیل",
        "prefs-rendering": "نمایش صفحه",
        "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 صفحه}}ٔ دیگر از رده حذف شدند",
        "upload": "بارگذاری پرونده",
        "uploadbtn": "بارگذاری پرونده",
        "reuploaddesc": "بازگشت به فرم بارگذاری",
        "upload-http-error": "یک خطای اچ‌تی‌تی‌پی رخ داد: $1",
        "upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.",
        "upload-dialog-title": "بارگذاری پرونده",
-       "upload-dialog-error": "يک خطا اتفاق افتاد",
-       "upload-dialog-warning": "یک هشدار رخ‌داد",
        "upload-dialog-button-cancel": "لغو",
        "upload-dialog-button-done": "انجام شد",
        "upload-dialog-button-save": "ذخیره",
        "upload-dialog-button-upload": "بارگذاری",
-       "upload-dialog-label-select-file": "یک فایل انتخاب کنید",
-       "upload-dialog-label-infoform-title": "جزئیات",
-       "upload-dialog-label-infoform-name": "نام",
-       "upload-dialog-label-infoform-description": "توضیحات",
-       "upload-dialog-label-usage-title": "کاربرد",
-       "upload-dialog-label-usage-filename": "نام پرونده",
+       "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 وجود ندارد.",
        "filerevert-legend": "واگردانی پرونده",
        "filerevert-intro": "شما در حال واگردانی '''[[Media:$1|$1]]''' به [$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": "نسخهٔ قدیمی‌تری از این پرونده وجود نداشت.",
        "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": "صفحهٔ بحث مربوط، اگر وجود داشته باشد، بطور خودکار همراه با مقالهٔ اصلی منتقل خواهد شد <strong>مگر اینکه:</strong>\n* در حال انتقال صفحه از این فضای نام به فضای نام دیگری باشید،\n* یک صفحهٔ بحث غیرخالی تحت این نام جدید وجود داشته باشد، یا\n* جعبهٔ زیر را تیک نزده باشید.\n\nدر این حالات، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
-       "movearticle": "انتقال صفحه:",
        "moveuserpage-warning": "'''هشدار:''' شما در حال انتقال دادن یک صفحهٔ کاربر هستید. توجه داشته باشید که تنها صفحه منتقل می‌شود و نام کاربر تغییر '''نمی‌یابد'''.",
        "movecategorypage-warning": "<strong>هشدار:</strong> شما در حال انتقال صفحه رده هستید. لطفاً توجه داشته باشید که فقط صفحه منتقل خواهد شد و  صفحات در رده قدیمی می‌مانند و به رده جدید <em>نمی‌روند</em>.",
        "movenologintext": "برای انتقال صفحات باید کاربر ثبت‌شده بوده و [[Special:UserLogin|به سامانه وارد شوید]].",
        "logentry-newusers-byemail": "حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}} و رمز عبور به وسیلهٔ ایمیل ارسال شد",
        "logentry-newusers-autocreate": "حساب $1  به شکل خودکار {{GENDER:$2|ایجاد شد}}",
        "logentry-protect-move_prot": "$1 تنظیمات محافظت را از $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|ارتقاء داد}}",
        "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتباه (Bad token).",
        "api-error-copyuploaddisabled": "بارگذاری با استفاده از نشانی اینترنتی در این کارساز غیرفعال است.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 پروندهٔ دیگری]|[$2 چند پروندهٔ دیگر]}} در تارنما با محتوای یکسان وجود داشت.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 پروندهٔ دیگری]|[$2 چند پروندهٔ دیگر]}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|پروندهٔ|پرونده‌های}} تکراری که در حال حاضر حذف شده‌اند",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|پرونده|پرونده‌های}} تکراری",
+       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت.",
+       "api-error-duplicate-archive": "{{PLURAL:$1| پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
        "api-error-empty-file": "پرونده‌ای که شما ارسال کردید خالی بود.",
        "api-error-emptypage": "ایجاد صفحه‌های خالی مجاز نیست.",
        "api-error-fetchfileerror": "خطای داخلی: در هنگام گرفتن پرونده، یک چیزی درست پیش نرفت.",
index fd8d5d5..68dbd37 100644 (file)
@@ -45,7 +45,8 @@
                        "SuperPete",
                        "McSalama",
                        "Macofe",
-                       "Beluga"
+                       "Beluga",
+                       "Pyscowicz"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "nstab-template": "Malline",
        "nstab-help": "Ohjesivu",
        "nstab-category": "Luokka",
+       "mainpage-nstab": "Etusivu",
        "nosuchaction": "Toimintoa ei ole olemassa",
        "nosuchactiontext": "URL:ssä määritelty toiminto ei ole kelvollinen.\nOlet saattanut kirjoittaa URL:in väärin tai olet seurannut virheellistä linkkiä.\nKyseessä voi myös mahdollisesti olla virhe sivuston {{SITENAME}} käyttämässä ohjelmistossa.",
        "nosuchspecialpage": "Kyseistä toimintosivua ei ole",
        "createacct-captcha": "Turvatarkastus",
        "createacct-imgcaptcha-ph": "Kirjoita teksti, jonka näet edellä",
        "createacct-submit": "Luo tunnus",
-       "createacct-another-submit": "Luo toinen käyttäjätunnus",
+       "createacct-another-submit": "Luo käyttäjätunnus",
        "createacct-benefit-heading": "{{SITENAME}} on sinun kaltaistesi ihmisten tekemä.",
        "createacct-benefit-body1": "{{PLURAL:$1|muokkaus|muokkausta}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sivu|sivua}}",
        "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": "Salasanan uudistamisesta kertova viesti on lähetetty sähköpostitse.",
+       "passwordreset-emailsent": "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 sähköpostiosoitetta",
-       "changeemail-text": "Voit vaihtaa sähköpostiosoitteesi täyttämällä tämän lomakkeen. Muutoksen vahvistamiseen tarvitaan myös salasana.",
+       "changeemail": "Muuta tai poista sähköpostiosoite",
+       "changeemail-text": "Täytä tämä lomake vaihtaaksesi sähköpostiosoitteesi. Sinun on syötettävä salasanasi vahvistaaksesi tämän muutoksen. Jos haluat poistaa yhteyden mihin tahansa sähköpostiosoitteeseen tiltäsi, jätä uusi sähköpostiosoite tyhjäksi kun lähetät lomakkeen.",
        "changeemail-no-info": "Tämän sivun käyttö edellyttää sisäänkirjautumista.",
        "changeemail-oldemail": "Nykyinen sähköpostiosoite:",
        "changeemail-newemail": "Uusi sähköpostiosoite:",
+       "changeemail-newemail-help": "Tämä kenttä tulee jättää tyhjäksi, jos haluat poistaa sähköpostiosoitteesi. Et voi palauttaa unohtunutta salasanaa ja vastaanottaa sähköposteja tästä wikistä jos sähköpostiosoite on poistettu.",
        "changeemail-none": "(ei asetettu)",
        "changeemail-password": "{{SITENAME}}-salasanasi:",
        "changeemail-submit": "Muuta sähköpostiosoite",
        "changeemail-throttled": "Olet tehnyt liian monta kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.",
+       "changeemail-nochange": "Anna joku toinen sähköpostiosoite.",
        "resettokens": "Uudista avaimet",
        "resettokens-text": "Tällä sivulla voit uudistaa avaimesi (''eng.'' reset tokens), jotka mahdollistavat pääsyn käyttäjätunnukseesi liittyviin tiettyihin yksityisiin tietoihin.\n\nSinun pitäisi tehdä tämä, jos olet vahingossa jakanut avaimet jonkun kanssa tai jos käyttäjätunnuksesi on vaarannettu.",
        "resettokens-no-tokens": "Avaimia ei ole uudistettavaksi.",
        "permissionserrorstext-withaction": "Sinulla ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:",
        "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.",
        "log-fulllog": "Näytä loki kokonaan",
        "edit-hook-aborted": "Laajennuskoodi esti muokkauksen antamatta syytä.",
        "edit-gone-missing": "Sivun päivitys ei onnistunut.\nSe on ilmeisesti poistettu.",
        "mergehistory-go": "Etsi muokkaukset, jotka voidaan yhdistää",
        "mergehistory-submit": "Yhdistä versiot",
        "mergehistory-empty": "Mitään versioita ei voida yhdistää.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versio|versiota}} sivusta [[:$1]] yhdistettiin onnistuneesti sivuun [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versio|versiota}} sivusta $1 yhdistettiin onnistuneesti sivuun [[:$2]].",
        "mergehistory-fail": "Sivuhistorioiden yhdistämistä ei voida suorittaa. Tarkista lähde- ja kohdesivujen nimet sekä versioiden aikamääritys.",
        "mergehistory-fail-toobig": "Sivuhistorian yhdistämistä ei voi tehdä, koska enemmän kuin sallittu määrä $1 {{PLURAL:$1|versio|versiota}} siirrettäisiin.",
        "mergehistory-no-source": "Lähdesivua $1 ei ole olemassa.",
        "prefs-watchlist-token": "Tarkkailulistan avain:",
        "prefs-misc": "Muut",
        "prefs-resetpass": "Muuta salasana",
-       "prefs-changeemail": "Muuta sähköpostiosoite",
+       "prefs-changeemail": "Muuta tai poista sähköpostiosoite",
        "prefs-setemail": "Aseta sähköpostiosoite",
        "prefs-email": "Sähköpostiasetukset",
        "prefs-rendering": "Ulkoasu",
        "group-bot": "botit",
        "group-sysop": "ylläpitäjät",
        "group-bureaucrat": "byrokraatit",
-       "group-suppress": "häivyttäjät",
+       "group-suppress": "häivyttäjät (suppressors)",
        "group-all": "(kaikki)",
        "group-user-member": "{{GENDER:$1|käyttäjä}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automaattisesti hyväksytty käyttäjä}}",
        "group-bot-member": "{{GENDER:$1|botti}}",
        "group-sysop-member": "{{GENDER:$1|ylläpitäjä}}",
        "group-bureaucrat-member": "{{GENDER:$1|byrokraatti}}",
-       "group-suppress-member": "{{GENDER:$1|häivyttäjä}}",
+       "group-suppress-member": "{{GENDER:$1|häivyttäjä (suppressor)}}",
        "grouppage-user": "{{ns:project}}:Käyttäjät",
        "grouppage-autoconfirmed": "{{ns:project}}:Automaattisesti hyväksytyt käyttäjät",
        "grouppage-bot": "{{ns:project}}:Botit",
        "recentchangeslinked-summary": "Tämä on luettelo muutoksista, jotka on viimeksi tehty niihin sivuihin, joihin johtaa linkki tietystä sivusta (tai jonkun määrätyn luokan sisältämistä sivuista). Omalla [[Special:Watchlist|tarkkailulistallasi]] olevat sivut on <strong>lihavoitu</strong>.",
        "recentchangeslinked-page": "Sivun nimi:",
        "recentchangeslinked-to": "Näytä sen sijaan muutokset sivuihin, joista on linkki tähän sivuun",
+       "recentchanges-page-added-to-category": "[[:$1]] lisätty luokkaan",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ja {{PLURAL:$2|one page|$2 pages}} lisätty luokkaan",
+       "recentchanges-page-removed-from-category": "[[:$1]] poistettu luokasta",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] ja {{PLURAL:$2|one page|$2 pages}} poistettu luokasta",
+       "autochange-username": "MediaWiki automaattinen muutos",
        "upload": "Tallenna tiedosto",
        "uploadbtn": "Tallenna tiedosto",
        "reuploaddesc": "Peruuta tallennus ja palaa tallennuslomakkeelle.",
        "upload-http-error": "HTTP-virhe: $1",
        "upload-copy-upload-invalid-domain": "Tiedostojen tallentamista tästä verkko-osoitteesta ei ole sallittu.",
        "upload-dialog-title": "Tiedoston tallennus",
-       "upload-dialog-error": "Tapahtui virhe",
-       "upload-dialog-warning": "Sisältää varoituksen",
        "upload-dialog-button-cancel": "Peru",
        "upload-dialog-button-done": "Valmis",
        "upload-dialog-button-save": "Tallenna",
        "upload-dialog-button-upload": "Tallenna",
-       "upload-dialog-label-select-file": "Valitse tiedosto",
-       "upload-dialog-label-infoform-title": "Yksityiskohdat",
-       "upload-dialog-label-infoform-name": "Nimi",
-       "upload-dialog-label-infoform-description": "Kuvaus",
-       "upload-dialog-label-usage-title": "Käyttö",
-       "upload-dialog-label-usage-filename": "Tiedostonimi",
+       "upload-process-error": "Tapahtui virhe",
+       "upload-process-warning": "Sisältää varoituksen",
+       "upload-form-label-select-file": "Valitse tiedosto",
+       "upload-form-label-infoform-title": "Yksityiskohdat",
+       "upload-form-label-infoform-name": "Nimi",
+       "upload-form-label-infoform-description": "Kuvaus",
+       "upload-form-label-usage-title": "Käyttö",
+       "upload-form-label-usage-filename": "Tiedostonimi",
+       "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ä",
        "backend-fail-stream": "Tiedoston $1 virtauttaminen epäonnistui.",
        "backend-fail-backup": "Tiedostoa $1 ei voitu varmuuskopioida.",
        "backend-fail-notexists": "Tiedostoa $1 ei ole olemassa.",
        "filerevert-legend": "Tiedoston palautus",
        "filerevert-intro": "Olet palauttamassa takaisin tiedostoa '''[[Media:$1|$1]]''' [$4 versioon, joka luotiin $2 kello $3].",
        "filerevert-comment": "Syy:",
-       "filerevert-defaultcomment": "Palautettiin takaisin versioon, joka luotiin $1 kello $2 (UTC)",
+       "filerevert-defaultcomment": "Palautettiin takaisin versioon, joka tehtiin $1 kello $2 ($3)",
        "filerevert-submit": "Suorita palauttaminen",
        "filerevert-success": "'''[[Media:$1|$1]]''' on palautettu takaisin [$4 versioon, joka luotiin $2 kello $3].",
        "filerevert-badversion": "Tiedostosta ei ole luotu versiota kyseisellä ajan hetkellä.",
        "emailccsubject": "Kopio lähettämästäsi viestistä osoitteeseen $1: $2",
        "emailsent": "Sähköposti lähetetty",
        "emailsenttext": "Sähköpostiviestisi on lähetetty.",
-       "emailuserfooter": "Tämän sähköpostin lähetti $1 vastaanottajalle $2 käyttämällä ”{{int:emailuser}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.",
+       "emailuserfooter": "Tämän sähköpostin {{GENDER:$1|lähetti}} $1 vastaanottajalle {{GENDER:$2|$2}} käyttämällä ”{{int:emailuser}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.",
        "usermessage-summary": "Jätetään järjestelmäviesti.",
        "usermessage-editor": "Järjestelmäviestittäjä",
        "watchlist": "Tarkkailulista",
        "deletepage": "Poista sivu",
        "confirm": "Toteuta",
        "excontent": "sisälsi: ”$1”",
-       "excontentauthor": "sisälsi: ”$1” (ainoa muokkaaja oli $2)",
+       "excontentauthor": "sisältö oli: \"$1\", ja ainoa muokkaaja oli \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|keskustelu]])",
        "exbeforeblank": "ennen tyhjentämistä sisälsi: ”$1”",
        "delete-confirm": "Poista ”$1”",
        "delete-legend": "Sivun poisto",
        "move-page-legend": "Siirrä sivu",
        "movepagetext": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle.\nVanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\nVoit päivittää sivuun viittaavat ohjaukset automaattisesti ohjaamaan uudelle nimelle.\nJos et halua tätä tehtävän automaattisesti, muista tehdä tarkistukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta.\nOlet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
        "movepagetext-noredirectfixer": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle. Vanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\n\nTarkasta sivuun viittaavat ohjaukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta. Olet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
-       "movepagetalktext": "Sivuun mahdollisesti liittyvä keskustelusivu siirtyy automaattisesti mukana, '''paitsi:'''\n*jos siirron kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai\n*jos otat pois rastin alla olevasta ruudusta.\n\nNäissä tapauksissa sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
-       "movearticle": "Siirrettävä sivu:",
+       "movepagetalktext": "Jos valitset tämän vaihtoehdon, sivuun liittyvä keskustelusivu siirtyy automaattisesti uudelle nimelle, paitsi jos uudella nimellä on jo olemassa keskustelusivu, joka ei ole tyhjä.\n\nTällöin sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
        "moveuserpage-warning": "'''Varoitus:''' Olet siirtämässä käyttäjäsivua. Huomaa, että vain sivu siirretään ja käyttäjää ''ei'' nimetä uudelleen.",
        "movecategorypage-warning": "<strong>Varoitus:</strong> Olet siirtämässä luokkasivua. Ota huomioon, että ainoastaan luokan oma sivu siirretään ja että tämä toiminto <em>ei</em> luokittele tai itsestään siirrä vanhassa luokassa olevia sivuja uuteen luokkaan.",
        "movenologintext": "Sinun pitää olla rekisteröitynyt käyttäjä ja [[Special:UserLogin|kirjautua sisään]], jotta voisit siirtää sivun.",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|loi}} käyttäjätunnuksen $3 ja salasana lähetettiin sähköpostitse",
        "logentry-newusers-autocreate": "Käyttäjätunnus $1 {{GENDER:$2|luotiin}} automaattisesti",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|siirsi}} suojauksen asetukset sivulta $4 sivulle $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|otti pois}} suojauksen kohteesta $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|suojasi}} kohteen $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|suojasi}} kohteen $3 $4 [tarttuvasti]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|muutti}} suojauksen tasoa kohteessa $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|muutti}} suojauksen tasoa kohteessa $3 $4 [tarttuvasti]",
        "logentry-rights-rights": "$1 {{GENDER:$2|muutti}} käyttäjän $3 oikeudet ryhmistä $4 ryhmiin $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|muutti}} käyttäjän $3 jäsenyyttä ryhmässä",
        "logentry-rights-autopromote": "Käyttäjän $1 oikeudet {{GENDER:$2|muuttuivat}} automaattisesti ryhmistä $4 ryhmiin $5",
        "api-error-badaccess-groups": "Sinulla ei ole oikeutta tallentaa tiedostoja tähän wikiin.",
        "api-error-badtoken": "Sisäinen virhe: virheellinen tarkistussumma.",
        "api-error-copyuploaddisabled": "Tallentaminen URL-osoitteesta ei ole käytössä.",
-       "api-error-duplicate": "Samansisältöisiä tiedostoja löytyi {{PLURAL:$1|[$2 yksi kappale]|[$2 useampia kappaleita]}}.",
-       "api-error-duplicate-archive": "Sivustolla oli aiemmin {{PLURAL:$1|[$2 toinen samansisältöinen tiedosto]|[$2 toisia samansisältöisiä tiedostoja]}}, mutta {{PLURAL:$1|se|ne}} poistettiin.",
-       "api-error-duplicate-archive-popup-title": "Tiedostolla on {{PLURAL:$1|poistettu kaksoiskappale|poistettuja kaksoiskappaleita}}",
-       "api-error-duplicate-popup-title": "Tiedoston {{PLURAL:$1|kaksoiskappale|kaksoiskappaleet}}",
+       "api-error-duplicate": "Samansisältöisiä tiedostoja löytyi {{PLURAL:$1|yksi kappale|useampia kappaleita}}.",
+       "api-error-duplicate-archive": "Sivustolla oli aiemmin {{PLURAL:$1|toinen samansisältöinen tiedosto|toisia samansisältöisiä tiedostoja}}, mutta {{PLURAL:$1|se|ne}} poistettiin.",
        "api-error-empty-file": "Määrittämäsi tiedosto on tyhjä.",
        "api-error-emptypage": "Ei ole sallittua luoda uutta, tyhjää sivua.",
        "api-error-fetchfileerror": "Sisäinen virhe: Jotakin meni pieleen kun tiedostoa haettiin.",
index 7ef64c9..e08ede1 100644 (file)
@@ -10,7 +10,8 @@
                        "Spacebirdy",
                        "Urhixidur",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Undirstrika leinki:",
        "mergehistory-go": "Vís rættingar ið kunnu samantvinnast",
        "mergehistory-submit": "Samanflætta versjónirnar",
        "mergehistory-empty": "Ongar versjónir kunnu samanflættast.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versjón|versjónir}} av [[:$1]] er samanflættað við [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versjón|versjónir}} av $1 er samanflættað við [[:$2]].",
        "mergehistory-no-source": "Keldu síðan $1 er ikki til.",
        "mergehistory-no-destination": "Destinatiónssíðan $1 er ikki til.",
        "mergehistory-invalid-source": "Keldusíðan má hava eitt gyldugt heiti.",
        "filerevert-legend": "Endurstovna fílu",
        "filerevert-intro": "Tú ert í ferð við at endurstovna fílu '''[[Media:$1|$1]]''' til [$4 verssjónina sum hon sá út kl. $3, hin $2].",
        "filerevert-comment": "Orsøk:",
-       "filerevert-defaultcomment": "Endurstovanð til versjón frá kl. $2, hin $1",
+       "filerevert-defaultcomment": "Endurstovanð til versjón frá kl. $2, hin $1 ($3)",
        "filerevert-submit": "Endurstovna",
        "filerevert-success": "'''[[Media:$1|$1]]''' er blivið endurstovna til [$4 versjónina frá $2, kl. $3].",
        "filedelete": "Strika $1",
        "move-page-legend": "Flyt síðu",
        "movepagetext": "Við frymlinum niðanfyri kanst tú umnevna eina síðu og flyta alla hennara søgu við til nýggja navnið.\nGamla navnið verður ein tilvísingarsíða til ta nýggju.\nTú kanst dagføra tilvísingarsíður sum vísa til uppruna tittulin sjálvvirkandi.\nUm tú velur ikki at gera tað, ver so vís/ur í at eftirkanna [[Special:DoubleRedirects|dupultar]]  ella [[Special:BrokenRedirects|brotnar tilvísingarsíður]].\nTú hevur ábyrgdina fyri at ansa eftir at slóðir framvegis peika hagar, tær skulu.\n\nLegg merki til at síðan '''ikki''' verður flutt, um ein síða longu er við nýggja navninum, uttan so at hon er tóm, er ein tilvísingarsíða og onga rættingarsøgu hevur.\nHetta merkir at tú kanst umnevna eina síðu aftur hagani hon kom, um tú gjørdi eitt mistak, og tú kanst ikki yvirskriva eina verandi síðu.\n\n'''ÁVARING!'''\nHetta kann vera ein ógvuslig og óvæntað broyting av einari vældámdari síðu.\nVinarliga tryggja tær, at tú skilur avleiðingarnar av hesum áðrenn tú heldur áfam.",
        "movepagetext-noredirectfixer": "Við frymlinum niðanfyri kanst tú umnevna eina síðu og flyta alla hennara søgu við til nýggja navnið.\nGamla navnið verður ein tilvísingarsíða til ta nýggju.\nVer vís/ur í at eftirkanna [[Special:DoubleRedirects|dupult]] ella [[Special:BrokenRedirects|brotnaðar umstillingar]].\nTú hevur ábyrgdina av at vissa teg um at leinkjur halda fram við at peika á har sum tað er meiningin at tær skulu fara.\n\nLegg merki til at síðan '''ikki''' verður flutt, um ein síða longu er við nýggja navninum, uttan at hon er tóm og onga søgu hevur.\nHetta merkir at tú kanst umnevna eina síðu aftur hagani hon kom, um tú gjørdi eitt mistak. Tú kanst ikki skriva yvir eina verandi síðu.\n\n'''ÁVARING!'''\nHetta kann vera ein ógvuslig og óvæntað flyting av einari vældámdari síðu.\nVinarliga tryggja tær, at tú skilur avleiðingarnar av hesum áðrenn tú heldur áfam.",
-       "movearticle": "Flyt síðu:",
        "moveuserpage-warning": "'''Ávaring:''' Tú ert í ferð við at flyta eina brúkarasíðu. Legg vinarliga til merkis, at bert síðan verður flutt og brúkarin fær ''ikki'' nýtt navn.",
        "movenologintext": "Tú skalt vera ein skrásettur brúkari og [[Special:UserLogin|innritað/ur]] fyri at kunna flyta eina síðu.",
        "movenotallowed": "Tú hevur ikki loyvi til at flyta síður.",
index 010340d..0a1f8ee 100644 (file)
        "tog-showtoolbar": "Afficher la barre d’outils de modification",
        "tog-editondblclick": "Modifier des pages sur double-clic",
        "tog-editsectiononrightclick": "Activer la modification des sections par un clic droit sur les titres de section",
-       "tog-watchcreations": "Ajouter à ma liste de suivi les pages que je crée et les fichiers que j'importe",
-       "tog-watchdefault": "Ajouter les pages et les fichiers que je modifie à ma liste de suivi",
-       "tog-watchmoves": "Ajouter les pages et les fichiers que je déplace à ma liste de suivi",
+       "tog-watchcreations": "Ajouter à ma liste de suivi les pages que je crée et les fichiers que jimporte",
+       "tog-watchdefault": "Ajouter à ma liste de suivi les pages et les fichiers que je modifie",
+       "tog-watchmoves": "Ajouter à ma liste de suivi les pages et les fichiers que je renomme",
        "tog-watchdeletion": "Ajouter à ma liste de suivi les pages et les fichiers que je supprime",
        "tog-watchrollback": "Ajouter à ma liste de suivi les pages sur lesquelles j’ai effectué une révocation",
        "tog-minordefault": "Marquer toutes mes modifications comme mineures par défaut",
        "nstab-template": "Modèle",
        "nstab-help": "Aide",
        "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}}.",
        "nosuchspecialpage": "Page spéciale inexistante",
        "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.",
-       "title-invalid-leading-colon": "Le titre de la page demandée contient une virgule invalide au début.",
+       "title-invalid-leading-colon": "Le titre de la page demandée contient un deux-points invalide au début.",
        "perfcached": "Les données suivantes sont en cache et peuvent ne pas être à jour. Un maximum de {{PLURAL:$1|un résultat|$1 résultats}} est disponible dans le cache.",
        "perfcachedts": "Les données suivantes sont en cache et ont été mises à jour pour la dernière fois le $1. Un maximum de {{PLURAL:$4|un résultat est disponible|$4 résultats sont disponibles}} dans le cache.",
        "querypage-no-updates": "Les mises à jour pour cette page sont actuellement désactivées. Les données ci-dessous ne sont pas mises à jour.",
        "viewsource": "Voir le texte source",
        "viewsource-title": "Voir la source de $1",
        "actionthrottled": "Action limitée",
-       "actionthrottledtext": "Pour lutter contre le spam, l'utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s'avère que vous avez dépassé cette limite.\nEssayez à nouveau dans quelques minutes.",
+       "actionthrottledtext": "Pour lutter contre les abus, l’utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s’avère que vous avez dépassé cette limite.\nEssayez à nouveau dans quelques minutes.",
        "protectedpagetext": "Cette page a été protégée pour empêcher sa modification ou d'autres actions.",
        "viewsourcetext": "Vous pouvez voir et copier le contenu de cette page.",
        "viewyourtext": "Vous pouvez voir et copier le contenu de <strong>vos modifications</strong> à cette page.",
        "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 un autre compte",
+       "createacct-another-submit": "Créer le compte",
        "createacct-benefit-heading": "{{SITENAME}} est écrit par des gens comme vous.",
        "createacct-benefit-body1": "{{PLURAL:$1|modification|modifications}}",
        "createacct-benefit-body2": "{{PLURAL:$1|article|articles}}",
        "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": "Un courriel de réinitialisation de mot de passe a été envoyé.",
+       "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-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 l’adresse de courriel",
-       "changeemail-text": "Remplissez ce formulaire pour changer votre adresse de courriel. Vous devrez entrer votre mot de passe pour confirmer ce changement.",
+       "changeemail": "Changer ou supprimer l’adresse de courriel",
+       "changeemail-text": "Remplissez ce formulaire pour changer votre adresse de courriel. Vous devrez entrer votre mot de passe pour confirmer ce changement. Pour supprimer l’association de toute adresse de courriel à votre compte, validez ce formulaire en laissant vide la nouvelle adresse de courriel.",
        "changeemail-no-info": "Vous devez être connecté pour pouvoir accéder directement à cette page.",
        "changeemail-oldemail": "Adresse de courriel actuelle :",
        "changeemail-newemail": "Nouvelle adresse de courriel :",
+       "changeemail-newemail-help": "Laissez ce champ vide si vous voulez supprimer votre adresse de courriel. Sans adresse de courriel renseignée, vous ne pourrez plus réinitialiser votre mot de passe en cas d’oubli ni recevoir de courriels à partir de ce wiki.",
        "changeemail-none": "(aucune)",
        "changeemail-password": "Votre mot de passe sur {{SITENAME}} :",
        "changeemail-submit": "Changer l’adresse de courriel",
        "permissionserrorstext-withaction": "Vous ne pouvez pas $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
        "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.",
        "log-fulllog": "Voir le journal complet",
        "edit-hook-aborted": "Échec de la modification par une extension.\nCause inconnue",
        "edit-gone-missing": "N'a pas pu mettre à jour la page.\nIl semble qu'elle ait été supprimée.",
        "mergehistory-go": "Voir les modifications qui peuvent être fusionnées",
        "mergehistory-submit": "Fusionner les versions",
        "mergehistory-empty": "Aucune version ne peut être fusionnée.",
-       "mergehistory-success": "$3 version{{PLURAL:$3||s}} de [[:$1]] fusionnée{{PLURAL:$3||s}} dans [[:$2]].",
+       "mergehistory-done": "$3 version{{PLURAL:$3||s}} de $1 {{PLURAL:$3|a été fusionnée|ont été fusionnées}} dans [[:$2]].",
        "mergehistory-fail": "Impossible de procéder à la fusion des historiques. Resélectionner la page ainsi que les paramètres de date.",
        "mergehistory-fail-toobig": "Impossible d’effectuer la fusion de l’historique car un nombre de {{PLURAL:$1|révisions}} supérieur à la limite de $1 devrait être déplacé.",
        "mergehistory-no-source": "La page d'origine $1 n'existe pas.",
        "prefs-watchlist-token": "Jeton pour la liste de suivi :",
        "prefs-misc": "Préférences diverses",
        "prefs-resetpass": "Changer de mot de passe",
-       "prefs-changeemail": "Changer l'adresse de courriel",
+       "prefs-changeemail": "Changer ou supprimer l'adresse de courriel",
        "prefs-setemail": "Définir une adresse de courriel",
        "prefs-email": "Options des courriels",
        "prefs-rendering": "Apparence",
        "group-bot": "Robots",
        "group-sysop": "Administrateurs",
        "group-bureaucrat": "Bureaucrates",
-       "group-suppress": "Superviseurs",
+       "group-suppress": "Limitateurs",
        "group-all": "(tous)",
        "group-user-member": "{{GENDER:$1|utilisateur|utilisatrice}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utilisateur enregistré|utilisatrice enregistré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|superviseur|superviseuse}}",
+       "group-suppress-member": "{{GENDER:$1|limitateur|limitatrice}}",
        "grouppage-user": "{{ns:project}}:Utilisateurs",
        "grouppage-autoconfirmed": "{{ns:project}}:Utilisateurs enregistrés",
        "grouppage-bot": "{{ns:project}}:Robots",
        "grouppage-sysop": "{{ns:project}}:Administrateurs",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrates",
-       "grouppage-suppress": "{{ns:project}}:Superviseurs",
+       "grouppage-suppress": "{{ns:project}}:Suppress",
        "right-read": "Lire les pages",
        "right-edit": "Modifier les pages",
        "right-createpage": "Créer des pages (qui ne sont pas des pages de discussion)",
        "recentchangeslinked-summary": "Cette page spéciale montre les modifications récentes sur les pages qui sont liées. Les pages de votre liste de suivi sont '''en gras'''.",
        "recentchangeslinked-page": "Nom de la page :",
        "recentchangeslinked-to": "Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l'inverse",
+       "recentchanges-page-added-to-category": "[[:$1]] ajouté à la catégorie",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] et {{PLURAL:$2|une page ajoutée|$2 pages ajoutées}} à la catégorie",
+       "recentchanges-page-removed-from-category": "[[:$1]] supprimé de la catégorie",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] et {{PLURAL:$2|une page retirée|$2 pages retirées}} de la catégorie",
+       "autochange-username": "Modification automatique de MédiaWiki",
        "upload": "Importer un fichier",
        "uploadbtn": "Importer le fichier",
        "reuploaddesc": "Annuler et retourner au formulaire d'import",
        "upload-options": "Options d’import de fichiers",
        "watchthisupload": "Suivre ce fichier",
        "filewasdeleted": "Un fichier avec ce nom a déjà été importé, puis supprimé.\nVous devriez vérifier le $1 avant de l'importer à nouveau.",
+       "filename-thumb-name": "Ce titre ressemble à celui d’une vignette. Évitez d’importer des vignettes d’une image déjà présente sur le wiki. Si ce n’est pas le cas, veuillez corriger le nom de fichier afin qu’il soit plus descriptif et qu’il ne commence pas comme un titre de vignette.",
        "filename-bad-prefix": "Le nom du fichier commence par '''« $1 »''' qui est typiquement un nom attribué automatiquement par les appareils photo numériques.\nVeuillez choisir un nom de fichier descriptif.",
        "filename-prefix-blacklist": " #<!-- laisser cette ligne telle quelle --><pre>\n# La syntaxe est la suivante :\n#  * Tout ce qui figure entre un caractère \"#\" jusqu’à la fin de la ligne est un commentaire ;\n#  * Toute ligne non vide est un préfixe typique de nom de fichier assigné automatiquement par les appareils numériques :\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # certains téléphones mobiles\nIMG # générique\nJD # Jenoptik\nMGP # Pentax\nPICT # divers\n #</pre><!-- laisser cette ligne telle quelle -->",
        "upload-success-subj": "Import effectué avec succès",
        "upload-http-error": "Une erreur HTTP est survenue : $1",
        "upload-copy-upload-invalid-domain": "La copie des téléversements n’est pas disponible depuis ce domaine.",
        "upload-dialog-title": "Téléverser un fichier",
-       "upload-dialog-error": "Une erreur est survenue",
-       "upload-dialog-warning": "Un avertissement s’est produit",
        "upload-dialog-button-cancel": "Annuler",
        "upload-dialog-button-done": "Fait",
        "upload-dialog-button-save": "Enregistrer",
        "upload-dialog-button-upload": "Téléverser",
-       "upload-dialog-label-select-file": "Sélectionner un fichier",
-       "upload-dialog-label-infoform-title": "Détails",
-       "upload-dialog-label-infoform-name": "Nom",
-       "upload-dialog-label-infoform-description": "Description",
-       "upload-dialog-label-usage-title": "Utilisation",
-       "upload-dialog-label-usage-filename": "Nom du fichier",
+       "upload-process-error": "Une erreur est survenue",
+       "upload-process-warning": "Un avertissement s’est produit",
+       "upload-form-label-select-file": "Sélectionner un fichier",
+       "upload-form-label-infoform-title": "Détails",
+       "upload-form-label-infoform-name": "Nom",
+       "upload-form-label-infoform-description": "Description",
+       "upload-form-label-usage-title": "Utilisation",
+       "upload-form-label-usage-filename": "Nom du fichier",
+       "foreign-structured-upload-form-label-own-work": "Je suis l’auteur de cette œuvre",
+       "foreign-structured-upload-form-label-infoform-categories": "Catégories",
+       "foreign-structured-upload-form-label-infoform-date": "Date",
+       "foreign-structured-upload-form-label-own-work-message-default": "Je comprends que je téléverse ce fichier vers un dépôt partagé. Je confirme agir en accord avec les conditions d’utilisation et les règles relatives aux licences de celui-ci.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Si vous n’êtes pas en mesure de téléverser ce fichier de façon conforme aux règles de ce dépôt partagé, veuillez fermer cette boîte de dialogue et essayer une autre méthode.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Vous pouvez également essayer d’utiliser [[Special:Upload|la page de téléversement de {{SITENAME}}]], si les règles du site autorisent le téléversement du fichier.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Je certifie être le détenteur des droits d’auteur sur ce fichier, j’accepte de publier ce fichier sur Wikimedia Commons en le plaçant irrévocablement sous licence [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] et j’accepte les [https://wikimediafoundation.org/wiki/Terms_of_Use conditions d’utilisation].",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Si vous n’êtes pas le détenteur des droits d’auteur sur ce fichier ou que vous voulez le publier sous une licence différente, vous pouvez utiliser l’[https://commons.wikimedia.org/wiki/Special:UploadWizard assistant d’import].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Vous pouvez également essayer d’utiliser [[Special:Upload|la page de téléversement de {{SITENAME}}]], si les règles du site autorisent le téléversement du fichier.",
        "backend-fail-stream": "Impossible de lire le fichier $1.",
        "backend-fail-backup": "Impossible de sauvegarder le fichier $1.",
        "backend-fail-notexists": "Le fichier $1 n’existe pas.",
        "filerevert-legend": "Rétablir le fichier",
        "filerevert-intro": "Vous êtes sur le point de rétablir le fichier '''[[Media:$1|$1]]''' à la [$4 version du $2 à $3].",
        "filerevert-comment": "Motif :",
-       "filerevert-defaultcomment": "Version du $1 à $2 rétablie",
+       "filerevert-defaultcomment": "Retour sur la version du $2, $1 ($3)",
        "filerevert-submit": "Rétablir",
        "filerevert-success": "'''[[Media:$1|$1]]''' a été rétabli à [$4 la version du $2 à $3].",
        "filerevert-badversion": "Il n'y a pas localement de version antérieure du fichier qui porte la date indiquée.",
        "nopagetext": "La page cible que vous avez indiquée n'existe pas.",
        "pager-newer-n": "{{PLURAL:$1|plus récente|$1 plus récentes}}",
        "pager-older-n": "{{PLURAL:$1|plus ancienne|$1 plus anciennes}}",
-       "suppress": "Superviser",
+       "suppress": "Supprimer",
        "querypage-disabled": "Cette page spéciale est désactivée pour des raisons de performances.",
        "apihelp": "Aide de l’API",
        "apihelp-no-such-module": "Le module « $1 » est introuvable.",
        "deletepage": "Supprimer la page",
        "confirm": "Confirmer",
        "excontent": "contenait « $1 »",
-       "excontentauthor": "contenait « $1 » (et son seul contributeur était [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "contenait « $1 » et son seul contributeur était [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
        "exbeforeblank": "contenait avant blanchiment « $1 »",
        "delete-confirm": "Supprimer « $1 »",
        "delete-legend": "Supprimer",
        "move-page-legend": "Renommer une page",
        "movepagetext": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. L'ancien titre deviendra une page de redirection vers le nouveau titre. Vous pouvez mettre à jour automatiquement les redirections actuelles qui pointent vers le titre original. Si vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera '''pas''' renommée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière est une simple redirection avec un historique de modifications vierge. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné.\n\n'''Attention !'''\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d'en avoir compris les conséquences avant de continuer.",
        "movepagetext-noredirectfixer": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom.\nL'ancien titre deviendra une page de redirection vers le nouveau titre.\nVérifiez bien les [[Special:DoubleRedirects|doubles redirections]] ou les [[Special:BrokenRedirects|redirections cassées]].\nVous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera '''pas''' déplacée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné, et il est impossible d'écraser une page existante.\n\n'''Attention !'''\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d'en avoir compris les conséquences avant de continuer.",
-       "movepagetalktext": "La page de discussion associée, si présente, sera automatiquement renommée '''sauf si :'''\n* vous déplacez la page vers un autre espace de noms, ou\n* une page de discussion non vide existe déjà sous le nouveau nom, ou\n* vous décochez la case ci-dessous.\n\nDans ces cas-là, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
-       "movearticle": "Renommer la page :",
+       "movepagetalktext": "Si vous cochez cette case, la page de discussion associée sera automatiquement renommée, à moins qu’une page de discussion non vide existe déjà sous ce nouveau nom.\n\nDans ce cas, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
        "moveuserpage-warning": "'''Attention :''' Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur '''ne''' sera '''pas''' renommé.",
        "movecategorypage-warning": "<strong>Avertissement :</strong> Vous êtes sur le point de renommer une page de catégorie. Veuillez noter que seule la catégorie sera renommée et <em>qu’aucune</em> des pages de l’ancienne catégorie ne sera transférée dans la nouvelle.",
        "movenologintext": "Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e}}]] avec un compte utilisateur enregistré et d'ancienneté suffisante.",
        "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page utilisateur (à l’exception d’une sous-page).",
        "cant-move-category-page": "Vous n'avez pas la permis de renommer les pages de catégorie.",
        "cant-move-to-category-page": "Vous n'avez pas la permission de renommer une page vers une page de catégorie.",
-       "newtitle": "Vers le nouveau titre :",
+       "newtitle": "Nouveau titre :",
        "move-watch": "Suivre les pages originale et nouvelle",
        "movepagebtn": "Renommer la page",
        "pagemovedsub": "Renommage réussi",
        "logentry-newusers-byemail": "Le compte utilisateur $3 {{GENDER:$2|a été créé}} par $1 et le mot de passe a été envoyé par courriel",
        "logentry-newusers-autocreate": "Le compte $1 {{GENDER:$2|a été créé}} automatiquement",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|a déplacé}} les paramètres de protection de $4 vers $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|a supprimé}} la protection de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|a protégé}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|a protégé}} $3 $4 [protection en cascade]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|a modifié}} le niveau de protection de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|a modifié}} le niveau de protection de $3 $4 [protection en cascade]",
        "logentry-rights-rights": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3 de $4 à $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5",
        "api-error-badaccess-groups": "Vous n'êtes pas autorisé à verser des fichiers sur ce wiki.",
        "api-error-badtoken": "Erreur interne : mauvais « jeton ».",
        "api-error-copyuploaddisabled": "Les versements via URL sont désactivés sur ce serveur.",
-       "api-error-duplicate": "Il y a déjà {{PLURAL:$1|[$2 un autre fichier présent]|[$2 d'autres fichiers présents]}} sur le site avec le même contenu.",
-       "api-error-duplicate-archive": "Il y avait déjà {{PLURAL:$1|[$2 un autre fichier présent]|[$2 d'autres fichiers présents]}} sur le site avec le même contenu, mais {{PLURAL:$1|il a été supprimé|ils ont été supprimés}}.",
-       "api-error-duplicate-archive-popup-title": "Dupliquer {{PLURAL:$1|le fichier|les fichiers}} qui {{PLURAL:$1|a déjà été supprimé|ont déjà été supprimés}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|fichier|fichiers}} en double",
+       "api-error-duplicate": "Il y a déjà {{PLURAL:$1|un autre fichier présent|d'autres fichiers présents}} sur le site avec le même contenu.",
+       "api-error-duplicate-archive": "Il y avait déjà {{PLURAL:$1|un autre fichier présent|d'autres fichiers présents}} sur le site avec le même contenu, mais {{PLURAL:$1|il a été supprimé|ils ont été supprimés}}.",
        "api-error-empty-file": "Le fichier que vous avez soumis était vide.",
        "api-error-emptypage": "Création de pages vide n'est pas autorisée.",
        "api-error-fetchfileerror": "Erreur interne : Quelque chose s'est mal passé lors de la récupération du fichier.",
index 4812b02..4a69006 100644 (file)
@@ -7,7 +7,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Soul Train",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Solegnér los lims :",
        "mergehistory-go": "Montrar los changements que pôvont étre fusionâs",
        "mergehistory-submit": "Fusionar les vèrsions",
        "mergehistory-empty": "Niona vèrsion pôt étre fusionâye.",
-       "mergehistory-success": "$3 vèrsion{{PLURAL:$3||s}} de [[:$1]] fusionâye{{PLURAL:$3||s}} avouéc reusséta dedens [[:$2]].",
+       "mergehistory-done": "$3 vèrsion{{PLURAL:$3||s}} de $1 fusionâye{{PLURAL:$3||s}} avouéc reusséta dedens [[:$2]].",
        "mergehistory-fail": "Y at pas moyen de fâre la fusion des historicos, se vos plét tornâd chouèsir la pâge et pués los paramètros de dâta.",
        "mergehistory-no-source": "La pâge d’origina $1 ègziste pas.",
        "mergehistory-no-destination": "La pâge de dèstinacion $1 ègziste pas.",
        "filerevert-legend": "Rèvocar lo fichiér",
        "filerevert-intro": "Vos éte prèst a rèvocar lo fichiér '''[[Media:$1|$1]]''' a la [$4 vèrsion du $2 a $3].",
        "filerevert-comment": "Rêson :",
-       "filerevert-defaultcomment": "Rèvocâ a la vèrsion du $1 a $2",
+       "filerevert-defaultcomment": "Rèvocâ a la vèrsion du $1 a $2 ($3)",
        "filerevert-submit": "Rèvocar",
        "filerevert-success": "'''[[Media:$1|$1]]''' est étâ rèvocâ a la [$4 vèrsion du $2 a $3].",
        "filerevert-badversion": "Y at gins de vèrsion locâla devant de cél fichiér avouéc l’horodatâjo balyê.",
        "movepagetext": "Utilisâd lo formulèro ce-desot por renomar una pâge, en dèplacient tot son historico vers lo novél nom.\nLo viely titro vindrat una pâge de redirèccion de vers lo titro novél.\nVos pouede betar a jorn ôtomaticament les redirèccions d’ora que pouentont vers lo titro originâl.\nSe vos chouèsésséd de pas lo fâre, assurâd-vos de controlar tota [[Special:DoubleRedirects|redirèccion dobla]] ou ben [[Special:BrokenRedirects|câssa]].\nVos avéd la rèsponsabilitât de vos assurar que los lims continuont de pouentar vers lor dèstinacion suposâ.\n\nNotâd que la pâge serat '''pas''' dèplaciê s’y at ja una pâge avouéc lo titro novél, a muens que cela dèrriére seye voueda ou ben seye ren qu’una redirèccion et que son historico des changements seye vouedo.\nCen vôt dére que vos pouede renomar una pâge vers sa posicion d’origina se vos éd fêt una èrror, mas que vos pouede pas ècllafar una pâge ja ègzistenta.\n\n'''ATENCION !'''\nCen pôt provocar un changement fôrt et emprèvu por una pâge sovent vua ;\nassurâd-vos de nen avêr comprês les consèquences devant que continuar.",
        "movepagetext-noredirectfixer": "Utilisâd lo formulèro ce-desot por renomar una pâge, en dèplacient tot son historico vers lo novél nom.\nLo viely titro vindrat una pâge de redirèccion de vers lo titro novél.\nControlâd bien les [[Special:DoubleRedirects|redirèccions dobles]] ou ben [[Special:BrokenRedirects|câsses]].\nVos avéd la rèsponsabilitât de vos assurar que los lims continuont de pouentar vers lor dèstinacion suposâ.\n\nNotâd que la pâge serat '''pas''' dèplaciê s’y at ja una pâge avouéc lo titro novél, a muens que cela dèrriére seye voueda ou ben seye ren qu’una redirèccion et que son historico des changements seye vouedo.\nCen vôt dére que vos pouede renomar una pâge vers sa posicion d’origina se vos éd fêt una èrror, mas que vos pouede pas ècllafar una pâge ja ègzistenta.\n\n'''ATENCION !'''\nCen pôt provocar un changement fôrt et emprèvu por una pâge sovent vua ;\nassurâd-vos de nen avêr comprês les consèquences devant que continuar.",
        "movepagetalktext": "La pâge de discussion associyê, se presente, serat renomâ ôtomaticament avouéc '''a muens que :'''\n* una pâge de discussion pas voueda ègziste ja avouéc lo novél nom, ou ben\n* vos pouentâd pas la câsa ce-desot.\n\nDens celos câs, vos devréd renomar ou ben fusionar la pâge a la man se vos lo voléd.",
-       "movearticle": "Renomar la pâge :",
        "moveuserpage-warning": "'''Atencion :''' vos éte prèst a renomar una pâge usanciér. Volyéd notar que solament la pâge serat renomâ et que l’usanciér serat '''pas''' renomâ.",
        "movenologintext": "Por povêr renomar una pâge, vos dête étre [[Special:UserLogin|branchiê]] coment usanciér encartâ.",
        "movenotallowed": "Vos avéd pas la pèrmission de renomar les pâges.",
        "api-error-badaccess-groups": "Vos éte pas ôtorisâ a tèlèchargiér des fichiérs sur ceti vouiqui.",
        "api-error-badtoken": "Èrror de dedens : crouyo « jeton ».",
        "api-error-copyuploaddisabled": "Los tèlèchargements per URL sont dèsactivâs sur cél sèrvor.",
-       "api-error-duplicate": "Y at {{PLURAL:$1|[$2 un ôtro fichiér]|[$2 d’ôtros fichiérs]}} ja sur lo seto avouéc lo mémo contegnu.",
-       "api-error-duplicate-archive": "Y avéve {{PLURAL:$1|[$2 un ôtro fichiér]|[$2 d’ôtros fichiérs]}} ja sur lo seto avouéc lo mémo contegnu, mas {{PLURAL:$1|il at étâ suprimâ|ils ont étâ suprimâs}}.",
-       "api-error-duplicate-archive-popup-title": "Duplicar {{PLURAL:$1|lo fichiér|los fichiérs}} qu’{{PLURAL:$1|at ja étâ suprimâ|ont ja étâ suprimâs}}",
-       "api-error-duplicate-popup-title": "Fichiér{{PLURAL:$1||s}} en doblo",
+       "api-error-duplicate": "Y at {{PLURAL:$1|un ôtro fichiér|d’ôtros fichiérs}} ja sur lo seto avouéc lo mémo contegnu.",
+       "api-error-duplicate-archive": "Y avéve {{PLURAL:$1|un ôtro fichiér|d’ôtros fichiérs}} ja sur lo seto avouéc lo mémo contegnu, mas {{PLURAL:$1|il at étâ suprimâ|ils ont étâ suprimâs}}.",
        "api-error-empty-file": "Lo fichiér que vos éd somês ére vouedo.",
        "api-error-emptypage": "La crèacion de pâges novèles vouedes est pas ôtorisâ.",
        "api-error-fetchfileerror": "Èrror de dedens : quârque-ren s’est mâl passâ pendent la rècupèracion du fichiér.",
index 087e202..09e8565 100644 (file)
@@ -8,7 +8,9 @@
                        "Murma174",
                        "Pyt",
                        "아라",
-                       "Purodha"
+                       "Purodha",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Ferwisangen onerstrik:",
        "mergehistory-go": "Wise werjuunen, diar tuupfeerd wurd kön.",
        "mergehistory-submit": "Werjuunen tuupfeer",
        "mergehistory-empty": "Nian werjuunen kön tuupfeerd wurd.",
-       "mergehistory-success": "$3 {{PLURAL:$3|werjuun|werjuunen}} faan [[:$1]] tuupfeerd tu [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|werjuun|werjuunen}} faan $1 tuupfeerd tu [[:$2]].",
        "mergehistory-fail": "Werjuunen kön ei tuupfeerd wurd. Luke noch ans efter at sidj an a tidjen.",
        "mergehistory-fail-toobig": "A werjuunen küd ei tuupfeerd wurd, auer muar üs {{PLURAL:$1|ian werjuun|$1 werjuunen}} fersköwen {{PLURAL:$1|wurd skul|wurd skul}}.",
        "mergehistory-no-source": "Det iarst sidj \"$1\" as ai diar.",
        "recentchangeslinked-summary": "Detdiar spezial-sidj wiset a leetst feranrangen faan ferwiset sidjen (of faan sidjen uun en was kategorii). Sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, san '''fäät''' skrewen.",
        "recentchangeslinked-page": "Sidjennööm:",
        "recentchangeslinked-to": "Wise feranrangen üüb sidjen, diar heerhen ferwise.",
+       "recentchanges-page-added-to-category": "[[:$1]] tu kategorii saat",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] an {{PLURAL:$2|ian sidj muar|$2 muar sidjen}} tu kategorii saat",
+       "recentchanges-page-removed-from-category": "[[:$1]] faan't kategorii wechnimen",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] an {{PLURAL:$2|ian sidj muar|$2 muar sidjen}} faan det kategorii wechnimen",
        "upload": "Datei huuchschüür",
        "uploadbtn": "Datei huuchschüür",
        "reuploaddesc": "Ufbreeg an turag tu't sidj för't huuchschüüren",
        "upload-http-error": "Diar as en HTTP-feeler mä: $1",
        "upload-copy-upload-invalid-domain": "Kopiin faan datein kön faan detdiar domeen ei huuchschüürd wurd.",
        "upload-dialog-title": "Datei huuchschüür",
-       "upload-dialog-error": "Diar as wat skiaf gingen",
-       "upload-dialog-warning": "Diar as en wäärnang kimen",
        "upload-dialog-button-cancel": "Ufbreeg",
        "upload-dialog-button-done": "Klaar",
        "upload-dialog-button-save": "Seekre",
        "upload-dialog-button-upload": "Huuchschüür",
-       "upload-dialog-label-select-file": "Datei ütjschük",
-       "upload-dialog-label-infoform-title": "Enkelthaiden",
-       "upload-dialog-label-infoform-name": "Nööm",
-       "upload-dialog-label-infoform-description": "Beskriiwang",
-       "upload-dialog-label-usage-title": "Brük",
-       "upload-dialog-label-usage-filename": "Dateinööm",
+       "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",
+       "upload-form-label-infoform-description": "Beskriiwang",
+       "upload-form-label-usage-title": "Brük",
+       "upload-form-label-usage-filename": "Dateinööm",
        "backend-fail-stream": "Det datei $1 küd ei auerdraanj wurd.",
        "backend-fail-backup": "Det datei $1 küd ei seekert wurd.",
        "backend-fail-notexists": "Det datei $1 jaft at ei.",
        "filerevert-legend": "Datei turagsaat",
        "filerevert-intro": "Dü saatst det datei '''[[Media:$1|$1]]''' üüb det [$4 werjuun faan $2, klook $3] turag.",
        "filerevert-comment": "Grünj:",
-       "filerevert-defaultcomment": "Turagsaat üüb det werjuun faan $1, klook $2",
+       "filerevert-defaultcomment": "Turagsaat üüb det werjuun faan $1, klook $2 ($3)",
        "filerevert-submit": "Turagsaat",
        "filerevert-success": "'''[[Media:$1|$1]]''' as üüb det [$4 werjuun faan $3, klook $2] turagsaat wurden.",
        "filerevert-badversion": "Diar as nään werjuun faan detdiar datei tu didiar tidjponkt.",
        "movepagetext": "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.\nDi ual tiitel woort üüb di nei widjerfeerd.\nDü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjerfeer läät.\nWan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.\nBluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.\n\nDet sidj woort '''ei''' fersköwen, wan't al en sidj mä di nei nööm jaft. Det loket bluas do, wan di nei nööm salew en widjerfeerang as. Det ment, dat dü det amnäämen turagsaat könst, wan dü niks ferkiard maaget heest. Dü könst oober nian sidj, diar't al jaft, auerskriiw.\n\n'''Paase üüb!'''\nDet fersküüwen hää widjloftag fulgen för ööder sidjen. Dü skulst begreben haa, wat dü diar maage wel.",
        "movepagetext-noredirectfixer": "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.\nDi ual tiitel woort üüb di nei widjerfeerd.\nDü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjer feer läät.\nWan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.\nBluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.\n\nDet sidj woort '''ei''' fersköwen, wan't al en sidj mä di nei nööm jaft. Det loket bluas do, wan di nei nööm salew en widjerfeerang as. Det ment, dat dü det amnäämen turagsaat könst, wan dü niks ferkiard maaget heest. Dü könst oober nian sidj, diar't al jaft, auerskriiw.\n\n'''Paase üüb!'''\nDet fersküüwen hää widjloftag fulgen för ööder sidjen. Dü skulst begreben haa, wat dü diar maage wel.",
        "movepagetalktext": "Uk det diskuschuunsidj woort fersköwen, wan det diar as, <strong>oober ei, wan:</strong>\n*Diar al en diskuschuunsidj mä didiar nööm as, of\n*Dü detdiar mögelkhaid ütjslotst.\n\nUun didiar faal skel dü a diskuschuunsidjen faan hun tuupfeer.",
-       "movearticle": "Sidj fersküüw:",
        "moveuserpage-warning": "'''Paase üüb:''' Dü wel en brükersidj fersküüw. Seenk diaram, dat bluas det brükersidj amnäämd woort, oober '''ei''' di brüker. Hi behäält san ual nööm.",
        "movecategorypage-warning": "<strong>Paase üüb:</strong> Dü wel jüst en kategoriisidj fersküüw. Seenk diaram, dat bluas det sidj fersköwen woort. A sidjen uun det kategorii wurd <em>ei</em> nei kategorisiaret.",
        "movenologintext": "Dü skel registriaret an [[Special:UserLogin|uunmeldet]] wees, am en sidj tu fersküüwen.",
        "api-error-badaccess-groups": "Dü mutst nian datein tu detdiar Wiki huuchschüür.",
        "api-error-badtoken": "Intern feeler: Token as ferkiard.",
        "api-error-copyuploaddisabled": "Det huuchschüüren auer URL as üüb didiar server ei aktiif.",
-       "api-error-duplicate": "Uun det Wiki {{PLURAL:$1|as al [$2 en ööder datei]|san al [$2 muar datein]}} mä detsalew banen.",
-       "api-error-duplicate-archive": "Diar wiar al {{PLURAL:$1|[$2 ööder datei]|[$2 ööder datein]}} mä detsalew banen. {{PLURAL:$1|Hat as |Jo san}} oober stregen wurden.",
-       "api-error-duplicate-archive-popup-title": "Dobelt {{PLURAL:$1|datei, diar al stregen wurden as|datein, diar al stregen wurden san}}.",
-       "api-error-duplicate-popup-title": "Dobelt {{PLURAL:$1|datei|datein}}",
+       "api-error-duplicate": "Uun det Wiki {{PLURAL:$1|as al en ööder datei|san al muar datein}} mä detsalew banen.",
+       "api-error-duplicate-archive": "Diar wiar al {{PLURAL:$1|ööder datei|ööder datein}} mä detsalew banen. {{PLURAL:$1|Hat as |Jo san}} oober stregen wurden.",
        "api-error-empty-file": "Det datei, wat dü huuchschüürd heest, as leesag.",
        "api-error-emptypage": "Dü mutst nian leesag sidjen nei iinstel.",
        "api-error-fetchfileerror": "Intern feeler: Bi't ufrepen faan det datei as wat skiaf gingen.",
index cbe879b..7ab528c 100644 (file)
        "mergehistory-go": "Besjen bewurkings dy't kombinearre wurde kinne",
        "mergehistory-submit": "Kombinearje ferzjes",
        "mergehistory-empty": "Gjin ferzjes kinne kombinearren wurde.",
-       "mergehistory-success": "Kombinearjen slagge fan $3 {{PLURAL:$3|ferzje|ferzjes}} fan [[:$1]] no [[:$2]].",
+       "mergehistory-done": "Kombinearjen slagge fan $3 {{PLURAL:$3|ferzje|ferzjes}} fan $1 no [[:$2]].",
        "mergehistory-fail": "It is net mooglik de skiednis te kombinearje; kontrolearje nochris de side en tiidparameters.",
        "mergehistory-no-source": "Boarneside $1 bestiet net.",
        "mergehistory-no-destination": "Doelside $1 bestiet net.",
        "filerevert-legend": "Triem weromsette",
        "filerevert-intro": "Jo binne '''[[Media:$1|$1]]''' oan it weromdraaien ta de [$4 ferzje op $2, $3].",
        "filerevert-comment": "Reden:",
-       "filerevert-defaultcomment": "Weromdraaid ta de ferzje op $1, $2",
+       "filerevert-defaultcomment": "Weromdraaid ta de ferzje op $1, $2 ($3)",
        "filerevert-submit": "werom sette",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> is weromdraaid ta de [$4 ferzje op $2, $3].",
        "filerevert-badversion": "Der is gjin foarige lokale ferzje fan dizze triem fan 'e opjûne tiid.",
        "move-page-legend": "Side omneame",
        "movepagetext": "Dit werneamt in side, mei alle sideskiednis.\nDe âlde titel wurdt in trochferwizing nei de nije.\nKeppelings mei de âlde side wurde net feroare;\ngean sels nei of't der dûbele of misse ferwizings binne.\nIt hinget fan jo ôf of't de siden noch keppelen binne sa't it mient wie.\n\nDe side wurdt '''net''' werneamt as der al in side mei dy namme is, útsein as it in side\nsûnder skiednis is en de side leech is of in trochferwizing is. Sa kinne jo in side\ndaalks weromneame as jo in flater meitsje, mar jo kinne in oare side net oerskriuwe.",
        "movepagetalktext": "As der in oerlisside by heart, dan bliuwt dy oan de side keppele, '''útsein''':\n*De nije sidenamme yn in oare nammeromte is,\n*Der keppele oan de nije namme al in net-lege oerlisside is, of\n*Jo dêr net foar kieze.\n\nIn dizze gefallen is it oan jo hoe't jo de oerlisside omneame of ynfoegje wolle.",
-       "movearticle": "Side omneame",
        "movenologintext": "Jo moatte [[Special:UserLogin|oanmeld]] wêze om in side wer te neamen.",
        "newtitle": "As nij titel",
        "move-watch": "Folch dizze side",
index eeecb07..05d0420 100644 (file)
@@ -18,7 +18,8 @@
                        "לערי ריינהארט",
                        "පසිඳු කාවින්ද",
                        "아라",
-                       "SeoMac"
+                       "SeoMac",
+                       "Macofe"
                ]
        },
        "tog-underline": "Folínte faoi naisc:",
        "filerevert": "Fill $1 ar ais",
        "filerevert-legend": "Fill comhad ar ais",
        "filerevert-comment": "Nóta tráchta:",
-       "filerevert-defaultcomment": "Filleadh ar ais go leagan ó $2, $1",
+       "filerevert-defaultcomment": "Filleadh ar ais go leagan ó $2, $1 ($3)",
        "filerevert-submit": "Athúsáid",
        "filerevert-success": "Filleadh '''[[Media:$1|$1]]''' go leagan [$4 ó $3, $2].",
        "filedelete": "Scrios $1",
        "move-page-legend": "Athainmnigh an leathanach",
        "movepagetext": "Úsáid an fhoirm seo thíos chun leathanach a athainmniú. Aistreofar a chuid staire go léir chuig an teideal nua.\nDéanfar leathanach atreoraithe den sean-teideal chuig an teideal nua.\nIs féidir atreoruithe don bhunteideal a nuashonrú go huathoibríoch.\nMura ndéanfaidh tú sin, bí cinnte go ndéanfaidh tú cuardach ar atreoruithe [[Special:DoubleRedirects|dúbailte]] nó [[Special:BrokenRedirects|briste]].\nTá dualgas ort bheith cinnte go rachaidh na naisc chuig an áit is ceart.\n\nTabhair faoi deara '''nach''' n-athainmneofar an leathanach má tá leathanach ann cheana féin faoin teideal nua, ach amháin más folamh nó atreorú é nó mura bhfuil aon stair athraithe aige cheana.\nMar sin, is féidir leathanach a athainmniú ar ais chuig an teideal a raibh air roimhe má tá botún déanta agat, agus ní féidir leathanach atá ann cheana a fhorscríobh.\n\n'''Rabhadh!'''\nIs féidir gur dianbheart gan choinne é athrú a dhéanamh ar leathanach móréilimh;\ncinntigh go dtuigeann tú na hiarmhairtí go léir roimh dul ar aghaigh.",
        "movepagetalktext": "Aistreofar an leathanach plé go huathoibríoch '''ach ní tharlófar sin''':\n* má tá leathanach plé neamhfholamh ann cheana leis an teideal nua, nó\n* má bhaineann tú an tic den bhosca thíos.\n\nSna cásanna sin, caithfidh tú an leathanach a aistrigh nó a chumasc tú féin más maith leat.",
-       "movearticle": "Athainmnigh an leathanach",
        "movenologintext": "Ní mór duit bheith i d'úsáideoir cláraithe agus [[Special:UserLogin|logáilte isteach]] chun leathanach a hathainmniú.",
        "movenotallowed": "Níl cead agat leathanaigh a athainmniú.",
        "newtitle": "Go teideal nua",
index c9cb743..cf5f542 100644 (file)
@@ -9,7 +9,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "GunChleoc",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Fo-loidhneadh nan ceanglaichean:",
        "mergehistory-go": "Seall na deasachaidhean a ghabhas a cho-aonadh",
        "mergehistory-submit": "Co-aonaich na mùthaidhean",
        "mergehistory-empty": "Chan eil mùthadh sam bith ann a ghabhas a cho-aonadh.",
-       "mergehistory-success": "Chaidh $3 {{PLURAL:$3|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air [[:$1]] a cho-aonadh dha [[:$2]].",
+       "mergehistory-done": "Chaidh $3 {{PLURAL:$3|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air $1 a cho-aonadh dha [[:$2]].",
        "mergehistory-fail": "Cha ghabh an eachdraidh a cho-aonadh, thoir sùil air paramadairean na duilleige 's an ama.",
        "mergehistory-fail-toobig": "Cha b' urrainn dhuinn an eachdraidh a cho-aonachadh on a bhiodh barrachd na tha ceadaichte de $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} a ghluasad.",
        "mergehistory-no-source": "Chan eil an tùs-duilleag $1 ann.",
        "filerevert-legend": "Till am faidhle",
        "filerevert-intro": "Tha thu an impis am faidhle <strong>[[Media:$1|$1]]</strong> a thilleadh dhan [$4 tionndadh on $2 $3].",
        "filerevert-comment": "Adhbhar:",
-       "filerevert-defaultcomment": "Air a thilleadh gun tionndadh on $1 $2",
+       "filerevert-defaultcomment": "Air a thilleadh gun tionndadh on $1 $2 ($3)",
        "filerevert-submit": "Till",
        "filerevert-success": "Chaidh <strong>[[Media:$1|$1]]</strong> a thilleadh gun [$4 tionndadh on $2 $3].",
        "filerevert-badversion": "Chan eil tionndadh ionadail an fhaidhle ann air a bheil an stampa-tìde a chaidh a thoirt seachad.",
        "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
        "movepagetext-noredirectfixer": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-stiùireadh dhan tiotal ùr an uairsin.\nDearbhaich nach bi ath-sheòlaidhean [[Special:DoubleRedirects|dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinnteach gu bheil na ceanglaichean a' dol dha na h-àitichean a bu chòir.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gur urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
        "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois <strong>ach:</strong>\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aonachadh a làimh, ma tha sin fa-near dhut.",
-       "movearticle": "Gluais duilleag:",
        "moveuserpage-warning": "<strong>Rabhadh:</strong> Tha thu airson duilleag cleachdaiche a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> ainm ùr a thoirt air a' chleachdaiche.",
        "movecategorypage-warning": "<strong>Rabhadh:</strong> Tha thu airson duilleag roinn-seòrsa a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> gach duilleag a tha san t-seann roinn-seòrsa a chur ris an roinn-seòrsa ùr.",
        "movenologintext": "Feumaidh tu a bhith 'nad bhall clàraichte 's air [[Special:UserLogin|logadh a-steach]] mus gluais thu duilleag.",
        "api-error-badaccess-groups": "Chan eil cead agad gus faidhlichean a luchdadh suas dhan uicidh seo.",
        "api-error-badtoken": "Mearachd taobh a-staigh: Droch thòcan.",
        "api-error-copyuploaddisabled": "Tha luchdadh suas le URL à comas air an fhrithealaiche seo.",
-       "api-error-duplicate": "Tha {{PLURAL:$1|[$2 faidhle eile]|are [$2 faidhlichean eile]}} air an làrach seo mar-thà sa bheil an aon susbaint.",
-       "api-error-duplicate-archive": "Tha {{PLURAL:$1|[$2 faidhle eile]|are [$2 faidhlichean eile]}} air an làrach seo mar-thà sa bheil an aon susbaint ach chaidh {{PLURAL:$1|a sguabadh|an sguabadh}} às.",
-       "api-error-duplicate-archive-popup-title": "Bha {{PLURAL:$1|am faidhle|na faidhlichean}} dùblaichte air {{PLURAL:$1|a|an}} sguabadh às mar-thà.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Faidhle|Faidhlichean}} dùblaichte.",
+       "api-error-duplicate": "Tha {{PLURAL:$1|faidhle eile|are faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint.",
+       "api-error-duplicate-archive": "Tha {{PLURAL:$1|faidhle eile|faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint ach chaidh {{PLURAL:$1|a sguabadh|an sguabadh}} às.",
        "api-error-empty-file": "Tha am faidhle a chuir thu a-null falamh.",
        "api-error-emptypage": "Chan fhaodar duilleagan falamh ùra a chruthachadh.",
        "api-error-fetchfileerror": "Mearachd taobh a-staigh: Chaidh rudeigin cearr le faighinn an fhaidhle.",
index 736f351..83e65f8 100644 (file)
        "nstab-template": "Modelo",
        "nstab-help": "Páxina de axuda",
        "nstab-category": "Categoría",
+       "mainpage-nstab": "Páxina principal",
        "nosuchaction": "Non existe esa acción",
        "nosuchactiontext": "A acción especificada polo enderezo URL é inválida.\nPode que non o escribise ben ou que seguise unha ligazón incorrecta.\nIsto tamén podería indicar un erro en {{SITENAME}}.",
        "nosuchspecialpage": "Non existe esa páxina especial",
        "changeemail-password": "O seu contrasinal en {{SITENAME}}:",
        "changeemail-submit": "Cambiar o correo electrónico",
        "changeemail-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
+       "changeemail-nochange": "Por favor, indique unha nova dirección de correo diferente.",
        "resettokens": "Restablecer os pases",
        "resettokens-text": "Aquí pode restablecer os pases que permiten acceder a certos datos privados asociados á súa conta.\n\nDebería facelo se os compartiu accidentalmente con alguén ou se a súa conta foi comprometida.",
        "resettokens-no-tokens": "Non hai ningún pase que restablecer.",
        "mergehistory-go": "Mostrar as edicións que se poden fusionar",
        "mergehistory-submit": "Fusionar as revisións",
        "mergehistory-empty": "Non hai revisións que se poidan fusionar.",
-       "mergehistory-success": "{{PLURAL:$3|Unha revisión|$3 revisións}} de \"[[:$1]]\" {{PLURAL:$3|fusionouse|fusionáronse}} sen problemas con \"[[:$2]]\".",
+       "mergehistory-done": "{{PLURAL:$3|Unha revisión|$3 revisións}} de \"$1\" {{PLURAL:$3|fusionouse|fusionáronse}} sen problemas con \"[[:$2]]\".",
        "mergehistory-fail": "Non se puido fusionar o historial; comprobe outra vez os parámetros de páxina e data.",
        "mergehistory-fail-toobig": "Non se puido fusionar o historial, xa que supón trasladar máis revisións que o límite de $1 {{PLURAL:$1|revisión|revisións}}.",
        "mergehistory-no-source": "Non existe a páxina de orixe \"$1\".",
        "recentchangeslinked-summary": "Esta é unha lista dos cambios que se realizaron recentemente nas páxinas vinculadas a esta (ou nos membros da categoría especificada).\nAs páxinas da súa [[Special:Watchlist|lista de vixilancia]] aparecen en '''negra'''.",
        "recentchangeslinked-page": "Nome da páxina:",
        "recentchangeslinked-to": "Mostrar os cambios relacionados das páxinas que ligan coa dada",
+       "recentchanges-page-added-to-category": "\"[[:$1]]\" engadiuse á categoría",
+       "recentchanges-page-added-to-category-bundled": "\"[[:$1]]\" e {{PLURAL:$2|unha páxina|$2 páxinas}} engadíronse á categoría",
+       "recentchanges-page-removed-from-category": "\"[[:$1]]\" eliminouse da categoría",
+       "recentchanges-page-removed-from-category-bundled": "\"[[:$1]]\" e {{PLURAL:$2|unha páxina|$2 páxinas}} elimináronse da categoría",
        "upload": "Subir un ficheiro",
        "uploadbtn": "Subir un ficheiro",
        "reuploaddesc": "Cancelar a carga e volver ao formulario de carga",
        "upload-http-error": "Produciuse un erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "A copia de cargas non está dispoñible neste dominio.",
        "upload-dialog-title": "Subir un ficheiro",
-       "upload-dialog-error": "Houbo un erro",
-       "upload-dialog-warning": "Produciuse unha advertencia",
        "upload-dialog-button-cancel": "Cancelar",
        "upload-dialog-button-done": "Feito",
        "upload-dialog-button-save": "Gardar",
        "upload-dialog-button-upload": "Subir",
-       "upload-dialog-label-select-file": "Seleccionar un ficheiro",
-       "upload-dialog-label-infoform-title": "Detalles",
-       "upload-dialog-label-infoform-name": "Nome",
-       "upload-dialog-label-infoform-description": "Descrición",
-       "upload-dialog-label-usage-title": "Uso",
-       "upload-dialog-label-usage-filename": "Nome do ficheiro",
+       "upload-process-error": "Houbo un erro",
+       "upload-process-warning": "Produciuse unha advertencia",
+       "upload-form-label-select-file": "Seleccionar un ficheiro",
+       "upload-form-label-infoform-title": "Detalles",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrición",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nome do ficheiro",
        "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.",
        "filerevert-legend": "Reverter o ficheiro",
        "filerevert-intro": "Está a piques de reverter o ficheiro \"'''[[Media:$1|$1]]'''\" ata a [$4 versión do $2 ás $3].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Volveuse á versión do $1 ás $2",
+       "filerevert-defaultcomment": "Volveuse á versión do $1 ás $2 ($3)",
        "filerevert-submit": "Reverter",
        "filerevert-success": "Reverteuse \"'''[[Media:$1|$1]]'''\" á [$4 versión do $2 ás $3].",
        "filerevert-badversion": "Non existe unha versión local anterior deste ficheiro coa data e hora indicadas.",
        "movepagetext": "Ao usar o formulario inferior vai cambiar o nome da páxina, movendo todo o seu historial ao novo nome.\nO título vello vaise converter nunha páxina de redirección ao novo título.\nPode actualizar automaticamente as redireccións que van dar ao título orixinal.\nSe escolle non facelo, asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].\nVostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.\n\nTeña en conta que a páxina '''non''' será trasladada se xa existe unha páxina co novo título, a menos que esta última sexa unha redirección e non teña historial de edicións.\nIsto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.\n\n'''Atención!'''\nEste cambio nunha páxina popular pode ser drástico e inesperado;\npor favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
        "movepagetext-noredirectfixer": "Ao usar o formulario inferior vai cambiar o nome da páxina, movendo todo o seu historial ao novo nome.\nO título vello vaise converter nunha páxina de redirección ao novo título.\nAsegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].\nVostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.\n\nTeña en conta que a páxina '''non''' será trasladada se xa existe unha páxina co novo título, a menos que esta última sexa unha redirección e non teña historial de edicións.\nIsto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.\n\n'''Atención!'''\nEste cambio nunha páxina popular pode ser drástico e inesperado;\npor favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
        "movepagetalktext": "A páxina de conversa asociada, se existe, será automaticamente movida con esta '''agás que''':\n*Estea a mover a páxina empregando espazos de nomes,\n*Xa exista unha páxina de conversa con ese nome, ou\n*Desactive a opción de abaixo.\n\nNestes casos, terá que mover ou mesturar a páxina manualmente se o desexa.",
-       "movearticle": "Mover esta páxina:",
        "moveuserpage-warning": "'''Aviso:''' Está a piques de mover unha páxina de usuario. Por favor, teña en conta que só se trasladará a páxina e que o usuario '''non''' será renomeado.",
        "movecategorypage-warning": "'''Aviso:''' Está a piques de mover unha páxina de categoría. Por favor, teña en conta que só se trasladará a páxina e que as páxinas presentes na categoría vella '''non''' serán recategorizadas na categoría nova.",
        "movenologintext": "Debe ser un usuario rexistrado e [[Special:UserLogin|acceder ao sistema]] para mover unha páxina.",
        "api-error-badaccess-groups": "Non ten os permisos necesarios para cargar ficheiros neste wiki.",
        "api-error-badtoken": "Erro interno: Pase incorrecto.",
        "api-error-copyuploaddisabled": "As cargas mediante URL están desactivadas neste servidor.",
-       "api-error-duplicate": "Xa hai {{PLURAL:$1|[$2 outro ficheiro]|[$2 outros ficheiros]}} no wiki co mesmo contido",
-       "api-error-duplicate-archive": "Había {{PLURAL:$1|[$2 outro ficheiro]|[$2 outros ficheiros]}} no sitio co mesmo contido, pero {{PLURAL:$1|foi borrado|foron borrados}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Ficheiro duplicado|Ficheiros duplicados}} que xa {{PLURAL:$1|foi borrado|foron borrados}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ficheiro duplicado|Ficheiros duplicados}}",
+       "api-error-duplicate": "Xa hai {{PLURAL:$1|outro ficheiro| outros ficheiros}} no wiki co mesmo contido.",
+       "api-error-duplicate-archive": "Había {{PLURAL:$1|outro ficheiro|outros ficheiros}} no sitio co mesmo contido, pero {{PLURAL:$1|foi borrado|foron borrados}}.",
        "api-error-empty-file": "O ficheiro que enviou estaba baleiro.",
        "api-error-emptypage": "Non está permitida a creación de páxinas novas que estean baleiras.",
        "api-error-fetchfileerror": "Erro interno: Houbo un problema ao buscar o ficheiro.",
index 1d82b9b..50a852c 100644 (file)
@@ -15,7 +15,8 @@
                        "Yannos",
                        "ZaDiak",
                        "아라",
-                       "JoostBotman"
+                       "JoostBotman",
+                       "Macofe"
                ]
        },
        "tog-underline": "Ὑπογραμμίζειν συνδέσμους:",
        "mergehistory-go": "Δεικνύναι συγχωνεύσιμους μεταγραφάς",
        "mergehistory-submit": "Συγχωνεύειν ἀναθεωρήσεις",
        "mergehistory-empty": "Οὐδεμία ἀναθεώρησις συγχωνευτέα.",
-       "mergehistory-success": "$3 {{PLURAL:$3|ἀναθεώρησις|ἀναθεωρήσεις}} τῆς [[:$1]] ἐπιτυχῶς {{PLURAL:$3|συνεχωνεύθη|συνεχωνεύθησαν}} τῷ [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ἀναθεώρησις|ἀναθεωρήσεις}} τῆς $1 ἐπιτυχῶς {{PLURAL:$3|συνεχωνεύθη|συνεχωνεύθησαν}} τῷ [[:$2]].",
        "mergehistory-fail": "Ἀδύνατος ἡ συγχώνευσις τῶν ἱστορικῶν· ἔλεγξον πάλιν τὰς παραμέτρους τῆς δέλτου καὶ τοῦ χρόνου.",
        "mergehistory-no-source": "Δέλτος πηγὴ $1 οὐκ ἔστιν.",
        "mergehistory-no-destination": "Δέλτος προορισμὸς $1 οὐκ ἔστιν.",
        "filerevert-legend": "Ἐπαναφέρειν ἀρχεῖον",
        "filerevert-intro": "Ἀναστρέφεις τὴν '''[[Media:$1|$1]]''' εἰς τὴν [$4 ἔκδοσιν μέχρι $3, $2].",
        "filerevert-comment": "Αἰτία:",
-       "filerevert-defaultcomment": "Ἀναστροφὴ κατὰ τὴν ἔκδοσιν μέχρι $2, $1",
+       "filerevert-defaultcomment": "Ἀναστροφὴ κατὰ τὴν ἔκδοσιν μέχρι $2, $1 ($3)",
        "filerevert-submit": "Ἀναστρέφειν",
        "filerevert-success": "'''[[Media:$1|$1]]''' ἀνεστραμμένη ἐστὶ κατὰ τὴν [$4 ἔκδοσιν μέχρι $3, $2].",
        "filerevert-badversion": "Οὐκ ἔστι προτέρα τοπικὴ ἔκδοσις τοῦδε τοῦ ἀρχείου μετὰ τῆς παρεσχημένης χρονικῆς σφραγίδος.",
        "listgrouprights-removegroup-self-all": "Ἀφαιρεῖν ἁπάσας τὰς ὁμάδας ἀπὸ τὸν λογισμὸν ἐμοῦ τοῦ ἰδίου",
        "mailnologin": "Οὐδεμία διεύθυνσις παραλήπτου",
        "emailuser": "Ἠλεκτρονικὴν ἐπιστολὴν τῷδε τῷ χρωμένῳ πέμπειν",
-       "emailpage": "Χρώμενος ἠλ.-ταχυδρομείου",
        "emailpagetext": "Χρώμενος τῷ κάτωθι προτύπῳ, ἀπόστειλον μήνυμά τι, ἐφὄσον δεδήλωκας ἔγκυρον ἠλ-διεύθυνσιν τινὰ εἰς τὰς [[Special:Preferences|προτιμήσεις χρωμένου]]. Ἥδε ἡ διεύθυνσις πεφασμένη ἔσεται ὡς διεύθυνσις ἀποστολέως τοῦ μηνύματος, οὕτως ὥστε ὁ παραλήπτης δύνηται ἀποκριθῆναι.",
        "defemailsubject": "{{SITENAME}} ἠλ.-ταχυδρομεῖον",
        "noemailtitle": "Οὐδεμία ἠλ-διεύθυνσις",
        "move-page-legend": "Κινεῖν τὴν δέλτον",
        "movepagetext": "Χρῆτε τὸν ἀκόλουθον τύπον διὰ τὴν μετωνομασίαν τῆς δέλτου καὶ διὰ τὴν μεταφορὰν ὅλου τοῦ ἑοῦ ἱστορικοῦ ὑπὸ τὸ νέον ὄνομα.\nἩ προηγουμένη ἐπιγραφὴ τῆς δέλτου ἔσται δέλτος τις ἀνακατευθύνσεως. Οἱ τυχόντες σύνδεσμοι πρὸς τὴν προηγουμένην δέλτον ἀναλλοίωτοι ἔσονται.\nΒεβαιοῦσθε περὶ τῆς μὴ ὑπάρξεως [[Special:DoubleRedirects|διπλῶν]] ἢ [[Special:BrokenRedirects|διεφθαρμένων συνδέσμων]].\nἈναλαμβάνετε τὴν εὐθύνην τοῦ ἐπιβεβαιῶσαι τὴν ὀρθὴν καὶ ὑποτιθεμένην κατεύθυνσιν τῶν συνδέσμων.\n\nἘπισημείωμα: ἡ δέλτος '''οὐ''' κινήσεται εἰ ὑπάρχει ἤδη ἑτέρα δέλτος ὑπὸ τὴν νέαν ἐπιγραφήν, εἰ μὴ ἡ δελτος αὕτη κενή ἐστι '''καὶ οὐκ''' ἔχει ἱστορίαν. Δῆλα δή, ἐν περιπτώσει λάθους ὑμῶν, δύνασθε μετωνομάσειν δέλτον τινά, δίδοντες αὐτῇ τὴν προτέραν ὀνομασίαν αὐτῆς, ἀλλὰ οὐ δύνασθε ὑποκαταστήσειν προϋπάρχουσαν δέλτον τινά.\n\n'''ΠΡΟΣΟΧΗ!'''\nἩ μετωνομασία δέλτου τινὸς αἰφνιδία καὶ δραστικὴ ἀλλαγή ἐστιν ὁπηνίκα πρόκειται περὶ δημοφιλοῦς δέλτου· παρακαλοῦμεν ὑμᾶς ἵνα ἐξετάζητε τὰς πιθανὰς ἐπιπτώσεις ταύτης τῆς δράσεως, πρὸ τῆς ἀποφάσεως ὑμῶν.",
        "movepagetalktext": "Ἡ σχετικὴ δέλτος διαλέξεως μετακινήσεται αὐτομάτως μετὰ τῆς δέλτου ἐγγραφῆς '''ἐκτός εἰ οὐ(χ):'''\n*Μετακινήσεις τὴν δέλτον εἰς διάφορον ὀνοματικὸν χῶρον (namespace), ἢ\n*Ὑπάρχει ὑπὸ τὸ νέον ὄνομα μὴ κενὴ δέλτος τις διαλέξεως, ἢ\n*Ἀφῄρηκας τὴν κατασήμανσιν (check) ἐκ τοῦ κυτίου κατωτέρω.\n\nἘν ταύταις ταῖς περιπτώσεσι, δεῖ σε μετακινῆσαι ἢ συγχωνεῦσαι τὴν δέλτον μέσῳ ἀντιγραφῆς-καὶ-ἐπικολλήσεως.",
-       "movearticle": "Κινεῖν τὴν δέλτον:",
        "movenologintext": "Δεῖ σε εἶναι ἐγγεγραμμένος χρώμενός τε καὶ [[Special:UserLogin|συνδεδεμένος]] ἵνα μετακινήσῃς δέλτον τινά.",
        "movenotallowed": "Οὐκ ἔξεστί σοι δέλτους μετακινήσειν.",
        "movenotallowedfile": "Οὐκ ἔξεστί σοι ἀρχεῖα μετακινήσειν.",
index 94c5a0b..fc7ad26 100644 (file)
@@ -19,7 +19,8 @@
                        "Urhixidur",
                        "לערי ריינהארט",
                        "80686",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Links unterstryche:",
        "nstab-template": "Vorlag",
        "nstab-help": "Hilf",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Houptsyte",
        "nosuchaction": "Die Aktion git s nit",
        "nosuchactiontext": "Di Aktion, wu in dr URL aagee isch, isch nit giltig.\nVillicht hesch d URL falsch yygee oder bisch eme falsche Link noogange.\nDes chennt au ne Fähler aazeige in {{SITENAME}}.",
        "nosuchspecialpage": "Die Spezialsyte git s nit",
        "createacct-captcha": "Sicherheitspriefig",
        "createacct-imgcaptcha-ph": "Gib dr Tekscht yy, wu Du obe siisch",
        "createacct-submit": "Dyy Benutzerkonto aalege",
-       "createacct-another-submit": "En ander Benutzerkonto aalege",
+       "createacct-another-submit": "Benutzerkonto aalege",
        "createacct-benefit-heading": "{{SITENAME}} wird vu Mänsche wie Dir gschaffe.",
        "createacct-benefit-body1": "{{PLURAL:$1|Bearbeitig|Bearbeitige}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Syte|Syte}}",
        "passwordreset-emailsent": "E Passwort-Zrucksetzig isch per E-Mail verschickt wore.",
        "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äss ändre",
-       "changeemail-text": "Füll des Formular ganz uss, zume dyni E-Mail-Adräss ändre. Du muesch dyn Passwort aagee, zum die Änderig z bstätige.",
+       "changeemail": "E-Mail-Adrässen änderen oder lösche",
+       "changeemail-text": "Füll das Formular uus, für dyni E-Mail-Adrässe z ändere. Du muesch dys Passwort agä, für d Änderig z bestätige. We du möchtisch, das dys Benutzerkonto nümm mit dyren E-Mail-Adrässe verbunden isch, de chasch ds Fäld für’ne nöüi E-Mail-Adrässe läär la und uf «E-Mail-Adrässen änderen oder lösche» klicke.",
        "changeemail-no-info": "Du muesch aagmolde sy zum uff die Syte diräkt zuegryfe z chönne.",
        "changeemail-oldemail": "Aktuelli E-Mail-Adräss",
        "changeemail-newemail": "Nöii E-Mail-Adräss:",
+       "changeemail-newemail-help": "La das Fäld läär, we du dyni E-Mail-Adrässe wosch usenäh. We d E-Mail-Adrässen usegnoh isch, de chasch du es vergässnigs Passwort nümm la zrüggsetzen und überchunsch kener E-Mail meh us däm Wiki.",
        "changeemail-none": "(nyt)",
        "changeemail-password": "Dy {{SITENAME}}-Passwort:",
        "changeemail-submit": "E-Mail Adräss ändre",
        "changeemail-throttled": "Du hesch z vilmol versuecht Di aazmälde. Bitte wart $1, voreb Du s non emol versuechsch.",
+       "changeemail-nochange": "Bitte gib en anderi nöüi E-Mail-Adrässen y.",
        "resettokens": "Token zrucksetze",
        "resettokens-text": "Du chasch Token zrucksetze, wu Dir dr Zuegriff uf bstimmti privati Date megli mache, wu mit Dym Benutzerkonto do verchnipft sin.\n\nDes sottsch nume mache, wänn Du d Token us Versää mit eberem teilt hesch oder Dy Konto gfehrdet isch.",
        "resettokens-no-tokens": "S git kei Token zum Zrucksetze.",
        "permissionserrorstext-withaction": "Du bisch nit berächtigt, $2.\n{{PLURAL:$1|Grund|Grind}}:",
        "recreate-moveddeleted-warn": "'''Obacht: Du bisch e Syten am aalege, wo scho emol glescht woren isch.'''\n\nBitte iberprief, eb s sinnvoll isch, mit em Bearbeite wyter z mache.\nZue Dyyre Information sihsch do s Lesch-Logbuech vo däre Syte:",
        "moveddeleted-notice": "Die Syte isch glescht wore. Do chunnt e Uuszuug us em Lesch-Logbuech fir die Syte.",
-       "log-fulllog": "Voll Logbuech aaluege",
+       "moveddeleted-notice-recent": "Die Syten isch leider ersch grad glöscht worde (i de letste 24 Stund). Zur Information stöh unde ds Lösch- und ds Verschiebigs-Logbuech.",
+       "log-fulllog": "Ds ganze Logbuech aaluege",
        "edit-hook-aborted": "D Bearbeitig isch ohni Erchlärung dur e Schnittstell abbroche wore.",
        "edit-gone-missing": "D Syte het nid chenne aktalisiert wäre.\nSi isch schyns glescht wore.",
        "edit-conflict": "Bearbeitigskonflikt.",
        "mergehistory-go": "Zeig d Versione, wu zämegfierd chenne wäre",
        "mergehistory-submit": "Fier Versione zäme",
        "mergehistory-empty": "S chenne kei Versione zämegfierd wäre.",
-       "mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versione}} vu „[[:$1]]“ isch no „[[:$2]]“ zämegfierd.",
+       "mergehistory-done": "{{PLURAL:$3|1 Version|$3 Versione}} vu „$1“ isch no „[[:$2]]“ zämegfierd.",
        "mergehistory-fail": "Zämefierig vu dr Versione nid megli, bitte prief d Syte un d Zytaagobe.",
        "mergehistory-fail-toobig": "D Versionsgschichte lö sech nid la zämefüere, wil me meh weder ds Limit {{PLURAL:$1|eire Version|$1 Versione}} müesst verschiebe.",
        "mergehistory-no-source": "Ursprungssyte „$1“ isch nit vorhande.",
        "prefs-watchlist-token": "Beobachtigslischte-Chännzeiche:",
        "prefs-misc": "Verschidnigs",
        "prefs-resetpass": "Passwort ändere",
-       "prefs-changeemail": "E-Mail Adräss ändre",
+       "prefs-changeemail": "E-Mail-Adrässen änderen oder lösche",
        "prefs-setemail": "E-Mail-Adräss festlaie",
        "prefs-email": "E-Mail-Optione",
        "prefs-rendering": "Sytedarstellig",
        "group-bot": "Bötli",
        "group-sysop": "Ammanne",
        "group-bureaucrat": "Bürokrate",
-       "group-suppress": "Oversighter",
+       "group-suppress": "Underdrücker",
        "group-all": "(alli)",
        "group-user-member": "{{GENDER:$1|Benutzer|Benutzeri}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Automatisch bstätigter Benutzer|Automatisch bstätigti Benutzeri}}",
        "group-bot-member": "{{GENDER:$1|Bötli}}",
        "group-sysop-member": "{{GENDER:$1|Ammann|Amtsfrou}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokrat|Bürokrati}}",
-       "group-suppress-member": "{{GENDER:$1|Oversighter|Oversighterin}}",
+       "group-suppress-member": "{{GENDER:$1|Underdrücker|Underdrückerin}}",
        "grouppage-user": "{{ns:project}}:Benutzer",
        "grouppage-autoconfirmed": "{{ns:project}}:Bstetigti Benutzer",
        "grouppage-bot": "{{ns:project}}:Bötli",
        "grouppage-sysop": "{{ns:project}}:Ammanne",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokrate",
-       "grouppage-suppress": "{{ns:project}}:Oversighter",
+       "grouppage-suppress": "{{ns:project}}:Underdrücke",
        "right-read": "Syte läse",
        "right-edit": "Syte bearbeite",
        "right-createpage": "Syten aalege (usser Diskussionssyte)",
        "recentchangeslinked-summary": "Die Spezialsyte zeigt d Änderige vo allne Syte, wo ei vo dir bestimmti Syte druf verlinkt, bzw. vo allne Syte, wo zu eire vo dir bestimmte Kategorie ghöre.\nSytene, wo zu dyre [[Special:Watchlist|Beobachtigslischte]] ghöre, erschyne '''fett'''.",
        "recentchangeslinked-page": "Syte:",
        "recentchangeslinked-to": "Zeig Änderige uf Syte, wu uff die Syte verwyyse",
+       "recentchanges-page-added-to-category": "[[:$1]] zur Kategorie derzue ta",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] und {{PLURAL:$2|ei|$2}} anderi Syte zur Kategorie derzue ta",
+       "recentchanges-page-removed-from-category": "[[:$1]] vor Kategorie furtgnoh",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] und {{PLURAL:$2|ei|$2}} anderi Syte vor Kategorie furtgnoh",
+       "autochange-username": "Automatischi MediaWiki-Änderig",
        "upload": "Datei uffelade",
        "uploadbtn": "Bild lokal ufelade",
        "reuploaddesc": "Abbrächen un zrugg zue dr Syte \"Uffelade\"",
        "upload-http-error": "E HTTP-Fähler isch ufträtte: $1",
        "upload-copy-upload-invalid-domain": "As Kopi uffeladbari Dateie sin iber die Domain nit verfiegbar.",
        "upload-dialog-title": "Datei ufelade",
-       "upload-dialog-error": "Es het e Fähler ’gä",
-       "upload-dialog-warning": "Es het e Warnig ’gä",
        "upload-dialog-button-cancel": "Abbräche",
        "upload-dialog-button-done": "Fertig",
        "upload-dialog-button-save": "Spychere",
        "upload-dialog-button-upload": "Ufelade",
-       "upload-dialog-label-select-file": "Datei ussueche",
-       "upload-dialog-label-infoform-title": "Details",
-       "upload-dialog-label-infoform-name": "Name",
-       "upload-dialog-label-infoform-description": "Beschrybig",
-       "upload-dialog-label-usage-title": "Verwändig",
-       "upload-dialog-label-usage-filename": "Dateiname",
+       "upload-process-error": "Es het e Fähler ’gä",
+       "upload-process-warning": "Es het e Warnig ’gä",
+       "upload-form-label-select-file": "Datei ussueche",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Name",
+       "upload-form-label-infoform-description": "Beschrybig",
+       "upload-form-label-usage-title": "Verwändig",
+       "upload-form-label-usage-filename": "Dateiname",
+       "foreign-structured-upload-form-label-own-work": "Das han i sälber gmacht.",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorië",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-default": "I bi mer bewusst, das i die Datei in es gmeinsams Repository ufelade. I bestätige, das mi derby a d Nutzigs- und Lizänzbedingige dört halte.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Bitte schliess dä Dialog und versuech’s mit eren andere Methode, falls du die Datei nid under de Bedingige vom gmeinsame Repository chasch ufelade.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Du chasch es ou mit der [[Special:Upload|Syte zum Ufeladen uf {{SITENAME}}]] probiere, falls du die Datei dört under denen irne Bedingige chasch ufelade.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "I bestätige, das ds Copyright vo dere Datei mir ghört. I stimmen unwiderruefflech zue, das die Datei uf Wikimedia Commons under der Lizänz [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] veröffentlecht wird. I bi mit de [https://wikimediafoundation.org/wiki/Terms_of_Use/de Nutzigsbedingigen] yverstande.",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Falls ds Copyright vo dere Datei nid dir ghört oder falls du sen under eren andere Lizänz wosch veröffentleche, de chönntsch der [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] bruuche.",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Du chasch es ou mit der [[Special:Upload|Syte zum Ufeladen uf {{SITENAME}}]] probiere, falls dä Website ds Ufelade vo der Datei under syne Bedingige zuelat.",
        "backend-fail-stream": "D Datei $1 het nit chenne ibertrait wäre.",
        "backend-fail-backup": "D Datei $1 het nit chenne gsicheret wäre.",
        "backend-fail-notexists": "D Datei $1 git s nit.",
        "filerevert-legend": "Datei zrucksetze",
        "filerevert-intro": "Du setzesch d Datei '''[[Media:$1|$1]]''' uf d [$4 Version vum $2, $3 Uhr] zruck.",
        "filerevert-comment": "Grund:",
-       "filerevert-defaultcomment": "Zruckgsetzt uf d Version vum $1, $2 Uhr",
+       "filerevert-defaultcomment": "Zruckgsetzt uf d Version vum $1, $2 Uhr ($3)",
        "filerevert-submit": "Zrucksetze",
        "filerevert-success": "'''[[Media:$1|$1]]''' isch uf d [$4 Version vum $2, $3 Uhr] zruckgsetzt wore.",
        "filerevert-badversion": "S git kei Version vu dr Datei zum Zytpunkt, wu aagee woren isch.",
        "nopagetext": "D Ziilsyte, wu aagee isch, isch nit vorhande.",
        "pager-newer-n": "{{PLURAL:$1|nächschte|nächschte $1}}",
        "pager-older-n": "{{PLURAL:$1|vorige|vorige $1}}",
-       "suppress": "Oversight",
+       "suppress": "Underdrücke",
        "querypage-disabled": "Die Spezialsyte isch deaktiviert wore us Leischtigserhaltigs-Grind.",
        "apihelp": "API-Hilff",
        "apihelp-no-such-module": "Ds Modul «$1» lat sech nid la finde.",
        "emailccsubject": "Kopii vu Dyynere Nochricht an $1: $2",
        "emailsent": "E-Mail furtgschickt",
        "emailsenttext": "Dys E-Mail isch verschickt worde.",
-       "emailuserfooter": "$1 het das E-mail a $2 gschickt über d Funktion «{{int:emailuser}}» uf {{SITENAME}}.",
+       "emailuserfooter": "{{GENDER:$1|Der $1|D $1|$1}} het das E-mail {{GENDER:$2|em|der|a}} $2 gschickt über d Funktion «{{int:emailuser}}» uf {{SITENAME}}.",
        "usermessage-summary": "Systemnochricht gspycheret.",
        "usermessage-editor": "System-Messenger",
        "watchlist": "Beobachtigslischte",
        "deletepage": "Syte lösche",
        "confirm": "Bstätige",
        "excontent": "Alter Inhalt: '$1'",
-       "excontentauthor": "einzige Inhalt: '$1' (bearbeitet worde nume dür '$2')",
+       "excontentauthor": "einzigen Inhalt: «$1», bearbeitet nume dür «[[Special:Contributions/$2|$2]]» ([[User talk:$2|Diskussion]])",
        "exbeforeblank": "Inhalt voreb d Syte gläärt woren isch: '$1'",
        "delete-confirm": "„$1“ lesche",
        "delete-legend": "Lesche",
        "move-page-legend": "Artikel verschiebe",
        "movepagetext": "Mit däm Formular chasch e Syte umnänne, indäm Du si mitsamt allne Versionen uf e neje Titel verschiebsch.\nDr alt Titel wird derno zum eje wyterleite.\nDu chasch Wyterleitige, wu uf dr Originaltitel verwyse, automatisch korrigiere loo.\nStell sicher, dass Du im Aaschluss alli [[Special:DoubleRedirects|dopplete]] oder [[Special:BrokenRedirects|defekte Wyterleitige]] iberpriefsch.\nDu bisch derfir verantwortlig, ass Link wyter uf s korräkt Ziil verwyse.\n\nD Syte wird '''nit''' verschobe, wänn s scho ne Syte mit em vorgsähne Titel git, usser s isch e Wyterleitig ohni Versionsgschicht.\nDes heißt, ass Du d Umnännig chasch ruckgängig mache, wänn e Fähler gmacht hesch. Du chasch dergege kei Syte, wu s scho git, iberschrybe.\n\n'''Warnig!'''\nD Verschiebig cha wyteri un nit erwarteti Folge fir vylmol bsuechti Syte haa.\nDu sottsch wäge däm d Konsequänze verstande haa, vorbe jetz wyter machsch.",
        "movepagetext-noredirectfixer": "Mit däm Formular unte chasch e Syte umnänne, indäm Du si mitsamt allene Versione uf e neje Titel verschiebsch.\nDr alt Titel leitet derno zum neje wyter.\nStell sicher, ass Du im Aaschluss alli [[Special:DoubleRedirects|dopplete]] oder [[Special:BrokenRedirects|kaputtige Wyterleitige]] iberpriefsch.\nDu bisch derfir verantwortli, ass Link wyter uf s korräkt Ziil verwyyse.\n\nD Syte wird '''nit''' verschobe, wänn s scho ne Syte git mit em vorgsähne Titel, ußer sälli isch läär oder e Wyterletig ohni ne Versionsgschicht.\nDes bedytet, ass Du d Umnännig chasch ruckgängig mache, wänn Du ne Fähler gmacht hesch. Du chasch aber kei Syte iberschryybe.\n\n'''Warnig!'''\nD Verschiebig cha großi un nit erwarteti Folge haa fir hyfig bsuechti Syte.\nDu sottsch wäge däm d Konsequänze verstande haa, voreb Du jetz wytermachsch.",
-       "movepagetalktext": "D Diskussionssyte wird mitverschobe, '''ussert:'''\n*Du verschiebsch d Syten i nen andere Namensruum, oder\n*es git scho ne Diskussionssyte mit däm Namen oder\n*du wählsch unte d Option, se nid z verschiebe.\n\nI söttigne Fäll müessti d Diskussionssyten allefalls vo Hand kopiert wärde.",
-       "movearticle": "Artikel verschiebe",
+       "movepagetalktext": "We du das Chästli achrüzlisch, de wird di zueghörigi Diskussionssyten automatisch zum nöüe Titel verschobe, ussert es git dört scho’ne Diskussionssyte, wo nid läär isch.\n\nI däm Fäll muesch du d Syte vo Hand verschieben oder zämefüere, we du das wosch.",
        "moveuserpage-warning": "'''Warnig:''' Du bis am Verschiebe vun ere Benutzersyte. Bitte gib Achtig, ass doderdur nume die Syte verschobe wird, aber dr Benutzer '''nit''' umgnännt wird.",
        "movecategorypage-warning": "<strong>Obacht:</strong> Du bisch e Kategoriesyten am Verschiebe. Bitte dänk dra, das nume die Syte verschobe wird. D Syte, wo zur alte Kategorie ghöre, wärde <strong>nid</strong> i di nöüi Kategorie verschobe.",
        "movenologintext": "Du muesch e regischtrierte Benutzer syy un Di [[Special:UserLogin|aamälde]] go die Syte verschiebe.",
        "cant-move-to-user-page": "Du derfsch kei Syte uf e Benutzersyte verschiebe (mit Usnaam vo Untersyte).",
        "cant-move-category-page": "Du hesch nid ds Rächt, Kategoriesyte z verschiebe.",
        "cant-move-to-category-page": "Du hesch nid ds Rächt, e Syte zunere Kategoriesyte z verschiebe.",
-       "newtitle": "Zum nöie Titel",
+       "newtitle": "Nöüe Titel:",
        "move-watch": "Die Syte beobachte",
        "movepagebtn": "Artikel verschiebe",
        "pagemovedsub": "Verschiebig erfolgrych",
        "revdelete-uname-unhid": "Benutzername freigee",
        "revdelete-restricted": "Yyschränkige gälte au fir Ammanne",
        "revdelete-unrestricted": "Yyschränkige fir Ammanne ufghobe",
-       "logentry-block-block": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6",
+       "logentry-block-block": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} für $5 gsperrt $6",
        "logentry-block-unblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} entsperrt",
        "logentry-block-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6",
        "logentry-suppress-block": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6",
        "logentry-newusers-byemail": "{{GENDER:$2|Der $1|D $1|$1}} het ds Benutzerkonto $3 agleit und ds Passwort isch per E-Mail verschickt worde",
        "logentry-newusers-autocreate": "Ds {{GENDER:$2|Benutzerkonto}} $1 isch automatisch agleit worde",
        "logentry-protect-move_prot": "{{GENDER:$2|Der $1|D $1|$1}} het d Schutzystellige vo $4 uf $3 verschobe",
+       "logentry-protect-unprotect": "{{GENDER:$2|Der $1|D $1|$1}} het der Schutz vor Syte $3 furtgnoh.",
+       "logentry-protect-protect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4",
+       "logentry-protect-protect-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4 [mit Kaskade]",
+       "logentry-protect-modify": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 g’änderet $4",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 g’änderet $4 [mit Kaskade]",
        "logentry-rights-rights": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 vu $4 uf $5 gänderet",
        "logentry-rights-rights-legacy": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 gänderet",
        "logentry-rights-autopromote": "{{GENDER:$2|Der $1|D $1|$1}} isch automatisch vo $4 uf $5 beförderet worde",
        "api-error-badaccess-groups": "Du derfsch keini Dateie in des Wiki uffelade.",
        "api-error-badtoken": "Intärne Fähler: Dr Token isch fählerhaft.",
        "api-error-copyuploaddisabled": "S Uffelade iber e URL isch uf däm Server deaktiviert.",
-       "api-error-duplicate": "S git im Wiki scho {{PLURAL:$1|[$2 ei anderi Datei]|[$2 anderi Dateie]}} mit em glyche Inhalt.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|isch scho [$2 e andri Datei]|sin scho [$2 anderi Dateie]}} mit em glyche Inhalt vorhande gsi. {{PLURAL:$1|Si isch|Si sin}} allerdings glöscht worde.",
-       "api-error-duplicate-archive-popup-title": "Doppelti {{PLURAL:$1|Datei, wo scho worde isch|Dateie, wo scho glöscht worde sin}}",
-       "api-error-duplicate-popup-title": "Dopplet vorhandeni {{PLURAL:$1|Datei|Dateie}}",
+       "api-error-duplicate": "S git im Wiki scho {{PLURAL:$1|ei anderi Datei|anderi Dateie}} mit em glyche Inhalt.",
+       "api-error-duplicate-archive": "Es {{PLURAL:$1|isch scho e andri Datei|sin scho anderi Dateie}} mit em glyche Inhalt vorhande gsi. {{PLURAL:$1|Si isch|Si sin}} allerdings glöscht worde.",
        "api-error-empty-file": "D Datei, wu Du uffeglade hesch, isch läär.",
        "api-error-emptypage": "S isch nit erlaubt, neji lääri Syte aazlege.",
        "api-error-fetchfileerror": "Intärne Fähler: Bim Abruefe vu dr Datei isch e Fähler ufträtte.",
index 3dae27d..1e463ae 100644 (file)
@@ -26,7 +26,8 @@
                        "Macofe",
                        "Arbhatt",
                        "NehalDaveND",
-                       "Nisargjhaveri"
+                       "Nisargjhaveri",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "કડીઓની નીચે લીટી (અંડરલાઇન):",
        "mergehistory-go": "વિલિનીકરણશીલ ફેરફારો બતવો",
        "mergehistory-submit": "ફેરફારો વિલિન કરો",
        "mergehistory-empty": "પુનરાવર્તન સાચવી ન શકાયા",
-       "mergehistory-success": "[[:$1]] ના $3 {{PLURAL:$3|ફેરફાર |ફેરફારો}} ને સફળતા પૂર્વક  [[:$2]] માં વિલિનાકરાયા.",
+       "mergehistory-done": "$1 ના $3 {{PLURAL:$3|ફેરફાર |ફેરફારો}} ને સફળતા પૂર્વક  [[:$2]] માં વિલિનાકરાયા.",
        "mergehistory-fail": "ઇતિહાસ પાના વિલિન ન કરી શકાયા, પાના અને સમય સંબંધી વિકલ્પો ચકાસો.",
        "mergehistory-no-source": "સ્રોત પાનું $1 ઉપલબ્ધ નથી.",
        "mergehistory-no-destination": "લક્ષ્ય પાનું $1 અસ્તિત્વમાં નથી",
        "upload-dialog-button-done": "સંપન્ન",
        "upload-dialog-button-save": "સાચવો",
        "upload-dialog-button-upload": "ચઢાવો",
-       "upload-dialog-label-select-file": "ફાઈલ પસંદ કરો",
-       "upload-dialog-label-infoform-title": "વિગતો",
-       "upload-dialog-label-infoform-name": "નામ",
-       "upload-dialog-label-infoform-description": "વર્ણન",
-       "upload-dialog-label-usage-title": "વપરાશ",
-       "upload-dialog-label-usage-filename": "ફાઈલનું નામ",
+       "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": "ફાઈલનું નામ",
        "backend-fail-stream": "ફાઈલ $1 ને લાવી ન શકાઈ.",
        "backend-fail-backup": "ફાઈલ $1 ની પ્રત ન સાચવી શકાઈ.",
        "backend-fail-notexists": "ફાઈલ $1 ઉપલબ્ધ નથી.",
        "movepagetext": "નીચેનું ફોર્મ વાપરવાથી આ પાનાનું નામ બદલાઈ જશે અને તેમાં રહેલી બધી માહિતી નવા નામે બનેલાં પાનામાં ખસેડાઈ જશે.\nજૂનું પાનું, નવા બનેલા પાના તરફ વાળવામાં આવશે.\nતમે આવા અન્યત્ર વાળેલાં પાનાઓને આપોઆપ જ તેના મૂળ શીર્ષક સાથે જોડી શકશો.\nજો તમે તેમ કરવા ન ઇચ્છતા હોવ તો, [[Special:DoubleRedirects|બેવડા]] અથવા [[Special:BrokenRedirects|ત્રુટક કડી વાળા]] અન્યત્ર વાળેલા પાનાઓની યાદી ચકાસીને ખાતરી કરી લેશો.\nકડી જે પાના પર લઈ જવી જોઈએ તે જ પાના સાથે જોડે તેની ખાતરી કરી લેવી તે તમારી જવાબદારી છે.\n\nએ વાતની નોંધ લેશો કે, જો તમે પસંદ કરેલા નવા નામ વાળું પાનું અસ્તિત્વમાં હશે તો જૂનું પાનું <strong>નહી ખસે</strong>, સિવાયકે તે પણ અન્યત્ર વાળતું પાનું હોય અને તેનો કોઈ ઇતિહાસ ના હોય.\nઆનો અર્થ એમ થાય છે કે જો તમે કોઈ તબક્કે ભૂલ કરશો તો જે પાનાનું નામ બદલવાનો પ્રયત્ન કરતા હોવ તેને તમે ફરી પાછા જૂના નામ પર જ પાછું વાળી શકશો, અને બીજું કે પહેલેથી બનેલા પાનાનું નામ તમે નામફેર કરવા માટે ના વાપરી શકો.\n\n<strong>ચેતવણી!</strong>\nલોકપ્રિય પાનાં સાથે આવું કરવું બિનઅપેક્ષિત અને જોરદાર પરિણામકારક નિવડી શકે છે;\nઆગળ વધતાં પહેલાં આની અસરોનો પૂરેપૂરો તાગ મેળવી લેવો આવશ્યક છે.",
        "movepagetext-noredirectfixer": "નીચેનું ફોર્મ વાપરવાથી આ પાનાનું નામ બદલાઈ જશે અને તેમાં રહેલી બધી મહિતિ નવા નામે બનેલાં પાનામાં ખસેડાઈ જશે.\nજૂનું પાનું, નવા બનેલા પાના તરફ વાળવામાં આવશે.\nતમે આવા અન્યત્ર વાળેલાં પાનાઓને આપોઆપ જ તેના મૂળ શીર્ષક સાથે જોડી શકશો.\nજો તમે તેમ કરવા ન ઇચ્છતા હોવ તો, [[Special:DoubleRedirects|બેવડા]] અથવા [[Special:BrokenRedirects|ત્રુટક કડી વાળા]] અન્યત્ર વાળેલાં પાનાઓની યાદી ચકાસીને ખાતરી કરી લેશો.\nકડી જે પાના પર લઈ જવી જોઈએ તે જ પાના સાથે જોડે તેની ખાતરી કરી લેવી તે તમારી જવાબદારી છે.\n\nએ વાતની નોંધ લેશો કે, જો તમે પસંદ કરેલા નવા નામ વાળું પાનું અસ્તિત્વમાં હશે તો જૂનું પાનું <strong>નહી ખસે</strong>, સિવાયકે તે પાનું ખાલી હોય અથવા તે પણ અન્યત્ર વાળતું પાનું હોય અને તેનો કોઈ ઇતિહાસ ના હોય.\nઆનો અર્થ એમ થાય છે કે જો તમે કોઈ તબક્કે ભૂલ કરશો તો જે પાનાનું નામ બદલવાનો પ્રયત્ન કરતા હોવ તેને તમે ફરી પાછા જૂના નામ પર જ પાછું વાળી શકશો, અને બીજું કે પહેલેથી બનેલા પાનાનું નામ તમે નામફેર કરવા માટે ના વાપરી શકો.\n\n<strong>ચેતવણી!</strong>\nલોકપ્રિય પાનાં સાથે આવું કરવું બિનઅપેક્ષિત અને જોરદાર પરિણામકારક નિવડી શકે છે;\nઆગળ વધતાં પહેલાં આની અસરોનો પૂરેપૂરો તાગ મેળવી લેવો આવશ્યક છે.",
        "movepagetalktext": "આની સાથે સાથે તેનું સંલગ્ન ચર્ચાનું પાનું પણ ખસેડવામાં આવશે, '''સિવાયકે:'''\n*નવા નામ વાળું ચર્ચાનું પાનું અસ્તિત્વમાં હોય અને તેમાં લખાણ હોય, અથવા\n*નીચેનાં ખાનામાંથી ખરાની નિશાની તમે દૂર કરી હોય.\n\nઆ સંજોગોમાં, જો તમે ચાહતા હોવ તો તમારે અહિંનું લખાણ જાતે નવા પાના પર ખસેડવું પડશે.",
-       "movearticle": "આ પાનાનું નામ બદલો:",
        "moveuserpage-warning": "'''ચેતવણી :''' તમે સભ્યનું પાનું હટાવી રહ્યાં છો.  કૃપયા યાદરાખશો કે માત્ર પાનું જ હટાવીશકાશે અને સભ્ય્ને નૂતન નામ નહીં અપાય.",
        "movecategorypage-warning": "<strong>ચેતવણી:</strong> તમે શ્રેણીનું પાનું ખસેડવા જઈ રહ્યા છો. એ વાતની નોંધ લેશો કે આમ કરવાથી ફક્ત આ શ્રેણીનું પાનું જ દિશાનિર્દેશિત થશે (ખસેડવામાં આવશે), આ શ્રેણીમા રહેલા કોઈપણ પાના આપોઆપ જૂની શ્રેણીને બદલે નવી શ્રેણીમાં <em>નહિ બદલાય</em>.",
        "movenologintext": "કોઇ પાનું હટાવવા માટે તેમે નોંધણી કૃત સભ્ય અને [[Special:UserLogin|logged in]]  હોવા જોઇએ",
        "api-error-badaccess-groups": "આ વિકિ પર ફાઈલ ચઢાવવાની પરવાનગી તમને નથી.",
        "api-error-badtoken": "આંતરીક ત્રુટી: ખરાબ ટોકન",
        "api-error-copyuploaddisabled": "આ સર્વર પર URL દ્વારા માહિતી ચઢાવવા પર પ્રતિબંધ",
-       "api-error-duplicate": "આ {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} પહેલેથી સાઈટ પર તેજ માહિતી સાથે મોજૂદ છે.",
-       "api-error-duplicate-archive": "ત્યાં {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} તે જ મહિતી સાથે મોજૂદ છે , પણ {{PLURAL:$1|it was|they were}} હટાવી દો.",
-       "api-error-duplicate-archive-popup-title": "ડ્યુપ્લીકેટ {{PLURAL:$1|ફાઈલ|ફાઈલો}} પહેલેથી મોજુદ છે.",
-       "api-error-duplicate-popup-title": "આબેહુબ અન્ય {{PLURAL:$1|ફાઈલ|ફાઈલો}}.",
+       "api-error-duplicate": "સમાન માહિતી ધરાવતી {{PLURAL:$1|બીજી ફાઇલ|બીજી અન્ય ફાઇલ્સ}} સાઇટ પર હાજર છે જ.",
+       "api-error-duplicate-archive": "ત્યાં {{PLURAL:$1|was another file|were some other files}} તે જ મહિતી સાથે મોજૂદ છે , પણ {{PLURAL:$1|it was|they were}} હટાવી દો.",
        "api-error-empty-file": "તમે ચડાવેલ ફાઈલ ખાલી છે",
        "api-error-emptypage": "નવા ખાલી પાનાં બનાવવાની પરવાનગી નથી.",
        "api-error-fetchfileerror": "આંતરીક ત્રુટી: ફાઈલ લાવતી વખતે અમુક ગડબડ થઈ",
index 7625a16..9ce3772 100644 (file)
        "nstab-template": "תבנית",
        "nstab-help": "דף עזרה",
        "nstab-category": "קטגוריה",
+       "mainpage-nstab": "עמוד ראשי",
        "nosuchaction": "אין פעולה כזו",
        "nosuchactiontext": "הפעולה שצוינה בכתובת ה־URL אינה תקינה.\nייתכן שטעית בהקלדת ה־URL, או שהשתמשת בקישור לא נכון.\nייתכן גם שהבעיה נוצרה כתוצאה מבאג בתוכנה המשמשת את {{SITENAME}}.",
        "nosuchspecialpage": "אין דף מיוחד בשם זה",
        "databaseerror-error": "שגיאה: $1",
        "laggedslavemode": "'''אזהרה:''' הדף עשוי שלא להכיל עדכונים אחרונים.",
        "readonly": "בסיס הנתונים נעול",
-       "enterlockreason": "×\99ש ×\9c×\94×\96×\99×\9f סיבה לנעילה, כולל הערכה למועד שחרור הנעילה",
+       "enterlockreason": "×\99ש ×\9c×\94ק×\9c×\99×\93 סיבה לנעילה, כולל הערכה למועד שחרור הנעילה",
        "readonlytext": "בסיס נתונים זה של האתר נעול ברגע זה לצורך הזנת נתונים ושינויים. ככל הנראה מדובר בתחזוקה שוטפת, שלאחריה יחזור האתר לפעולתו הרגילה.\n\nמנהל המערכת שנעל את בסיס הנתונים סיפק את ההסבר הבא: $1",
        "missing-article": "בסיס הנתונים לא מצא את הטקסט של הדף שהוא היה אמור למצוא, בשם \"$1\" $2.\n\nהדבר נגרם בדרך כלל על־ידי קישור ישן להשוואת גרסאות של דף שנמחק או לגרסה של דף כזה.\n\nאם זה אינו המקרה, זהו כנראה באג בתוכנה.\nאנא דווחו על כך ל[[Special:ListUsers/sysop|מפעיל מערכת]], תוך שמירת פרטי כתובת ה־URL.",
        "missingarticle-rev": "(מספר גרסה: $1)",
        "viewsource": "הצגת מקור",
        "viewsource-title": "הצגת המקור של $1",
        "actionthrottled": "הפעולה הוגבלה",
-       "actionthrottledtext": "×\9b×\90×\9eצע×\99 × ×\92×\93 ×¡×¤×\90×\9d, קיימת מגבלה על ביצוע פעולה זו פעמים רבות מדי בזמן קצר, וחרגת מהמגבלה הזאת.\nנא לנסות שוב בעוד מספר דקות.",
+       "actionthrottledtext": "×\9b×\90×\9eצע×\99 × ×\92×\93 ×©×\99×\9e×\95ש ×\9cרע×\94, קיימת מגבלה על ביצוע פעולה זו פעמים רבות מדי בזמן קצר, וחרגת מהמגבלה הזאת.\nנא לנסות שוב בעוד מספר דקות.",
        "protectedpagetext": "דף זה מוגן כדי למנוע עריכה ופעולות אחרות.",
        "viewsourcetext": "באפשרותך לצפות בטקסט המקור של הדף ולהעתיקו.",
        "viewyourtext": "באפשרותך לצפות בטקסט המקור של <strong>העריכות שלך</strong> בדף הזה ולהעתיקו.",
        "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|דף|דפים}}",
        "emailnotauthenticated": "כתובת הדוא\"ל שלכם עדיין לא אומתה.\nלא יישלח אליכם דוא\"ל עבור אף אחת מהתכונות הבאות.",
        "noemailprefs": "יש לציין כתובת דוא\"ל בהעדפות שלך כדי שתכונות אלה יעבדו.",
        "emailconfirmlink": "אישור כתובת הדוא\"ל שלך",
-       "invalidemailaddress": "×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×\90×\99× ×\94 ×\9eתק×\91×\9cת ×\9b×\99×\95×\95×\9f ×©× ×¨×\90×\94 ×©×\94×\99×\90 ×\91פ×\95ר×\9e×\98 ×\9c×\90 ×\97×\95ק×\99.\n×\99ש ×\9c×\94×\96×\99×\9f כתובת תקינה או להשאיר את השדה ריק.",
+       "invalidemailaddress": "×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×\90×\99× ×\94 ×\9eתק×\91×\9cת ×\9b×\99×\95×\95×\9f ×©× ×¨×\90×\94 ×©×\94×\99×\90 ×\91פ×\95ר×\9e×\98 ×\9c×\90 ×\97×\95ק×\99.\n×\99ש ×\9c×\94ק×\9c×\99×\93 כתובת תקינה או להשאיר את השדה ריק.",
        "cannotchangeemail": "לא ניתן לשנות את כתובות הדוא\"ל של חשבונות באתר ויקי זה.",
        "emaildisabled": "אתר זה לא יכול לשלוח דואר אלקטרוני.",
        "accountcreated": "החשבון נוצר",
        "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-emailsent": "×\90×\9d ×\96×\95×\94×\99 ×\9bת×\95×\91ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×¨×©×\95×\9e×\94 ×¢×\91×\95ר ×\94×\97ש×\91×\95×\9f ×©×\9c×\9a, ×\90×\96 ×\99×\99שלח דואר אלקטרוני לאיפוס הסיסמה.",
        "passwordreset-emailsent-capture": "נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.",
        "passwordreset-emailerror-capture": "נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1",
-       "changeemail": "שינוי כתובת דוא\"ל",
-       "changeemail-text": "×\9e×\9c×\90×\95 ×\98×\95פס ×\96×\94 ×\9b×\93×\99 ×\9cשנ×\95ת ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\9c×\9b×\9d. ×\99×\94×\99×\94 ×¢×\9c×\99×\9b×\9d ×\9c×\9e×\9c×\90 ×¡×\99ס×\9e×\94 ×\9b×\93×\99 ×\9c×\90שר ×\90ת ×\94ש×\99× ×\95×\99.",
+       "changeemail": "ש×\99× ×\95×\99 ×\90×\95 ×\94סרת ×\9bת×\95×\91ת ×\93×\95×\90\"×\9c",
+       "changeemail-text": "×\9e×\9c×\90×\95 ×\98×\95פס ×\96×\94 ×\9b×\93×\99 ×\9cשנ×\95ת ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\9c×\9b×\9d. ×\99×\94×\99×\94 ×¢×\9c×\99×\9b×\9d ×\9c×\94ק×\9c×\99×\93 ×\90ת ×\94ס×\99ס×\9e×\94 ×\9b×\93×\99 ×\9c×\90שר ×\90ת ×\94ש×\99× ×\95×\99. ×\90×\9d ×\91רצ×\95× ×\9b×\9d ×\9c×\94×\99×\9e× ×¢ ×\9eש×\99×\95×\9a ×\9bת×\95×\91ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\9b×\9cש×\94×\99 ×\9c×\97ש×\91×\95× ×\9b×\9d, ×\94ש×\90×\99ר×\95 ×\90ת ×©×\93×\94 ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×\94×\97×\93ש×\94 ×¨×\99ק ×\91עת ×©×\9c×\99×\97ת ×\94×\98×\95פס.",
        "changeemail-no-info": "נדרשת כניסה לחשבון כדי לגשת לדף זה ישירות.",
        "changeemail-oldemail": "כתובת דוא\"ל נוכחית:",
        "changeemail-newemail": "כתובת דוא\"ל חדשה:",
+       "changeemail-newemail-help": "עליכם להשאיר שדה זה ריק אם ברצונכם להסיר את כתובת הדואר האלקטרוני שלכם. אם תסירו אותה, לא תוכלו לאפס סיסמה ששכחתם ולא תוכלו לקבל הודעות דואר אלקטרוני מאתר הוויקי הזה.",
        "changeemail-none": "(אין)",
        "changeemail-password": "סיסמה ב{{grammar:תחילית|{{SITENAME}}}}:",
        "changeemail-submit": "שינוי כתובת הדוא\"ל",
        "changeemail-throttled": "ביצעתם ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
-       "changeemail-nochange": "× ×\90 ×\9c×\94×\96×\99×\9f ×\9bת×\95×\91ת ×\93×\95×\90\"×\9c שונה.",
+       "changeemail-nochange": "×\99ש ×\9c×\94ק×\9c×\99×\93 ×\9bת×\95×\91ת ×\93×\95×\90\"×\9c ×\97×\93ש×\94 שונה.",
        "resettokens": "איפוס אסימונים",
        "resettokens-text": "בעמוד זה ניתן לאפס אסימונים שמאפשרים גישה לנתונים פרטיים של החשבון שלך.\n\nרצוי לעשות זאת אם שיתפת אותם בטעות עם אחרים או אם חשבונך נפרץ.",
        "resettokens-no-tokens": "אין אסימונים לאיפוס.",
        "template-protected": "(מוגנת)",
        "template-semiprotected": "(מוגנת חלקית)",
        "hiddencategories": "דף זה כלול ב{{PLURAL:$1|קטגוריה מוסתרת אחת|־$1 קטגוריות מוסתרות}}:",
-       "edittools": "<!-- הטקסט הנכתב כאן יוצג מתחת לטופסי עריכת דפים והעלאת קבצים, ולפיכך ניתן לכתוב להציג בו תווים קשים לכתיבה, קטעים מוכנים של טקסט ועוד. -->",
+       "edittools": "<!-- הטקסט הנכתב כאן יוצג מתחת לטופסי עריכת דפים והעלאת קבצים. -->",
        "nocreatetext": "ב{{grammar:תחילית|{{SITENAME}}}} קיימת הגבלה על יצירת דפים חדשים.\nבאפשרותך לחזור אחורה ולערוך דף קיים, או [[Special:UserLogin|להיכנס לחשבון או ליצור חשבון]].",
        "nocreate-loggedin": "אינך מורשה ליצור דפים חדשים.",
        "sectioneditnotsupported-title": "עריכת פסקאות אינה נתמכת",
        "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נראה שהוא נמחק.",
        "mergehistory-go": "הצגת עריכות בנות מיזוג",
        "mergehistory-submit": "מיזוג",
        "mergehistory-empty": "אין גרסאות למיזוג.",
-       "mergehistory-success": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של [[:$1]] מוזגו בהצלחה לתוך [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של $1 {{PLURAL:$3|מוזגה|מוזגו}} בהצלחה לתוך [[:$2]].",
        "mergehistory-fail": "לא ניתן לבצע את מיזוג הגרסאות, יש לבדוק שנית את הגדרות הדף והזמן.",
        "mergehistory-fail-toobig": "לא ניתן לבצע את מיזוג הגרסאות כיוון שצריך להעביר יותר גרסאות מהמגבלה, שהיא {{PLURAL:$1|גרסה אחת|‏‏֫$1 גרסאות}}.",
        "mergehistory-no-source": "דף המקור $1 אינו קיים.",
        "prefs-watchlist-token": "אסימון לרשימת המעקב:",
        "prefs-misc": "שונות",
        "prefs-resetpass": "שינוי סיסמה",
-       "prefs-changeemail": "שינוי כתובת דוא\"ל",
+       "prefs-changeemail": "ש×\99× ×\95×\99 ×\90×\95 ×\94סרת ×\9bת×\95×\91ת ×\93×\95×\90\"×\9c",
        "prefs-setemail": "הגדרת כתובת דוא\"ל",
        "prefs-email": "אפשרויות דוא\"ל",
        "prefs-rendering": "מראה",
        "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-options": "אפשרויות העלאה",
        "watchthisupload": "מעקב אחרי קובץ זה",
        "filewasdeleted": "קובץ בשם זה כבר הועלה בעבר, ולאחר מכן נמחק. אנא בדקו את הדף $1 לפני שתמשיכו להעלותו שנית.",
+       "filename-thumb-name": "נראה שכותרת הקובץ היא כותרת של תמונה מוקטנת (ממוזערת). יש להימנע מהעלאת תמונות ממוזערות בחזרה לאותו אתר ויקי. אם זו אינה תמונה ממוזערת, יש לתקן את שם הקובץ כך שיהיה משמעותי יותר ושלא יכלול את הקידומת של תמונה ממוזערת.",
        "filename-bad-prefix": "שם הקובץ שאתם מעלים מתחיל ב־<strong>\"$1\"</strong>, שהוא שם שאינו מתאר את הקובץ ובדרך כלל מוקצה אוטומטית על־ידי מצלמות דיגיטליות.\nיש לבחור שם מתאים יותר לקובץ, שיתאר את תכניו.",
        "filename-prefix-blacklist": " #<!-- נא להשאיר שורה זו בדיוק כפי שהיא --> <pre>\n# התחביר הוא כדלקמן:\n#   * כל דבר מתו \"#\" לסוף השורה הוא הערה\n#   * כל שורה לא ריקה היא קידומת לשמות קבצים טיפוסיים שמצלמות דיגיטליות נותנות אוטומטית\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # מספר טלפונים סלולריים\nIMG # כללי\nJD # Jenoptik\nMGP # Pentax\nPICT # שונות\n #</pre> <!-- נא להשאיר שורה זו בדיוק כפי שהיא -->",
        "upload-success-subj": "ההעלאה הושלמה בהצלחה",
        "upload-http-error": "התרחשה שגיאת HTTP‏: $1",
        "upload-copy-upload-invalid-domain": "העלאת קבצים משרת זה אינה אפשרית.",
        "upload-dialog-title": "העלאת קובץ",
-       "upload-dialog-error": "אירעה שגיאה",
-       "upload-dialog-warning": "אירעה אזהרה",
        "upload-dialog-button-cancel": "ביטול",
        "upload-dialog-button-done": "בוצע",
        "upload-dialog-button-save": "שמירה",
        "upload-dialog-button-upload": "העלאה",
-       "upload-dialog-label-select-file": "בחירת קובץ",
-       "upload-dialog-label-infoform-title": "פרטים",
-       "upload-dialog-label-infoform-name": "שם",
-       "upload-dialog-label-infoform-description": "תיאור",
-       "upload-dialog-label-usage-title": "שימושים",
-       "upload-dialog-label-usage-filename": "שם הקובץ",
+       "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": "תאריך",
+       "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-wikimediacommons": "אני מאשר שאני מחזיק בזכויות היוצרים על הקובץ הזה, ואני מסכים לשחרר אותו באופן בלתי הפיך עבור ויקישיתוף תחת רישיון [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-wikimediacommons": "אם זכויות היוצרים על הקובץ הזה אינן בבעלותך, או שברצונך לשחרר אותו תחת רישיון אחר, באפשרותך להשתמש ב[https://commons.wikimedia.org/wiki/Special:UploadWizard אשף ההעלאה לוויקישיתוף].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "באפשרותך לנסות להשתמש ב[[Special:Upload|דף העלאת הקבצים ב{{grammar:תחילית|{{SITENAME}}}}]], אם ניתן להעלות את הקובץ הזה לשם לפי מדיניות האתר.",
        "backend-fail-stream": "לא הייתה אפשרות להזרים את הקובץ \"$1\".",
        "backend-fail-backup": "לא הייתה אפשרות לגבות את הקובץ \"$1\".",
        "backend-fail-notexists": "הקובץ \"$1\" אינו קיים.",
        "filerevert-legend": "שחזור קובץ",
        "filerevert-intro": "אתם עומדים לשחזר את הקובץ '''[[Media:$1|$1]]''' ל[$4 גרסה מ־$3, $2].",
        "filerevert-comment": "סיבה:",
-       "filerevert-defaultcomment": "שוחזר לגרסה מ־$2, $1",
+       "filerevert-defaultcomment": "שוחזר לגרסה מ־$2, $1 ($3)",
        "filerevert-submit": "שחזור",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> שוחזר ל[$4 גרסה מ־$3, $2].",
        "filerevert-badversion": "אין גרסה מקומית קודמת של הקובץ שהועלתה בתאריך המבוקש.",
        "noemailtext": "משתמש זה לא הזין כתובת דואר אלקטרוני תקינה.",
        "nowikiemailtext": "משתמש זה בחר שלא לקבל דואר אלקטרוני ממשתמשים אחרים.",
        "emailnotarget": "שם המשתמש של הנמען לא קיים או בלתי תקין.",
-       "emailtarget": "×\99ש ×\9c×\94×\96×\99×\9f את שם המשתמש של הנמען",
+       "emailtarget": "×\99ש ×\9c×\94ק×\9c×\99×\93 את שם המשתמש של הנמען",
        "emailusername": "שם משתמש:",
        "emailusernamesubmit": "שליחה",
        "email-legend": "שליחת דואר אלקטרוני למשתמש אחר של {{SITENAME}}",
        "emailccsubject": "העתק של הודעתך למשתמש $1: $2",
        "emailsent": "הדואר נשלח",
        "emailsenttext": "הודעת הדואר האלקטרוני שלך נשלחה.",
-       "emailuserfooter": "דואר זה נשלח על־ידי $1 ל{{GRAMMAR:תחילית|$2}} באמצעות פעולת \"{{int:emailuser}}\" ב{{GRAMMAR:תחילית|{{SITENAME}}}}.",
+       "emailuserfooter": "$1 {{GENDER:$1|שלח|שלחה}} את הדוא\"ל הזה ל{{GRAMMAR:תחילית|$2}} באמצעות פעולת \"{{int:emailuser}}\" ב{{GRAMMAR:תחילית|{{SITENAME}}}}.",
        "usermessage-summary": "השארת הודעת מערכת.",
        "usermessage-editor": "שולח הודעות המערכת",
        "watchlist": "רשימת המעקב",
        "deletepage": "מחיקה",
        "confirm": "אישור",
        "excontent": "התוכן היה: \"$1\"",
-       "excontentauthor": "התוכן היה: \"$1\" ({{GENDER:$2|והתורם היחיד היה|והתורמת היחידה הייתה}} \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "התוכן היה: \"$1\", {{GENDER:$2|והתורם היחיד היה|והתורמת היחידה הייתה}} \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|שיחה]])",
        "exbeforeblank": "התוכן לפני שרוקן היה: \"$1\"",
        "delete-confirm": "מחיקת \"$1\"",
        "delete-legend": "מחיקה",
        "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": "דף השיחה של דף זה יועבר אוטומטית, אלא אם:\n* קיים דף שיחה שאינו ריק תחת השם החדש אליו מועבר הדף, או\n* הסרתם את הסימון בתיבה שלהלן.\n\nבמקרים אלו, תצטרכו להעביר או לשלב את הדפים באופן ידני, אם תרצו.",
-       "movearticle": "העברת דף:",
+       "movepagetalktext": "אם התיבה הזאת מסומנת, דף השיחה של דף זה יועבר אוטומטית לכותרת החדשה, אלא אם קיים שם דף שיחה שאינו ריק.\n\nבמקרה הזה, תצטרכו להעביר או לשלב את הדפים באופן ידני, אם תרצו.",
        "moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
        "movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
        "movenologintext": "עליכם להיות רשומים ו[[Special:UserLogin|להיכנס לחשבון]] כדי להעביר דפים.",
        "cant-move-to-user-page": "אין לך הרשאה להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).",
        "cant-move-category-page": "אין לך הרשאה להעביר דפי קטגוריה.",
        "cant-move-to-category-page": "אין לך הרשאה להעביר דף לדף קטגוריה.",
-       "newtitle": "×\9cשם החדש:",
+       "newtitle": "×\94שם החדש:",
        "move-watch": "מעקב אחר דף המקור ואחר דף היעד",
        "movepagebtn": "העברה",
        "pagemovedsub": "ההעברה הושלמה בהצלחה",
        "exif-bitspersample": "ביטים לרכיב",
        "exif-compression": "תבנית דחיסה",
        "exif-photometricinterpretation": "הרכב פיקסלים",
-       "exif-orientation": "×\9b×\99×\95×\95× ×\99×\95ת",
+       "exif-orientation": "×\9b×\99×\95×\95×\9f ×\9eצ×\9c×\9e×\94",
        "exif-samplesperpixel": "מספר רכיבים",
        "exif-planarconfiguration": "סידור מידע",
        "exif-ycbcrsubsampling": "הפחתת יחס Y ל־C",
        "logentry-newusers-byemail": "חשבון המשתמש $3 נוצר על־ידי $1 והסיסמה נשלחה בדוא\"ל",
        "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:$2|שינה|שינתה}} את ההרשאות של $3 מ{{GRAMMAR:תחילית|$4}} ל{{GRAMMAR:תחילית|$5}}&rlm;",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3&rlm;",
        "logentry-rights-autopromote": "$1 קודם אוטומטית מ{{GRAMMAR:תחילית|$4}} ל{{GRAMMAR:תחילית|$5}}",
        "api-error-badaccess-groups": "אינך מורשה להעלות קבצים לאתר הוויקי הזה.",
        "api-error-badtoken": "שגיאה פנימית: אסימון שבור.",
        "api-error-copyuploaddisabled": "העלאה לפי כתובת כובתה בשרת זה.",
-       "api-error-duplicate": "כבר יש באתר הוויקי {{PLURAL:$1|[$2 קובץ אחר] בעל|[$2 קבצים אחרים] בעלי}} אותו תוכן.",
-       "api-error-duplicate-archive": "באתר כבר {{PLURAL:$1|היה [$2 קובץ אחר]|היו [$2 קבצים אחרים]}} עם אותו תוכן, אבל {{PLURAL:$1|הוא נמחק|הם נמחקו}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|קובץ כפול שכבר נמחק|קבצים כפולים שכבר נמחקו}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|קובץ כפול|קבצים כפולים}}",
+       "api-error-duplicate": "כבר יש באתר הזה {{PLURAL:$1|קובץ אחר|קבצים אחרים}} עם אותו תוכן.",
+       "api-error-duplicate-archive": "כבר {{PLURAL:$1|היה|היו}} באתר הזה {{PLURAL:$1|קובץ|קבצים}} עם אותו תוכן, אבל {{PLURAL:$1|הוא נמחק|הם נמחקו}}.",
        "api-error-empty-file": "הקובץ ששלחת היה ריק.",
        "api-error-emptypage": "יצירת דפים חדשים ריקים אינה אפשרית.",
        "api-error-fetchfileerror": "שגיאה פנימית: משהו השתבש בזמן אחזור הקובץ.",
index 893070d..0d780b6 100644 (file)
@@ -64,7 +64,9 @@
                        "Sahilrathod",
                        "Hindustanilanguage",
                        "राम प्रसाद जोशी",
-                       "ShrUtiable"
+                       "ShrUtiable",
+                       "Matma Rex",
+                       "Angpradesh"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "nstab-template": "साँचा",
        "nstab-help": "सहायता पृष्ठ",
        "nstab-category": "श्रेणी",
+       "mainpage-nstab": "मुखपृष्ठ",
        "nosuchaction": "ऐसा कोई कार्य नहीं है",
        "nosuchactiontext": "इस यू॰आर॰एल द्वारा निर्दिष्ट क्रिया अवैध है।\nआपने यू॰आर॰एल गलत लिखा होगा, या किसी गलत कड़ी का प्रयोग किया होगा।\nयह {{SITENAME}} के सॉफ़्टवेयर में त्रुटि भी हो सकती है।",
        "nosuchspecialpage": "ऐसा कोई विशेष पृष्ठ नहीं है",
        "mergehistory-go": "एकत्रित करने लायक संपादन दिखाएँ",
        "mergehistory-submit": "अवतरण एकत्रित करें",
        "mergehistory-empty": "कोई भी अवतरण एकत्रित नहीं कर सकते।",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|का|के}} $3 अवतरण [[:$2]] में एकत्रित कर {{PLURAL:$3|दिया गया है|दिये गए हैं}}।",
+       "mergehistory-done": "$1 {{PLURAL:$3|का|के}} $3 अवतरण [[:$2]] में एकत्रित कर {{PLURAL:$3|दिया गया है|दिये गए हैं}}।",
        "mergehistory-fail": "इतिहास एकत्रित नहीं कर सकते, कृपया पृष्ठ और समय की पुनः जाँच करें।",
        "mergehistory-fail-toobig": "इतिहास विलय करना संभव नहीं है क्योंकि अवतरण सीमा $1 से अधिक {{PLURAL:$1|अवतरण|अवतरणों}} को स्थानांतरित करना होगा।",
        "mergehistory-no-source": "स्रोत पृष्ठ $1 मौजूद नहीं है।",
        "movepagetext": "नीचे दिया हुआ फ़ॉर्म पृष्ठ का नाम बदल देगा, उसका सारा इतिहास भी नए नाम से दिखना शुरू हो जाएगा।\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आगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।\n\n'''सूचना!'''\nस्थानांतरण करनेसे कोई भी महत्वपूर्ण लेख में अनपेक्षित बदलाव हो सकते है ।\nआपसे अनुरोध है कि आप इसके परिणाम जान लें ।",
        "movepagetalktext": "संबंधित वार्ता पृष्ठ इसके साथ स्थानांतरीत नहीं होगा '''अगर:'''\n* आप पृष्ठ दुसरे नामस्थान में स्थानांतरीत कर रहें है\n* इस नाम का वार्ता पृष्ठ पहलेसे बना हुवा है, या\n* नीचे दिया हुआ चेक बॉक्स आपने निकाल दिया है ।\n\nइन मामलोंमे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।",
-       "movearticle": "पृष्ठ का नाम बदलें",
        "moveuserpage-warning": "<strong>चेतावनी:</strong> आप एक सदस्य पृष्ठ स्थानांतरित करने जा रहे हैं। कृपया ध्यान दें कि केवल पृष्ठ का नाम बदला जाएगा और सदस्यनाम <em>नहीं</em> बदलेगा।",
        "movecategorypage-warning": "<strong>चेतावनी:</strong> आप एक श्रेणी पृष्ठ को स्थानांतरित करने जा रहे हैं। याद रखिए कि केवल वह पृष्ठ स्थानांतरित होगा और पुरानी श्रेणी में शामिल पृष्ठ नई श्रेणी के अंतरगत <em>नहीं</em> आएँगे।",
        "movenologintext": "लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।",
        "tooltip-pt-logout": "सत्रांत",
        "tooltip-pt-createaccount": "हमारा सुझाव है की आप खाता बनाएँ और लॉगिन करें, परन्तु यह अनिवार्य नहीं है",
        "tooltip-ca-talk": "सामग्री पृष्ठ के बारे में वार्तालाप",
-       "tooltip-ca-edit": "à¤\86प à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ à¤¬à¤¦à¤² à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82।\nà¤\95à¥\83पया à¤¬à¤¦à¤²à¤¾à¤µ à¤¸à¤\82à¤\9cà¥\8bनà¥\87 à¤¸à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\9dलà¤\95 à¤¦à¥\87à¤\96à¥\87à¤\82।",
+       "tooltip-ca-edit": "यह à¤ªà¥\83षà¥\8dठ à¤¸à¤\82पादित à¤\95रà¥\87à¤\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": "यह à¤\8fà¤\95 à¤\96ास à¤ªà¥\83षà¥\8dठ à¤¹à¥\88, à¤\86प à¤\87सà¥\87 à¤¬à¤¦à¤² à¤¨à¤¹à¥\80à¤\82 à¤¸à¤\95तà¥\87à¤\82 à¤¹à¥\88à¤\82",
+       "tooltip-ca-nstab-special": "यह à¤\8fà¤\95 à¤\96ास à¤ªà¥\83षà¥\8dठ à¤¹à¥\88, à¤\87सà¤\95ा à¤¸à¤\82पादन à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता",
        "tooltip-ca-nstab-project": "प्रोजेक्ट पृष्ठ देखियें",
        "tooltip-ca-nstab-image": "संचिका का पृष्ठ देखें",
        "tooltip-ca-nstab-mediawiki": "प्रणाली सन्देश देखें",
        "api-error-badaccess-groups": "आपको इस विकि के लिए फ़ाइलें अपलोड करने की अनुमति नहीं है.",
        "api-error-badtoken": "आंतरिक त्रुटि: बुरी टोकन।",
        "api-error-copyuploaddisabled": "URL द्वारा इस सर्वर पर अपलोड अक्षम है।",
-       "api-error-duplicate": "वहाँ {{PLURAL:$1| [ $2 अन्य फ़ाइल] | रहे हैं [ $2 कुछ अन्य फ़ाइलों]}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
-       "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था [$2 कुछ अन्य फ़ाइल] |were [$2 कुछ अन्य फ़ाइलें]}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
-       "api-error-duplicate-archive-popup-title": "डुप्लिकेट {{PLURAL:$1| फ़ाइल | फ़ाइलें}} है कि पहले से ही हटा दिया गया है",
-       "api-error-duplicate-popup-title": "डुप्लिकेट {{PLURAL:$1| फ़ाइल | फ़ाइलें}}",
+       "api-error-duplicate": "वहाँ {{PLURAL:$1| अन्य फ़ाइल | रहे हैं कुछ अन्य फ़ाइलों}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
+       "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था कुछ अन्य फ़ाइल |were कुछ अन्य फ़ाइलें}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
        "api-error-empty-file": "प्रस्तुत फ़ाइल खाली था।",
        "api-error-emptypage": "नए खाली पृष्ठ बनाने की अनुमति नहीं है।",
        "api-error-fetchfileerror": "आंतरिक त्रुटि: जब फ़ाइल लाया जा रहा तो कुछ गलत हो गया था।",
index 9c90dcc..430f6a3 100644 (file)
@@ -13,7 +13,8 @@
                        "Soul Train",
                        "Filipinayzd",
                        "SNN95",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Jorr ke niche line khicho:",
        "mergehistory-go": "Jorre jaae sake badlao ke dekhao",
        "mergehistory-submit": "Badlao ke jorro",
        "mergehistory-empty": "Koi badlao ke jorraa nai jaae sake hai.",
-       "mergehistory-success": "[[:$1]]ke $3 {{PLURAL:$3|badlao|badlao}} ke safalta se [[:$2]] me jorr dewa gais hai.",
+       "mergehistory-done": "$1ke $3 {{PLURAL:$3|badlao|badlao}} ke safalta se [[:$2]] me jorr dewa gais hai.",
        "mergehistory-fail": "Itihaas ke nai jorre paaya hae, meharbaani kar ke panna aur time parameters ke check karo.",
        "mergehistory-fail-toobig": "History merge nai hoe sake, kaaheki limit of $1 {{PLURAL:$1|revision|revisions}} se jaada move hoe jaai.",
        "mergehistory-no-source": "Source panna $1 nai hai.",
        "movepagetext": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nAap uu redirect, jon ki pahile waala title pe jawe hai, ke update kare sakta hai.\nAgar aap ii nai kare mangta hai, tab [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karna.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move '''nai''' hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n'''CHETAWANI'''\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
        "movepagetext-noredirectfixer": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nIi jaruri hae ki aap  [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karo.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move '''nai''' hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n'''CHETAWANI'''\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
        "movepagetalktext": "Saathe ke talk panna ke automatically move kar dewa jai ii panna ke saathe '''agar jo:'''\n* khali nahi talk page nawaa naam ke already hai, yah\n* Aap nivhe waala box ke uncheck karo\nIi prastithi me, aap ke manually move yah merge kare ke parri.",
-       "movearticle": "Panna ke naam badli karo:",
        "moveuserpage-warning": " '''Chetauni:'''  Aap ek sadasya ke panna ke naam badle waala hae. Ii yaad rakhna ki khaali panna ke naam badla jaai, sadasya ke naam ''nai'' badlaa jaai.",
        "movecategorypage-warning": "<strong>Chetauni:</strong> Aap ek category panna ke hatae waala hae. Khaali ii panna ke hataawa jaai aur purana category ke aur panna ke nawaa category me <em>nai</em>  recategorize karaa jaai.",
        "movenologintext": "Panna ke naam badle ke khatir aap ke ek registered sadasya rahe ke parri aur  [[Special:UserLogin|logged in]].",
        "api-error-badaccess-groups": "Aap ke ii wiki me file upload kare ke ijajat nai hae.",
        "api-error-badtoken": "Internal error: Bad token.",
        "api-error-copyuploaddisabled": "Uploading by URL ke ii server me disable kar dewa gais hae.",
-       "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
-       "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-       "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
-       "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
+       "api-error-duplicate": "There {{PLURAL:$1|is another file|are some other files}} already on the site with the same content.",
+       "api-error-duplicate-archive": "There {{PLURAL:$1|was another file|were some other files}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
        "api-error-empty-file": "Jon file ke aap submit karaa rahaa, khaali hae.",
        "api-error-emptypage": "Nawaa, khaali panna ke banae ke ijajat nai hae.",
        "api-error-fetchfileerror": "Internal error: File khoje ke time kuch wrong hoe gais hae.",
index 872f935..809ceac 100644 (file)
        "mergehistory-go": "Ipakita ang mga mahimo masugpon nga mga pagbag-o",
        "mergehistory-submit": "Isugpon ang mga pagbag-o",
        "mergehistory-empty": "Wala sing pagbag-o nga mahimo masugpon.",
-       "mergehistory-success": "$3 {{PLURAL:$3|ka pagbag-o|ka mga pagbag-o}} sang [[:$1]] madinalag-on nga ginsugpon sa [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ka pagbag-o|ka mga pagbag-o}} sang $1 madinalag-on nga ginsugpon sa [[:$2]].",
        "mergehistory-fail": "Wala mahuman ang pagsugpon sang kasaysayan, palihog lantawa liwat ang panid kag ang parametro sang tion.",
        "mergehistory-no-source": "Ang ginhalin nga panid nga $1 wala naga-eksister.",
        "mergehistory-no-destination": "Ang tuyo lab-oton nga panid nga $1 wala naga-eksister.",
        "move-page-legend": "Saylohon ining panid",
        "movepagetext": "Sa pagamit sang lista sa idalum ay magahatag ini sang bag-o na ngalan, pagasaylohon niya ang tanan nga historya sa bag-o nga ngalan.\nIpaga-dirketahon ang daan nga titulo sa bag-o nga titulo.\n\nPwede mo man mabag-o ang gapang direkta liwat nga naga pakadto sa orihinal nga titulo automatiko.\nKung indi mo gusto, siguradohon mo nga tan-awon mo [[Special:DoubleRedirects|doble]] ukon [[Special:BrokenRedirects|nabuka nga i-direktahon liwat]].\nIkaw ang responsable sa paghimo sini sang sigurado nga naga tabid sini para magapadayon sa iya palakadtoan.\n\nTandaan nga ang ini nga pahina ya '''indi''' na masaylo kun may-ara na sang pahina sa may bag-o nga titulo, pero ini siya blangko ukon gindirekta liwat kag wala siya nga naislan sang una.\nGinasiling lang di nga pwede ka hatag liwat sang ngalan balik sa ngalan niya sang una kun na nagsala ka sa pagbutang kag hindi mo masampawan ang na ara na daan nga pahina.\n\n'''Paandam!'''\nIni siya isa ka madasig kag di ma ekspektahan nga pagbag-o para sa isa ka masikat nga pahina;\npalihog siguradohon mo nga naintindihan ang resulta antes mo ini pagahimuon.",
        "movepagetalktext": "Ang upod mo nga hisayranay pahina ay magasaylo automatiko upod sina '''apang:'''\n*Ang di-blangko nga hisayranay pahina ay nahimo na nga daan sa idalum sang bag-o nga ngalan, ukon\n*Wala nimo nachekan ang kahon sa idalum.\n\nSa sini nga mga kaso, kilanlan mo gid isaylo o isahon ang pahina sang pag-amat amat kun gusto mo gid ini himuon.",
-       "movearticle": "Saylohon ining panid:",
        "newtitle": "Sa bag-o nga titulo:",
        "move-watch": "Bantayan ining panid",
        "movepagebtn": "Saylohon ining panid",
index fc9c649..7507c21 100644 (file)
@@ -31,7 +31,8 @@
                        "Macofe",
                        "Fraxinus",
                        "Srdjan m",
-                       "Teoo3"
+                       "Teoo3",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podcrtane poveznice",
        "mergehistory-go": "Pokaži spojivu povijest uređivanja",
        "mergehistory-submit": "Spoji povijesti uređivanja stranica",
        "mergehistory-empty": "Nema spojivih promjena (spajanje nije moguće).",
-       "mergehistory-success": "$3 {{PLURAL:$3|izmjena|izmjene}} stranice [[:$1|$1]] uspješno {{PLURAL:$3|spojena|spojene}} u povijest stranice [[:$2|$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|izmjena|izmjene}} stranice $1 uspješno {{PLURAL:$3|spojena|spojene}} u povijest stranice [[:$2]].",
        "mergehistory-fail": "Nemoguće spojiti povijest stranica, molimo provjerite stranice i vremenske parametre.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Ciljna stranica $1 ne postoji.",
        "filerevert-legend": "Vrati datoteku",
        "filerevert-intro": "Vraćate '''[[Media:$1|$1]]''' na [$4 promjenu od $3, $2].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "vraćeno na inačicu od $1 ($2)",
+       "filerevert-defaultcomment": "vraćeno na inačicu od $1, $2 ($3)",
        "filerevert-submit": "Vrati",
        "filerevert-success": "'''[[Media:$1|$1]]''' je vraćena na [$4 promjenu od $3, $2].",
        "filerevert-badversion": "Nema prethodne lokalne inačice datoteke s zadanim datumom i vremenom.",
        "movepagetext": "Uporabom ovog obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime.\nStari će se naslov pretvoriti u stranicu koja automatski preusmjerava na novi naslov.\nMožete odabrati automatsko ažuriranje preusmjeravanja na izvorni naslov.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da sve poveznice i dalje nastave voditi na prave stranice.\n\nStranica se '''ne će''' premjestiti ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači: 1. ako pogriješite, možete opet preimenovati stranicu na stari naslov, 2. ne može se dogoditi da izbrišete neku postojeću stranicu.\n\n'''Upozorenje!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice. Molimo dobro razmislite prije nego što preimenujete stranicu.",
        "movepagetext-noredirectfixer": "Pomoću donjeg obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime. \nStari će se naslov pretvoriti u stranicu koja automatski preusmjerava na novi naslov. \nBudite sigurni da ste provjerili [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nevaljana preusmjeravanja]]. \nVi ste odgovorni za to da poveznice i dalje povezuju tamo gdje treba.\n\nImajte na umu da stranica '''ne će''' biti premještena ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena. \nTo znači da stranicu možete preimenovati u prethodno ime ako ste pogriješili te ne možete pisati preko postojeće stranice. \n\n'''Upozorenje!''' \nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice; \nbudite sigurni da razumijete posljedice ove akcije prije nastavka.",
        "movepagetalktext": "Stranica za razgovor, ako postoji, automatski će se premjestiti zajedno sa stranicom koju premještate. '''Stranica se za razgovor ne će premjestiti ako:'''\n*premještate stranicu iz jednog prostora u drugi,\n*pod novim imenom već postoji stranica za razgovor s nekim sadržajem, ili\n*maknete kvačicu u kućici na dnu ove stranice.\n\nU tim ćete slučajevima morati sami premjestiti ili iskopirati stranicu za razgovor,\nako to želite.",
-       "movearticle": "Premjesti stranicu",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate suradničku stranicu. Imajte na umu da će stranica biti premještena, ali suradnik ''ne će'' biti preimenovan.",
        "movenologintext": "Ako želite premjestiti stranicu morate biti [[Special:UserLogin|prijavljeni]].",
        "movenotallowed": "Nemate pravo premještanja stranica.",
        "api-error-badaccess-groups": "Nemate ovlasti za postavljanje datoteka na ovu wiki.",
        "api-error-badtoken": "Interna pogrješka: Token nije ispravan.",
        "api-error-copyuploaddisabled": "Postavljanje datoteka putem URL-a nije omogućeno na ovom projektu.",
-       "api-error-duplicate": "{{PLURAL:$1|Postoji [$2 druga datoteka]|Postoje $1 [$2 druge datoteke]|Postoji $1 [$2 drugih datoteka]}} istog sadržaja.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 neke druge datoteke]|Postojalo je [$2 nekih drugih datoteka]}} na projektu s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Dupla datoteka|Duple datoteke}} koje su ranije obrisane.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|$1 dupla datoteka|$1 duple datoteke|$1 duplih datoteka}}.",
+       "api-error-duplicate": "{{PLURAL:$1|Postoji druga datoteka|Postoje $1 druge datoteke|Postoji $1 drugih datoteka}} istog sadržaja.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su neke druge datoteke|Postojalo je nekih drugih datoteka}} na projektu s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
        "api-error-empty-file": "Datoteka koju ste poslali je prazna.",
        "api-error-emptypage": "Stvaranje praznih novih stranica nije dopušteno.",
        "api-error-fetchfileerror": "Interna pogrješka: Pojavio se neki problem pri dobivanju podataka o datoteci.",
index e0235d3..4d70a66 100644 (file)
@@ -2,7 +2,9 @@
        "@metadata": {
                "authors": [
                        "Paul Beppler",
-                       "Midnight Gambler"
+                       "Midnight Gambler",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Links (Verbinnunge) unnerstreiche:",
        "mergehistory-go": "Zeich Versione, wo vereinicht sin könne",
        "mergehistory-submit": "Vereinich Versione",
        "mergehistory-empty": "Do könne ken Versione vereinicht sin.",
-       "mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versione}} von \"[[:$1]]\" erfollichreich noh „[[:$2]]“ vereinicht.",
+       "mergehistory-done": "{{PLURAL:$3|1 Version|$3 Versione}} von \"$1\" erfollichreich noh „[[:$2]]“ vereinicht.",
        "mergehistory-fail": "Versionsvereinichung net möchlich, bittschön prüf die Seit und die Zeitoongäb.",
        "mergehistory-no-source": "Uarsprungsseit \"$1\" ist net voarhand.",
        "mergehistory-no-destination": "Zielseit \"$1\" ist net voarhand.",
        "filerevert-legend": "Datei zurücksetze",
        "filerevert-intro": "Du setzt die Datei '''[[Media:$1|$1]]''' uff die [$4 Version vom $2, $3 Uhr] zurück.",
        "filerevert-comment": "Grund:",
-       "filerevert-defaultcomment": "Zurückgesetzt uff die Version vom $1, $2 Uhr",
+       "filerevert-defaultcomment": "Zurückgesetzt uff die Version vom $1, $2 Uhr ($3)",
        "filerevert-submit": "Zurücksetze",
        "filerevert-success": "'''[[Media:$1|$1]]''' woard uff die [$4 Version vom $2, $3 Uhr] zurückgesetzt.",
        "filerevert-badversion": "Do gebts ken Version von der Datei zu dem oongebne Zeitpunkt.",
        "movepagetext": "Mit dem unnenstehendem Formular kannst du en Seit umbenenne, indem du sie mitsamt alle Versione uff en neie Titel verschiebst.\nDer alte Titel weard danoh zum neie weiterleite.\nDu kannst Weiterleitunge, wo uff den Originaltitel verlinke, automatisch korrigiere losse.\nMach sicher, dass du im Oonschluss all die [[Special:DoubleRedirects|doppelte]] orrer [[Special:BrokenRedirects|defekt Weiterleitunge]] üwerprüfe tust.\nDu bist dofoar verantwortlich, dass Links weiterhin uff das korrekte Ziel verweise.\n\nDie Seit weard '''net''' verschub, soweit das schon en Seit mit dem voargesiehne Titel gebt, es sei denn, letztre ist en Weiterleitung ohne Versionsgeschicht.\nDas bedeitet, dass du die Umbenennung rückgängig mache kannst, soweit du en Fehler gemacht host. Du kannst hingeche ken existierende Seit üwerschreiwe.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichende und unerwoortete Folliche für häifich besuchte Seite honn.\nDu solltst doher die Konsequenze verstand honn, bevoar du jetzt fortfährst.",
        "movepagetext-noredirectfixer": "Mit dem do unnen stehendem Formular kannst du en Seit umbenenne, indem du sie mitsamt alle Versione uff en neie Titel verschiebst.\nDer alte Titel weard danoh zum neie weiterleite.\nMach sicher, dass du im Oonschluss all [[Special:DoubleRedirects|doppelte]] orrer [[Special:BrokenRedirects|defekt Weiterleitunge]] üwerprüfe tust.\nDu bist dofoar verantwortlich, dass Links weiterhin uff das korrekte Ziel verweise.\n\nDie Seit weard '''net''' verschub, soweit es schon en Seit mit dem voargesiehne Titel gebt, das sei denn, die ist en Weiterleitung ohne Versionsgeschicht.\nDas bedeitet, dass du die Umbenennung rückgängig mache kannst, soweit du en Fehler gemacht host. Du kannst hingeche ken existierend Seit üwerschreiwe.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichend und unerwoortete Folliche für häifich besuchte Seite honn.\nDu solltst doher die Konsequenze verstand honn, bevoar du jetzt fortfährst.",
        "movepagetalktext": "Die dazugehöriche Diskussionsseit weard, soweit voarhand, mitverschub, '''es sei denn:'''\n*Es existiert schon en Diskussionsseit mit dem Noome, orrer\n*du wählst die do unne stehnd Option ab.\n\nIn den Fälle musst du, falls gewünscht, den Inhalt von der Seit von Hand verschieb orrer zusammerführe.\n\nBittschön den '''neie''' Titel unnich '''Ziel''' rentroohn, dorunner die Umbenennung bittschön '''begründe.'''",
-       "movearticle": "Seit verschiebe:",
        "moveuserpage-warning": "'''Warnung:''' Du bist dabei, en Benutzerseit zu verschiebe. Bittschön bedenk, dass dodoorrich nuar die Benutzerseit verschub, '''net''' awer der Benutzer umbenannt weard.",
        "movenologintext": "Du musst en registrierter Benutzer und [[Special:UserLogin|ongemeldt]] sin, um en Seit zu verschiebe.",
        "movenotallowed": "Du host net die erforderliche Berechtichung, um Seite verschiebe zu könne.",
        "api-error-badaccess-groups": "Du host net die Berechtichung Dateie in des Wiki hochzuloode.",
        "api-error-badtoken": "Interner Fehler: Der Token ist fehlerhaft.",
        "api-error-copyuploaddisabled": "Das Hochloode doorrich URL woard uff dem Server deaktiviert.",
-       "api-error-duplicate": "Do gebts im Wiki schon {{PLURAL:$1|[$2 en anner Datei]|[$2 mehrre andere Dateie]}} mit dem gleiche Inhalt.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|war schon [$2 annre Datei]|woore schon [$2 annre Dateie]}} mit dem gleiche Inhalt voarhand. {{PLURAL:$1|Sie woard|Sie woorre}} awer abgewischt.",
-       "api-error-duplicate-archive-popup-title": "Doppelt {{PLURAL:$1|Datei, wo schon abgewischt woard|Dateie, wo sochon abgewischt worre}}",
-       "api-error-duplicate-popup-title": "Doppelt vorhandne {{PLURAL:$1|Datei|Dateie}}",
+       "api-error-duplicate": "Do gebts im Wiki schon {{PLURAL:$1|en anner Datei|mehrre andere Dateie}} mit dem gleiche Inhalt.",
+       "api-error-duplicate-archive": "Es {{PLURAL:$1|war schon annre Datei|woore schon annre Dateie}} mit dem gleiche Inhalt voarhand. {{PLURAL:$1|Sie woard|Sie woorre}} awer abgewischt.",
        "api-error-empty-file": "Die hochgeloodne Datei woor leer.",
        "api-error-emptypage": "Es ist net erlaubt, neie leere Seite erstelle.",
        "api-error-fetchfileerror": "Interner Fehler: Bei dem Datei abrufe ist en Fehler uffgetret.",
index 28625c2..0114e10 100644 (file)
@@ -13,7 +13,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Mikławš",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Wotkazy podšmórnić:",
        "mergehistory-go": "Zjednoćujomne změny pokazać",
        "mergehistory-submit": "Wersije zjednoćić",
        "mergehistory-empty": "Njehodźa so žane wersije zjednoćeć.",
-       "mergehistory-success": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wot [[:$1]] wuspěšnje z [[:$2]] {{PLURAL:$3|zjednoćena|zjednoćenej|zjednoćene|zjednoćene}}.",
+       "mergehistory-done": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wot $1 wuspěšnje z [[:$2]] {{PLURAL:$3|zjednoćena|zjednoćenej|zjednoćene|zjednoćene}}.",
        "mergehistory-fail": "Njeje móžno zjednócenje stawiznow přewjesć, prošu přepruwuj stronu a časowe parametry.",
        "mergehistory-no-source": "Žórłowa strona $1 njeeksistuje.",
        "mergehistory-no-destination": "Cilowa strona $1 njeeksistuje.",
        "filerevert-legend": "Dataju wróćo stajeć",
        "filerevert-intro": "Stajiš dataju '''[[Media:$1|$1]]''' na [$4 wersiju wot $2, $3 hodź.] wróćo.",
        "filerevert-comment": "Přičina:",
-       "filerevert-defaultcomment": "wróćo stajene na wersiju wot $1, $2 hodź.",
+       "filerevert-defaultcomment": "wróćo stajene na wersiju wot $1, $2 hodź ($3)",
        "filerevert-submit": "Cofnyć",
        "filerevert-success": "'''[[Media:$1|$1]]''' bu na [$4 wersiju wot $2, $3 hodź.] wróćo stajeny.",
        "filerevert-badversion": "W zapodatym času žana wersija dataje njeje.",
        "movepagetext": "Wužiwanje formulara deleka budźe stronu přemjenować, suwajo jeje cyłe stawizny pod nowe mjeno. Stary titl budźe daleposrědkowanje na nowy titl.  Móžeš dalesposrědkowanja, kotrež na prěnjotny titl pokazać, awtomatisce aktualizować. Pruwuj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|skóncowanymi daleposrědkowanjemi]]. Dyrbiš zaručić, zo wotkazy na stronu pokazuja, na kotruž dyrbja dowjesć.\n\nWobkedźbuj, zo strona so '''nje'''přesunje, jeli strona z nowym titlom hizo eksistuje, chibazo poslednja je dalesposrědkowanje a nima zašłe stawizny. To woznamjenja, zo móžeš stronu tam wróćo přemjenować, hdźež bu runje přemjenowana, jeli zmylk činiš a njemóžeš wobstejacu stronu přepisować.\n\n'''Kedźbu!''' Móže to drastiska a njewočakowana změna za woblubowanu stronu być; prošu budź sej wěsty, zo sćěwki rozumiš, prjedy hač pokročuješ.",
        "movepagetext-noredirectfixer": "Wužiwajo slědowacy formular, móžeš stronu přemjenować a wšě jich daty do stawiznow noweho titula přesunyć.\nStary titul budźe dalesposrědkowanska strona k nowemu titulej.\nSkontroluj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|wobškodźenymi dalesposrědkowanjemi]].\nSy za to zamołwity, zo wotkazy na tón cil pokazuja, na kotryž maja pokazować.\n\nDźiwaj na to, zo strona so '''nje'''přesunje, jeli je hižo strona z nowym titulom, chibazo wona je prózdna abo dalesposrědkowanje a nima stawizny změnow.\nTo woznamjenja, zo móžeš stronu do stareho mjena wróćopřemjenować, jeli činiš zmylk a njemóžeš eksistowacu stronu přepisać.\n\n'''Warnowanje!'''\nTo móže drastiska a njewočakowana změna za woblubowanu stronu być:\nprošu wuwědomće sej konsekwency, prjedy hač pokročuješ.",
        "movepagetalktext": "Přisłušna diskusijna strona přesunje so awtomatisce hromadźe z njej, <b>chibazo:</b>\n*Njeprózdna diskusijna strona pod nowym mjenom hižo eksistuje abo\n*wotstronješ hóčku z kašćika deleka.\n\nW tutych padach dyrbiš stronu manuelnje přesunyć abo zaměšeć, jeli sej to přeješ.",
-       "movearticle": "Stronu přesunyć",
        "moveuserpage-warning": "'''Warnowanje:''' Sy při tym wužiwarsku stronu přesunyć. Prošu dźiwaj na to, zo so jenož strona posunje a wužiwar so ''nje''budźe přemjenować.",
        "movecategorypage-warning": "<strong>Warnowanje:</strong> Chceš runje kategorijowu stronu přesunyć. Prošu dźiwaj na to, zo so jenož strona přesunje a strony w starej kategoriji <em>nje</em>budu so nowo kategorizować.",
        "movenologintext": "Dyrbiš zregistrowany wužiwar a [[Special:UserLogin|přizjewjeny]] być, zo by stronu přesunył.",
        "api-error-badaccess-groups": "Nimaš prawo dataje do tutoho wikija nahrać.",
        "api-error-badtoken": "Nutřkowny zmylk: Wopačny token.",
        "api-error-copyuploaddisabled": "Nahrawanje přez URL je na tutym serwerje znjemóžnjene.",
-       "api-error-duplicate": "{{PLURAL:$1|Je|Stej|Su|Je}} hižo {{PLURAL:$1|[$2 druha dataja]|[$2 druhej dataji]|[$2 druhe dataje]|[$2 druhich datajow]}} ze samsnym wobsahom na sydle",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Bě [$2 druha dataja]|Běštej [$2 druhej dataji]|Běchu [$2 druhe dataje]|Bě [$2 druhich datajow]}} hižo na websydle ze samsnym wobsahom, ale {{PLURAL:$1|je so zhašała|stej so zhašałoj|su so zhašeli|je so zhašało}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Dwójna dataja, kotraž je|Dwójnej dataji, kotrejž stej|Dwójne dataje, kotrež su|Dwójne dataje, kotrež su}} so hižo {{PLURAL:$1|zhašała|zhašałoj|zhašeli|zhašeli}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Dwójna dataja|Dwójnej dataji|Dwójne dataje|Dwójne dataje}}",
+       "api-error-duplicate": "{{PLURAL:$1|Je|Stej|Su|Je}} hižo {{PLURAL:$1|druha dataja|druhej dataji|druhe dataje|druhich datajow}} ze samsnym wobsahom na sydle",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Bě druha dataja|Běštej druhej dataji|Běchu druhe dataje|Bě druhich datajow}} hižo na websydle ze samsnym wobsahom, ale {{PLURAL:$1|je so zhašała|stej so zhašałoj|su so zhašeli|je so zhašało}}.",
        "api-error-empty-file": "Dataja, kotruž sy nahrał, je prózdna.",
        "api-error-emptypage": "Wutworjenje nowych, prózdnych stronow njeje dowolene.",
        "api-error-fetchfileerror": "Nutřkowny zmylk: při wobstarowanju dataje je so něšto nimokuliło.",
index 8ad74b9..59bf7c6 100644 (file)
@@ -39,7 +39,8 @@
                        "Adam78",
                        "Grin",
                        "Macofe",
-                       "Nyuszika7H"
+                       "Nyuszika7H",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "resetpass-expired": "A jelszavad lejárt. Adjál meg egy új jelszót a bejelentkezéshez!",
        "resetpass-expired-soft": "A jelszavad lejárt, ezért újat kell beállítanod. Válassz most egy új jelszót, vagy kattints a {{int:resetpass-submit-cancel}} gombra, ha később akarod csak beállítani.",
        "resetpass-validity-soft": "Adj meg egy új jelszót most, vagy kattints a \"{{int:resetpass-submit-cancel}}\" gombra, ha később akarod megadni.",
-       "passwordreset": "Jelszó törlése",
+       "passwordreset": "Jelszó visszaállítása",
        "passwordreset-text-one": "A jelszó átmeneti beállításához töltsd ki az űrlapot.",
        "passwordreset-text-many": "{{PLURAL:$1|Az átmeneti jelszó elküldéséhez töltsd ki az alábbi mezők egyikét.}}",
        "passwordreset-disabled": "Új jelszó kérése nem engedélyezett ezen a wikin.",
        "mergehistory-go": "Egyesíthető szerkesztések mutatása",
        "mergehistory-submit": "Változatok egyesítése",
        "mergehistory-empty": "Nincs egyesíthető változás.",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|egy|$3}} változata sikeresen egyesítve lett a(z) [[:$2]] lappal.",
+       "mergehistory-done": "$1 {{PLURAL:$3|egy|$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.",
        "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.",
-       "movearticle": "Átnevezendő lap:",
        "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]].",
        "api-error-badaccess-groups": "Nincs jogod fájlokat feltölteni erre a wikire.",
        "api-error-badtoken": "Belső hiba: hibás token.",
        "api-error-copyuploaddisabled": "Az URL-címes feltöltés nem engedélyezett ezen a kiszolgálón.",
-       "api-error-duplicate": "Már van {{PLURAL:$1|egy|néhány}} [$2 másik fájl] az oldalon ugyanilyen tartalommal",
-       "api-error-duplicate-archive": "Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} [$2 más {{PLURAL:$1|fájl|fájlok}}] is ugyanezzel a tartalommal, de törölve {{PLURAL:$1|lett|lettek}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Az azonos fájl, ami törölve lett|Azonos fájlok, amik törölve lettek}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duplikátum|Duplikátumok}}",
+       "api-error-duplicate": "Már van {{PLURAL:$1|egy|néhány}} másik fájl az oldalon ugyanilyen tartalommal",
+       "api-error-duplicate-archive": "Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} más {{PLURAL:$1|fájl|fájlok}} is ugyanezzel a tartalommal, de törölve {{PLURAL:$1|lett|lettek}}.",
        "api-error-empty-file": "Az általad elküldött fájl üres volt.",
        "api-error-emptypage": "Új, üres lap létrehozása nem engedélyezett.",
        "api-error-fetchfileerror": "Belső hiba: valami baj történt a fájl beolvasása közben.",
index cb00042..36e9ce8 100644 (file)
        "nstab-template": "Patrono",
        "nstab-help": "Pagina de adjuta",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pagina principal",
        "nosuchaction": "Non existe tal action",
        "nosuchactiontext": "Le action specificate in le adresse URL non es valide.\nEs possibile que tu ha mal entrate le URL o sequite un ligamine incorrecte.\nIsto poterea equalmente indicar un defecto in le software usate per {{SITENAME}}.",
        "nosuchspecialpage": "Pagina special invalide",
        "viewsource": "Vider codice-fonte",
        "viewsource-title": "Le texto fonte de $1",
        "actionthrottled": "Action limitate",
-       "actionthrottledtext": "Como mesura anti-spam, tu es limitate de executar iste action troppo de vices durante un curte periodo de tempore, e tu ha excedite iste limite.\nPer favor reprova post alcun minutas.",
+       "actionthrottledtext": "Como mesura anti-abuso, le uso de iste action ha essite limitate a un certe numero de vices durante un curte periodo de tempore, e tu ha excedite iste limite.\nTenta lo de novo in alcun minutas.",
        "protectedpagetext": "Iste pagina ha essite protegite pro impedir le modification o altere actiones.",
        "viewsourcetext": "Tu pote vider e copiar le codice-fonte de iste pagina.",
        "viewyourtext": "Tu pote vider e copiar le fonte de <strong>tu modificationes</strong> de iste pagina.",
        "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 un altere conto",
+       "createacct-another-submit": "Crear conto",
        "createacct-benefit-heading": "{{SITENAME}} es facite per gente como tu.",
        "createacct-benefit-body1": "{{PLURAL:$1|modification|modificationes}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|paginas}}",
        "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": "Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate.",
+       "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-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 adresse de e-mail",
-       "changeemail-text": "Completa iste formulario pro cambiar tu adresse de e-mail. Essera necessari entrar tu contrasigno pro confirmar iste cambio.",
+       "changeemail": "Cambiar o remover adresse de e-mail",
+       "changeemail-text": "Completa iste formulario pro cambiar tu adresse de e-mail. Essera necessari entrar tu contrasigno pro confirmar iste cambiamento. Si tu vole remover le association de omne adresse de e-mail ab tu conto, lassa le campo pro le nove adresse de e-mail vacue quando tu submitte le formulario.",
        "changeemail-no-info": "Tu debe aperir un session pro poter acceder directemente a iste pagina.",
        "changeemail-oldemail": "Adresse de e-mail actual:",
        "changeemail-newemail": "Adresse de e-mail nove:",
+       "changeemail-newemail-help": "This field should be left blank if you want to remove your email address. You will not be able to reset a forgotten password and will not receive emails from this wiki if the email address is removed.",
        "changeemail-none": "(nulle)",
        "changeemail-password": "Contrasigno de {{SITENAME}}:",
        "changeemail-submit": "Cambiar e-mail",
        "changeemail-throttled": "Tu ha facite troppo de tentativas de aperir session.\nPer favor attende $1 ante de probar lo novemente.",
+       "changeemail-nochange": "Per favor entra un altere nove adresse de e-mail.",
        "resettokens": "Reinitialisar indicios",
        "resettokens-text": "Hic tu pote reinitialisar le indicios que permitte le accesso a certe datos private associate a tu conto.\n\nTu deberea facer lo si tu los ha accidentalmente dividite con un altere persona o si tu conto ha essite compromittite.",
        "resettokens-no-tokens": "Il non ha indicios a reinitialisar.",
        "permissionserrorstext-withaction": "Tu non ha le permission de $2, pro le sequente {{PLURAL:$1|motivo|motivos}}:",
        "recreate-moveddeleted-warn": "'''Attention: Tu es sur le puncto de recrear un pagina que ha essite delite anteriormente.'''\n\nTu deberea considerar si il es appropriate continuar a modificar iste pagina.\nEcce le registro de deletiones e de renominationes pro iste pagina:",
        "moveddeleted-notice": "Iste pagina ha essite delite.\nIn basso se revela le registro de deletiones e de modificationes del pagina pro ulterior informationes.",
+       "moveddeleted-notice-recent": "Regrettabilemente iste pagina ha essite delite (in le ultime 24 horas).\nLe registro de deletion e renomination pro le pagina es fornite hic infra pro vostre information.",
        "log-fulllog": "Vider le registro complete",
        "edit-hook-aborted": "Modification abortate per un extension.\nNulle explication disponibile.",
        "edit-gone-missing": "Impossibile actualisar le pagina.\nPare que illo ha essite delite.",
        "mergehistory-go": "Revelar modificationes fusionabile",
        "mergehistory-submit": "Fusionar versiones",
        "mergehistory-empty": "Nulle versiones pote esser fusionate.",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versiones}} de [[:$1]] fusionate in [[:$2]] con successo.",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versiones}} de $1 fusionate in [[:$2]] con successo.",
        "mergehistory-fail": "Impossibile executar le fusion del historia. Per favor reverifica le parametros del pagina e del tempore.",
        "mergehistory-fail-toobig": "Le historias de versiones non pote esser fusionate con plus de $1 {{PLURAL:$1|version|versiones}} a displaciar.",
        "mergehistory-no-source": "Le pagina de origine $1 non existe.",
        "prefs-watchlist-token": "Indicio pro le observatorio:",
        "prefs-misc": "Misc",
        "prefs-resetpass": "Cambiar contrasigno",
-       "prefs-changeemail": "Cambiar e-mail",
+       "prefs-changeemail": "Cambiar o remover adresse de e-mail",
        "prefs-setemail": "Specificar un adresse de e-mail",
        "prefs-email": "Optiones de e-mail",
        "prefs-rendering": "Apparentia",
        "group-bot": "Bots",
        "group-sysop": "Administratores",
        "group-bureaucrat": "Bureaucrates",
-       "group-suppress": "Supervisores",
+       "group-suppress": "Suppressores",
        "group-all": "(totes)",
        "group-user-member": "{{GENDER:$1|usator|usatrice|usator}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usator|usatrice|usator}} autoconfirmate",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratrice|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureaucrate}}",
-       "group-suppress-member": "{{GENDER:$1|supervisor|supervisora}}",
+       "group-suppress-member": "{{GENDER:$1|suppressor}}",
        "grouppage-user": "{{ns:project}}:Usatores",
        "grouppage-autoconfirmed": "{{ns:project}}:Usatores autoconfirmate",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administratores",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrates",
-       "grouppage-suppress": "{{ns:project}}:Supervisores",
+       "grouppage-suppress": "{{ns:project}}:Suppressores",
        "right-read": "Leger paginas",
        "right-edit": "Modificar paginas",
        "right-createpage": "Crear paginas (non discussion)",
        "recentchangeslinked-summary": "Isto es un lista de modificationes facite recentemente in paginas ligate ab un pagina specific (o in membros de un categoria specific).\nLe paginas presente in [[Special:Watchlist|tu observatorio]] appare in litteras '''grasse'''.",
        "recentchangeslinked-page": "Nomine del pagina:",
        "recentchangeslinked-to": "Monstrar modificationes in paginas con ligamines al pagina specificate",
+       "recentchanges-page-added-to-category": "[[:$1]] addite al categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|un pagina|$2 paginas}} addite al categoria",
+       "recentchanges-page-removed-from-category": "[[:$1]] removite del categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|un pagina|$2 paginas}} removite del categoria",
+       "autochange-username": "Cambiamento automatic de MediaWiki",
        "upload": "Incargar file",
        "uploadbtn": "Incargar file",
        "reuploaddesc": "Cancellar e retornar al formulario de incargamento",
        "upload-options": "Optiones de incargamento",
        "watchthisupload": "Observar iste file",
        "filewasdeleted": "Un file con iste nomine ha anteriormente essite incargate e postea delite.\nTu debe verificar le $1 ante de re-incargar lo de novo.",
+       "filename-thumb-name": "Isto pare como un titulo de miniatura. Per favor non re-incarga miniaturas in le mesme wiki. Alteremente, per favor modifica le nomine del file de maniera que illo es plus significative e non ha le prefixo de miniatura.",
        "filename-bad-prefix": "Le nomine del file que tu es super le puncto de incargar comencia con '''\"$1\"''', le qual es un nomine non descriptive, typicamente assignate automaticamente per le cameras digital.\nPer favor selige un nomine plus descriptive pro tu file.",
        "filename-prefix-blacklist": " #<!-- non modificar de alcun modo iste linea --> <pre>\n# Le syntaxe es como seque:\n#   * Toto a partir de un character \"#\" usque al fin del linea es un commento\n#   * Cata linea non vacue es un prefixo pro tal nomines de file como automaticamente assignate per cameras digital\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alcun telephonos mobile\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- non modificar de alcun modo iste linea -->",
        "upload-success-subj": "Incargamento succedite",
        "upload-http-error": "Un error HTTP occurreva: $1",
        "upload-copy-upload-invalid-domain": "Le incargamento de copias non es disponibile ab iste dominio.",
        "upload-dialog-title": "Incargar file",
-       "upload-dialog-error": "Un error ha occurrite",
-       "upload-dialog-warning": "Un advertimento se ha producite",
        "upload-dialog-button-cancel": "Cancellar",
        "upload-dialog-button-done": "Facite",
        "upload-dialog-button-save": "Salveguardar",
        "upload-dialog-button-upload": "Incargar",
-       "upload-dialog-label-select-file": "Seliger file",
-       "upload-dialog-label-infoform-title": "Detalios",
-       "upload-dialog-label-infoform-name": "Nomine",
-       "upload-dialog-label-infoform-description": "Description",
-       "upload-dialog-label-usage-title": "Uso",
-       "upload-dialog-label-usage-filename": "Nomine del file",
+       "upload-process-error": "Un error ha occurrite",
+       "upload-process-warning": "Un advertimento se ha producite",
+       "upload-form-label-select-file": "Seliger file",
+       "upload-form-label-infoform-title": "Detalios",
+       "upload-form-label-infoform-name": "Nomine",
+       "upload-form-label-infoform-description": "Description",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nomine del file",
+       "foreign-structured-upload-form-label-own-work": "Iste es mi proprie obra",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorias",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-default": "Io comprende que io incarga iste file in un repositorio commun. Io confirma que io lo face secundo le conditiones de servicio e politicas de licentia de illo.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Si tu non pote incargar iste file in concordantia con le politicas del repositorio commun, per favor claude iste dialogo e essaya un altere methodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Tu pote anque probar [[Special:Upload|le pagina de incargamento in {{SITENAME}}]], si le politicas de ille sito permitte incargar iste file.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Io certifica que io possede le derecto de autor sur iste file, io consenti le publication irrevocabile de iste file a Wikimedia Commons sub le licentia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], e io accepta le [https://wikimediafoundation.org/wiki/Terms_of_Use conditiones de uso].",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Si tu non possede le derecto de autor sur iste file, o si tu prefere publicar lo sub un altere licentia, considera usar le [https://commons.wikimedia.org/wiki/Special:UploadWizard assistente de incargamento de Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Tu pote anque probar [[Special:Upload|le pagina de incargamento in {{SITENAME}}]], si le politicas de ille sito permitte incargar iste file.",
        "backend-fail-stream": "Non poteva transmitter le file $1.",
        "backend-fail-backup": "Non poteva facer un copia de reserva del file $1.",
        "backend-fail-notexists": "Le file $1 non existe.",
        "filerevert-legend": "Reverter file",
        "filerevert-intro": "Tu reverte '''[[Media:$1|$1]]''' al [$4 version del $3 a $2].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Revertite al version del $2 a $1",
+       "filerevert-defaultcomment": "Revertite al version del $2, $1 ($3)",
        "filerevert-submit": "Reverter",
        "filerevert-success": "'''[[Media:$1|$1]]''' ha essite revertite al [$4 version del $3 a $2].",
        "filerevert-badversion": "Non existe un version local anterior de iste file con le data e hora providite.",
        "nopagetext": "Le pagina de destination que tu ha specificate non existe.",
        "pager-newer-n": "{{PLURAL:$1|1 plus recente|$1 plus recente}}",
        "pager-older-n": "{{PLURAL:$1|1 minus recente|$1 minus recente}}",
-       "suppress": "Supervisor",
+       "suppress": "Supprimer",
        "querypage-disabled": "Iste pagina special es disactivate pro evitar de supercargar le systema.",
        "apihelp": "Adjuta con le API",
        "apihelp-no-such-module": "Modulo \"$1\" non trovate.",
        "emailccsubject": "Copia de tu message a $1: $2",
        "emailsent": "E-mail inviate",
        "emailsenttext": "Tu message de e-mail ha essite inviate.",
-       "emailuserfooter": "Iste e-mail ha essite inviate per $1 a $2 con le function \"{{int:emailuser}}\" in {{SITENAME}}.",
+       "emailuserfooter": "Iste e-mail ha essite {{GENDER:$1|inviate}} per $1 a {{GENDER:$2|$2}} con le function \"{{int:emailuser}}\" in {{SITENAME}}.",
        "usermessage-summary": "Lassante un message de systema.",
        "usermessage-editor": "Messagero del systema",
        "watchlist": "Observatorio",
        "deletepage": "Deler pagina",
        "confirm": "Confirmar",
        "excontent": "contento esseva: '$1'",
-       "excontentauthor": "contento esseva: '$1' (e le sol contributor esseva '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "contento esseva: \"$1\" e le unic contributor esseva \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|discussion]])",
        "exbeforeblank": "contento ante radimento esseva: '$1'",
        "delete-confirm": "Deler \"$1\"",
        "delete-legend": "Deler",
        "move-page-legend": "Renominar pagina",
        "movepagetext": "Per medio del formulario hic infra tu pote renominar un pagina, transferente tote su historia al nove nomine.\nLe ancian titulo devenira un pagina de redirection verso le nove titulo.\nTu pote actualisar automaticamente le redirectiones que puncta verso le titulo original.\nSi tu prefere non facer isto, non oblida de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].\nTu ha le responsabilitate de assecurar que le ligamines continua a punctar verso le paginas correcte.\n\nNota que le pagina '''non''' essera renominate si existe jam un pagina sub le nove titulo, excepte si iste es un redirection sin historia de modificationes passate.\nIsto te lassa le possibilitate de restaurar le titulo original de un pagina si tu ha committite un error, sin permitter te de supplantar un pagina existente.\n\n'''Attention!'''\nIsto pote esser un cambio drastic e inexpectate pro un pagina popular;\nper favor assecura te de haber comprendite le consequentias de isto ante de continuar.",
        "movepagetext-noredirectfixer": "Per medio del formulario infra tu pote renominar un pagina, transferente tote su historia al nove nomine.\nLe ancian titulo devenira un pagina de redirection verso le nove titulo.\nNon oblida de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].\nTu ha le responsabilitate de assecurar que le ligamines continua a punctar verso le paginas correcte.\n\nNota que le pagina '''non''' essera renominate si existe jam un pagina sub le nove titulo, excepte si iste es un redirection sin historia de modificationes passate.\nIsto te lassa le possibilitate de restaurar le titulo original de un pagina si tu ha committite un error, sin permitter te de supplantar un pagina existente.\n\n'''Attention!'''\nIsto pote esser un cambio drastic e inexpectate pro un pagina popular;\nper favor assecura te de haber comprendite le consequentias de isto ante de continuar.",
-       "movepagetalktext": "Le pagina de discussion associate essera automaticamente renominate conjunctemente con illo '''a minus que''':\n*Un pagina de discussion non vacue ja existe sub le nove nomine, o\n*Tu dismarca le quadrato infra.\n\nIl tal casos, tu debera renominar o fusionar le pagina manualmente si desirate.",
-       "movearticle": "Renominar pagina:",
+       "movepagetalktext": "Si tu marca iste quadrato, le pagina de discussion associate essera automaticamente renominate al nove titulo, a minus que un pagina de discussion non vacue ja existe sub le nove nomine.\n\nIn tal caso, tu debera renominar o fusionar le pagina manualmente si desirate.",
        "moveuserpage-warning": "'''Attention:''' Tu es super le puncto de renominar un pagina de usator. Nota ben que solmente le pagina, e ''non'' le usator, essera renominate.",
        "movecategorypage-warning": "<strong>Attention:</strong> Tu es sur le puncto de renominar un pagina de categoria. Nota ben que solmente le pagina essera renominate e tote le paginas in le ancian categoria <em>non</em> essera recategorisate in le nove.",
        "movenologintext": "Tu debe esser un usator registrate e [[Special:UserLogin|aperir un session]] pro poter renominar un pagina.",
        "cant-move-to-user-page": "Tu non ha le permission de renominar un pagina verso un pagina de usator (excepte un subpagina de usator).",
        "cant-move-category-page": "Tu non ha le permission de renominar paginas de categoria.",
        "cant-move-to-category-page": "Tu non ha le permission de renominar un pagina in un pagina de categoria.",
-       "newtitle": "Al nove titulo:",
+       "newtitle": "Nove titulo:",
        "move-watch": "Observar le paginas de origine e de destination",
        "movepagebtn": "Renominar pagina",
        "pagemovedsub": "Renomination succedite",
        "logentry-newusers-byemail": "Le conto de usator $3 ha essite {{GENDER:$2|create}} per $1 e le contrasigno ha essite inviate per e-mail",
        "logentry-newusers-autocreate": "Le conto $1 ha essite {{GENDER:$2|create}} automaticamente",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|displaciava}} le parametros de protection de $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|removeva}} le protection de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protegeva}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegeva}} $3 $4 [in cascada]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|cambiava}} le nivello de protection de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cambiava}} le nivello de protection de $3 $4 [in cascada]",
        "logentry-rights-rights": "$1 {{GENDER:$2|cambiava}} le appertinentia a gruppos pro $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|cambiava}} le appertinentia a gruppos pro $3",
        "logentry-rights-autopromote": "$1 ha essite automaticamente {{GENDER:$2|promovite}} de $4 a $5",
        "api-error-badaccess-groups": "Tu non ha le permission de incargar files in iste wiki.",
        "api-error-badtoken": "Error interne: indicio invalide.",
        "api-error-copyuploaddisabled": "Le incargamentos per URL es disactivate in iste servitor.",
-       "api-error-duplicate": "Existe jam [$2 {{PLURAL:$1|un altere file|altere files}}] in le wiki con le mesme contento.",
-       "api-error-duplicate-archive": "Il habeva jam {{PLURAL:$1|[$2 un altere file]|[$2 altere files]}} in le sito con le mesme contento, ma {{PLURAL:$1|illo|illos}} ha essite delite.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|File|Files}} duplicate que ha jam essite delite",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|File|Files}} duplicate",
+       "api-error-duplicate": "Existe jam {{PLURAL:$1|un altere file|altere files}} in le wiki con le mesme contento.",
+       "api-error-duplicate-archive": "Il habeva jam {{PLURAL:$1|un altere file|altere files}} in le sito con le mesme contento, ma {{PLURAL:$1|illo|illos}} ha essite delite.",
        "api-error-empty-file": "Le file que tu submitteva es vacue.",
        "api-error-emptypage": "Le creation de nove paginas vacue non es permittite.",
        "api-error-fetchfileerror": "Error interne: qualcosa errava durante le obtention del file.",
index 05b2682..ced910d 100644 (file)
@@ -40,7 +40,8 @@
                        "Macofe",
                        "Totosunarto",
                        "Mirws",
-                       "Ilham"
+                       "Ilham",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "permissionserrorstext-withaction": "Anda tidak memiliki hak akses untuk $2, karena {{PLURAL:$1|alasan|alasan}} berikut:",
        "recreate-moveddeleted-warn": "'''Peringatan: Anda membuat ulang suatu halaman yang sudah pernah dihapus.'''\n\nHarap pertimbangkan apakah layak untuk melanjutkan suntingan Anda.\nBerikut adalah log penghapusan dan pemindahan dari halaman ini:",
        "moveddeleted-notice": "Halaman ini telah dihapus.\nSebagai referensi, berikut adalah log penghapusan dan pemindahan halaman ini.",
+       "moveddeleted-notice-recent": "Maaf, halaman ini telah dihapus (dalam 24 jam ini). Sebagai referensi, berikut adalah log penghapusan atau pemindahan halaman ini.",
        "log-fulllog": "Lihat seluruh log",
        "edit-hook-aborted": "Suntingan dibatalkan oleh kait parser\ntanpa ada keterangan.",
        "edit-gone-missing": "Tidak dapat memperbaharui halaman.\nHalaman kemungkinan telah dihapus.",
        "mergehistory-go": "Tampilkan suntingan-suntingan yang dapat digabung",
        "mergehistory-submit": "Gabung revisi",
        "mergehistory-empty": "Tidak ada revisi yang dapat digabung.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisi|revisi}} dari [[:$1]] berhasil digabungkan ke [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisi|revisi}} dari $1 berhasil digabungkan ke [[:$2]].",
        "mergehistory-fail": "Tidak dapat melakukan penggabungan, harap periksa kembali halaman dan parameter waktu.",
        "mergehistory-fail-toobig": "Tidak dapat melakukan penggabungan sebagai lebih dari batas dari $1 {{PLURAL:$1|revisi|revisi}} akan dipindahkan.",
        "mergehistory-no-source": "Halaman sumber $1 tidak ada.",
        "filerevert-legend": "Batalkan berkas",
        "filerevert-intro": "Anda membatalkan '''[[Media:$1|$1]]''' ke versi [$4 pada $3, $2].",
        "filerevert-comment": "Alasan:",
-       "filerevert-defaultcomment": "Dibatalkan ke versi pada $2, $1",
+       "filerevert-defaultcomment": "Dibatalkan ke versi pada $2, $1 ($3)",
        "filerevert-submit": "Batalkan",
        "filerevert-success": "'''[[Media:$1|$1]]''' telah dibatalkan ke versi [$4 pada $3, $2]",
        "filerevert-badversion": "Tidak ada versi lokal terdahulu dari berkas ini dengan stempel waktu yang dimaksud.",
        "movepagetext": "Menggunakan formulir di bawah ini akan mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul lama akan menjadi halaman pengalihan ke judul baru.\nAnda dapat memperbarui pengalihan yang menuju ke judul asli secara otomatis.\nJika Anda memilih tidak, pastikan untuk memeriksa\n[[Special:DoubleRedirects|pengalihan ganda]] atau [[Special:BrokenRedirects|pengalihan rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terhubung ke tempat seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman pada judul yang baru, kecuali bila halaman peralihan dan tidak mempunyai sejarah penyuntingan. \nIni berarti Anda dapat mengubah kembali nama halaman seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nIni dapat mengakibatkan perubahan drastis dan tak terduga bagi halaman yang populer; pastikan Anda mengerti konsekuensinya sebelum melanjutkan.",
        "movepagetext-noredirectfixer": "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
        "movepagetalktext": "Halaman pembicaraan yang berkaitan juga akan dipindahkan secara otomatis '''kecuali apabila:'''\n\n*Sebuah halaman pembicaraan yang tidak kosong telah ada di bawah judul baru, atau\n*Anda tidak memberi tanda cek pada kotak di bawah ini\n\nDalam kasus tersebut, apabila diinginkan, Anda dapat memindahkan atau menggabungkan halaman secara manual.",
-       "movearticle": "Pindahkan halaman:",
        "moveuserpage-warning": "'''Peringatan:''' Anda tengah memindahkan halaman pengguna. Perlu diketahui bahwa hanya halaman yang akan dipindahkan namun pengguna ''tidak akan'' berganti nama.",
        "movecategorypage-warning": "<strong>Peringatan:</strong> Anda akan memindahkan halaman kategori. Perlu diketahui bahwa hanya halaman yang akan dipindahkan dan setiap halaman dalam kategori lama <em>tidak</em> akan dikategorikan ulang ke yang baru.",
        "movenologintext": "Anda harus menjadi pengguna terdaftar dan telah [[Special:UserLogin|masuk log]] untuk dapat memindahkan suatu halaman.",
        "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
        "api-error-badtoken": "Kesalahan internal: token buruk.",
        "api-error-copyuploaddisabled": "Mengunggah melalui URL dilarang pada peladen ini.",
-       "api-error-duplicate": "Sudah ada {{PLURAL:$1|[$2 berkas lain]}} dengan konten yang sama di situs ini.",
-       "api-error-duplicate-archive": "Ada {{PLURAL:$1|[$2 berkas]}} lain di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Berkas|Berkas-berkas}} duplikat yang telah dihapus.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Berkas}} duplikat.",
+       "api-error-duplicate": "Sudah ada {{PLURAL:$1|berkas lain}} dengan konten yang sama di situs ini.",
+       "api-error-duplicate-archive": "Ada {{PLURAL:$1|berkas}} lain di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
        "api-error-empty-file": "Berkas yang Anda kirim kosong.",
        "api-error-emptypage": "Pembuatan halaman baru yang kosong tidak diizinkan.",
        "api-error-fetchfileerror": "Kesalahan internal: terjadi kesalahan saat memperoleh berkas ini.",
index 63fd383..54ec142 100644 (file)
        "nstab-template": "Plantilia",
        "nstab-help": "Panid ti tulong",
        "nstab-category": "Kategoria",
+       "mainpage-nstab": "Umuna a Panid",
        "nosuchaction": "Awan ti kasta nga aramid",
        "nosuchactiontext": "Ti aramid a nainaganan babaen ti URL ket imbalido.\nMabalin a madi ti naimakiniliam nga URL, wenno sinurotmo ti saan a nasayaat a silpo.\nMabalinmo pay nga ibaga ti parikut ti sopwer nga us-usaren babaen ti {{SITENAME}}.",
        "nosuchspecialpage": "Awan ti kasta nga espesial a panid",
        "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 sabali a pakabilangan",
+       "createacct-another-submit": "Agpartuat iti pakabilangan",
        "createacct-benefit-heading": "Ti {{SITENAME}} ket inar-aramid babaen ti tattao a kasla kenka.",
        "createacct-benefit-body1": "{{PLURAL:$1|nga inurnos|nga inur-urnos}}",
        "createacct-benefit-body2": "{{PLURAL:$1|a panid|a pampanid}}",
        "createacct-benefit-body3": "nga agdama a {{PLURAL:$1|nagparawad|nagparparawad}}",
        "badretype": "Saan nga agpada dagiti inkabilmo a kontrasenias.",
+       "usernameinprogress": "Ti maysa a panagpartuat iti pakabilangan para iti daytoy a nagan ti agar-aramat ket agdama a maar-aramid. Pangngaasi nga aguray.",
        "userexists": "Maus-usaren ti inkabilmo a nagan.\nPangngaasi nga agpilika iti sabali a nagan.",
        "loginerror": "Biddut ti iseserrek",
        "createacct-error": "Biddut ti panagpartuat iti pakabilangan",
        "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-text": "Kompletuen daytoy a porma ti panagsukat ti esurat a pagtaengam. Nasken nga ikabilmo ti kontrasenias tapno mapasingkedan daytoy a panagsukat.",
+       "changeemail-text": "Kompletuen daytoy a porma ti panagsukat ti adres ti esuratmo. Masapulmonto nga ikabil ti kontraseniasmo tapno mapasingkedan daytoy a panagsukat. No kayatmo nga ikkaten ti pannakainaig iti ania man nga adres ti esurat manipud iti pakabilangam, ibati a blanko ti adres ti esurat intono ited ti porma.",
        "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-password": "Ti bukodmo a kontrasenias ti {{SITENAME}}:",
        "changeemail-submit": "Sukatan ti esurat",
        "changeemail-throttled": "Adu unay ti panagpadasmo a sumrek.\nPangngaasi nga aguray ti $1 sakbay a padasen manen.",
+       "changeemail-nochange": "Pangngaasi nga agikabil iti sabali a baro nga adres ti esurat.",
        "resettokens": "Isaad manen dagiti tandaan",
        "resettokens-text": "Mabalinmo nga isaad manen dagiti tandaan a mangpalubos ti panagserrek ti naisangayan a pribado datos a mainaig ti pakabilangam ditoy.\n\nAramidem daytoy no aksidente nga inbingaymo dagitoy iti sabali wenno ti pakabilangam ket nakomprimiso.",
        "resettokens-no-tokens": "Awan dagiti maisaad manen a tandaan.",
        "permissionserrorstext-withaction": "Awan ti pammalubosmo nga $2, gapu ti sumaganad a {{PLURAL:$1|rason|rasrason}}:",
        "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.",
        "log-fulllog": "Kitaem ti napno a listaan",
        "edit-hook-aborted": "Ti panagurnos ket pinasardeng babaen ti kawit.\nAwan ti intedna a palawag.",
        "edit-gone-missing": "Saan a mapabaro daytoy a panid.\nKasla met naikkaten.",
        "mergehistory-go": "Ipakita dagiti mabalin a maitipon a panagurnos",
        "mergehistory-submit": "Pagtitiponen dagiti rebision",
        "mergehistory-empty": "Awan dagiti rebision ti mabalin nga itipon.",
-       "mergehistory-success": "$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 nagballigi a naitipon 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.",
        "rows": "Ar-aray:",
        "columns": "Dagiti batong:",
        "searchresultshead": "Biruken",
-       "stub-threshold": "Pagpatinggaan para iti panagpormat iti <a href=\"#\" class=\"stub\">pungol a silpo</a> (dagiti byte):",
+       "stub-threshold": "Pagpatinggaan para iti panagpormat iti silpo ti pungol ($1):",
+       "stub-threshold-sample-link": "wadan",
        "stub-threshold-disabled": "Nabaldado",
        "recentchangesdays": "Al-aldaw nga ipakita iti kaudian a balbaliw:",
        "recentchangesdays-max": "Kapaut nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}",
        "group-bot": "Dagiti bot",
        "group-sysop": "Dagiti administrador",
        "group-bureaucrat": "Dagiti burokrata",
-       "group-suppress": "Pakapansin",
+       "group-suppress": "Dagiti agilaplapped",
        "group-all": "(amin)",
        "group-user-member": "{{GENDER:$1|agar-aramat}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatiko a napasingkedan nga agar-aramat}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrador}}",
        "group-bureaucrat-member": "{{GENDER:$1|burokrata}}",
-       "group-suppress-member": "{{GENDER:$1|pagpansin}}",
+       "group-suppress-member": "{{GENDER:$1|agilaplapped}}",
        "grouppage-user": "{{ns:project}}:Dagiti agar-aramat",
        "grouppage-autoconfirmed": "{{ns:project}}:Dagiti automatiko a napasingkedan nga agar-aramat",
        "grouppage-bot": "{{ns:project}}:Dagiti bot",
        "grouppage-sysop": "{{ns:project}}:Dagiti administrador",
        "grouppage-bureaucrat": "{{ns:project}}:Dagiti burokrata",
-       "grouppage-suppress": "{{ns:project}}:Pagpansin",
+       "grouppage-suppress": "{{ns:project}}:Ilapped",
        "right-read": "Basaen dagiti panid",
        "right-edit": "Agurnos kadagiti panid",
        "right-createpage": "Agpartuat kadagiti panid (saan a pagtutungtongan a pampanid)",
        "recentchangeslinked-summary": "Daytoy ket listaan dagiti kaudian a sinukatan kadagiti pampanid a nakasilpo manipud iti naisangayan a panid (wenno kadagiti kameng ti maysa a nainaganan a kategoria).\nDagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket dagiti <strong>napuskol</strong>.",
        "recentchangeslinked-page": "Nagan ti panid:",
        "recentchangeslinked-to": "Ipakita dagiti sinukatan kadagiti panid nga imbes a naisilpo iti naited a panid",
+       "recentchanges-page-added-to-category": "nainayon ti [[:$1]] iti kategoria",
+       "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",
        "upload": "Agikarga iti papeles",
        "uploadbtn": "Agikarga iti papeles",
        "reuploaddesc": "Ukasen ti panagikarga ken agsubli idiay porma ti panagikarga",
        "upload-http-error": "Adda napasamak a biddut ti HTTP: $1",
        "upload-copy-upload-invalid-domain": "Dagiti kopia a panagikarga ket saan a magun-od manipud iti daytoy a dominio.",
        "upload-dialog-title": "Agikarga iti papeles",
-       "upload-dialog-error": "Adda napasamak a biddut",
-       "upload-dialog-warning": "Adda napasamak a ballaag",
        "upload-dialog-button-cancel": "Ukasen",
        "upload-dialog-button-done": "Nalpasen",
        "upload-dialog-button-save": "Idulin",
        "upload-dialog-button-upload": "Agikarga",
-       "upload-dialog-label-select-file": "Pilien ti papeles",
-       "upload-dialog-label-infoform-title": "Dagiti salaysay",
-       "upload-dialog-label-infoform-name": "Nagan",
-       "upload-dialog-label-infoform-description": "Deskripsion",
-       "upload-dialog-label-usage-title": "Panagusar",
-       "upload-dialog-label-usage-filename": "Nagan ti papeles",
+       "upload-process-error": "Adda napasamak a biddut",
+       "upload-process-warning": "Adda napasamak a ballaag",
+       "upload-form-label-select-file": "Pilien ti papeles",
+       "upload-form-label-infoform-title": "Dagiti salaysay",
+       "upload-form-label-infoform-name": "Nagan",
+       "upload-form-label-infoform-description": "Deskripsion",
+       "upload-form-label-usage-title": "Panagusar",
+       "upload-form-label-usage-filename": "Nagan ti papeles",
        "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.",
        "filerevert-legend": "Isubli ti papeles",
        "filerevert-intro": "Mangrugrugika nga agipasubli ti papeles ti <strong>[[Media:$1|$1]]</strong> iti [$4 bersion manipud idi $3, $2].",
        "filerevert-comment": "Rason:",
-       "filerevert-defaultcomment": "Naisubli iti bersion manipud idi $2, $1",
+       "filerevert-defaultcomment": "Naisubli iti bersion manipud idi $2, $1 ($3)",
        "filerevert-submit": "Isubli",
        "filerevert-success": "Ti <strong>[[Media:$1|$1]]</strong> ket naipasubli iti [$4 bersion manipud idi $3, $2].",
        "filerevert-badversion": "Awan ti dati a lokal a bersion iti daytoy a papeles a naited ti dayta nga oras ken petsa.",
        "nopagetext": "Awan ti puntaan a panid a nainaganam.",
        "pager-newer-n": "{{PLURAL:$1|nabarbaro a 1|nabarbaro a $1}}",
        "pager-older-n": "{{PLURAL:$1|nadadaan a 1|nadadaan a $1}}",
-       "suppress": "Pakapansin",
+       "suppress": "Ilapped",
        "querypage-disabled": "Daytoy nga espesial a panid ket nabaldado gapu kadagiti rason ti kasayaat ti panagpataray.",
        "apihelp": "Tulong ti API",
        "apihelp-no-such-module": "Saan a nabirukan ti modulo ti \"$1\".",
        "booksources-text": "Dita baba ket listaan dagiti silpo ti sabali a sitio nga aglaklako ti baro ken saan a nausar a liblibro, ken mabalin nga addaan pay iti adu a pakaammo a maipanggep kadagiti libro a birbirukem:",
        "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud ti kasisigud a taudan.",
        "specialloguserlabel": "Nangitungpal:",
-       "speciallogtitlelabel": "Puntaan (titulo wenno agar-aramat):",
+       "speciallogtitlelabel": "Puntaan (titulo wenno {{ns:user}}:nagan ti agar-aramat para iti agar-aramat):",
        "log": "Dagiti listaan",
        "all-logs-page": "Amin a listaan a publiko",
        "alllogstext": "Naikaykaysa a panagiparang kadagiti amin a magun-od a listaan iti {{SITENAME}}.\nMapabassitmo ti panagkita babaen ti panagpili ti kita ti listaan, ti nagan ti agar-aramat (sensitibo ti kadakkel ti letra), wenno ti naapektaran a panid (sensitibo pay ti kadakkel ti letra).",
        "emailccsubject": "Kopia ti mensahem kenni $1: $2",
        "emailsent": "Naipatuloden ti esurat",
        "emailsenttext": "Naipatuloden ti esurat a mensahem.",
-       "emailuserfooter": "Daytoy nga esurat ket impatulod babaen ni $1 kenni $2 iti \"{{int:emailuser}}\" nga annong iti {{SITENAME}}",
+       "emailuserfooter": "Daytoy nga esurat ket {{GENDER:$1|impatulod}} babaen ni $1 kenni {{GENDER:$2|$2}} babaen ti \"{{int:emailuser}}\" nga annong iti {{SITENAME}}",
        "usermessage-summary": "Pumanpanaw iti mesahe ti sistema.",
        "usermessage-editor": "Mensahero ti sistema",
        "watchlist": "Bambantayan",
        "deletepage": "Ikkaten ti panid",
        "confirm": "Pasingkedan",
        "excontent": "ti linaon idi ket: '$1'",
-       "excontentauthor": "ti linaonna idi ket: \"$1\" (ken ti laeng kontributor idi ket ni \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "\n\nti linaon idi ket: \"$1\", ken ti laeng kontributor idi ket ni \"[[Special:Contributions/$2|$2]]\"([[User talk:$2|tungtungan]])",
        "exbeforeblank": "ti linaon sakbay idi nablanko ket: \"$1\"",
        "delete-confirm": "Ikkaten ti \"$1\"",
        "delete-legend": "Ikkaten",
        "movepagetext": "Ti panagusar ti porma dita baba, ket mangnagan manen ti panid, a mangiyalis amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin a baw-ing a panid iti baro a titulo.\nMapabarom a kas automatiko dagiti baw-ing a nakatudo dita kasisigud a titulo.\nNo agpilika a saanmo a kayat, siguraduem a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRenbbengmo ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addan sigud a panid iti baro a titulo, malaksid no ti kinaudi ket maysa a baw-ing ken awan ti napalabas a pakasaritaan ti panag-urnos. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saan mo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Ballaag!</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim a pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
        "movepagetext-noredirectfixer": "Ti panagusar ti kinabuklan dita baba, ket panaganan ti panid, iyalisna amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin baw-ing a panid idiay baro a titulo.\nPasaruduam a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRebbengem ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addan sigud a panid iti baro a titulo, malaksid no awan linaonna wenno no maysa a baw-ing a panid ken awan ti panagbaliw iti pakasaritaan ti napalabas. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saanmo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Ballaag!</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim ta pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
        "movepagetalktext": "Ti mainaig a tungtungan ti panid ket automatikonto a maiyalis a karamanna <strong>malaksid:</strong>\n*Ti addan ti awan linaon a tungtungan ti panid babaen ti baro a nagan, wenno\n*No ikkatem ti kur-itna ti kahon iti baba.\n\nKadagitoy a kaso, masapul nga iyalis wenno manual nga itiponmo ti panid no kayatmo.",
-       "movearticle": "Iyalis ti panid:",
        "moveuserpage-warning": "<strong>Ballaag:</strong> Mangrugrugika nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti maiyalis ken ti agar-aramat ket <em>saanto</em> a managanan.",
        "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti aniaman a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
        "movenologintext": "Masapul a nakarehistroka nga agar-aramat ken [[Special:UserLogin|nakastrek]] tapno makaiyalis iti panid.",
        "tooltip-ca-nstab-main": "Kitaen ti naglaon a panid",
        "tooltip-ca-nstab-user": "Kitaen ti panid ti agar-aramat",
        "tooltip-ca-nstab-media": "Kitaen ti panid ti midia",
-       "tooltip-ca-nstab-special": "Daytoy ket espesial a panid, saanmo a mismo a maurnos daytoy a panid",
+       "tooltip-ca-nstab-special": "Daytoy ket espesial a panid, ken saan a mabalin a maurnos",
        "tooltip-ca-nstab-project": "Kitaen ti panid ti proyekto",
        "tooltip-ca-nstab-image": "Kitaen ti panid ti papeles",
        "tooltip-ca-nstab-mediawiki": "Kitaen ti mensahe ti sistema",
        "logentry-delete-delete": "{{GENDER:$2|Inikkat}} ni $1 ti panid ti $3",
        "logentry-delete-restore": "Ni $1 ket {{GENDER:$2|insublina}} ti panid ti $3",
        "logentry-delete-event": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4",
-       "logentry-delete-revision": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita  {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4",
+       "logentry-delete-revision": "{{GENDER:$2|Binaliwan}} ni $1 ti panagkita {{PLURAL:$5|ti rebision|dagiti $5 a rebision}} iti panid ti $3: $4",
        "logentry-delete-event-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita ti listaan dagiti pasamak iti $3",
        "logentry-delete-revision-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita dagiti rebision iti panid ti $3",
        "logentry-suppress-delete": "Ni $1 ket {{GENDER:$2|pinasardengna}} ti panid ti $3",
        "revdelete-uname-unhid": "saan a nailemmeng ti nagan ti agar-aramat",
        "revdelete-restricted": "naipakat dagiti panangigawid kadagiti administrador",
        "revdelete-unrestricted": "inikkat dagiti panangigawid para kadagiti administrador",
+       "logentry-block-block": "{{GENDER:$2|Sinerraan}} ni $1 ni {{GENDER:$4|$3}} nga agraman iti panagpaso iti oras iti $5 $6",
+       "logentry-block-unblock": "{{GENDER:$2|Inikkat}} ni $1 ti serra ni {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "{{GENDER:$2|Binaliwan}} ni $1 dagiti saad ti serra para kenni {{GENDER:$4|$3}} nga agraman iti oras a panagpaso iti $5 $6",
+       "logentry-suppress-block": "{{GENDER:$2|Sinerraan}} ni $1 ni {{GENDER:$4|$3}} nga agraman iti oras a panagpaso iti $5 $6",
+       "logentry-suppress-reblock": "{{GENDER:$2|Binaliwan}} ni $1 dagiti saad ti serra para kenni {{GENDER:$4|$3}} nga agraman iti oras a panagpaso iti $5 $6",
+       "logentry-import-upload": "{{GENDER:$2|Nangala}} ni $1 ti $3 babaen ti panangikarga ti papeles",
+       "logentry-import-interwiki": "{{GENDER:$2|Nangala}} ni $1 ti $3 manipud iti sabali a wiki",
        "logentry-merge-merge": "Ni $1 ket {{GENDER:$2|intiponna}} ti $3 iti $4 (kadagiti rebision aginggana iti $5)",
        "logentry-move-move": "{{GENDER:$2|Inyalis}} ni $1 ti panid ti $3 iti $4",
        "logentry-move-move-noredirect": "{{GENDER:$2|Inyalis}} ni $1 ti panid ti $3 iti $4 a saan a nangibati ti baw-ing",
        "logentry-newusers-create2": "Ti pakabilangan ti agar-aramat $3 ket {{GENDER:$2|napartuat}} idi babaen ni $1",
        "logentry-newusers-byemail": "Ti pakabilangan a $3 ket {{GENDER:$2|pinartuat}} idi babaen ni $1 ken ti kontrasenias ket naipatulod idi babaen ti esurat",
        "logentry-newusers-autocreate": "Automatiko a {{GENDER:$2|napartuat}} ti pakabilangan ni agar-aramat $1",
+       "logentry-protect-move_prot": "{{GENDER:$2|Inyalis}} ni $1 dagiti saad ti salaknib manipud iti $4 iti $3",
+       "logentry-protect-unprotect": "{{GENDER:$2|Inikkat}} ni $1 ti salaknib manipud iti $3",
+       "logentry-protect-protect": "{{GENDER:$2|Sinalakniban}} ni $1 ti $3 $4",
+       "logentry-protect-protect-cascade": "{{GENDER:$2|Sinalakniban}} ni $1 ti $3 $4 [sariap]",
+       "logentry-protect-modify": "{{GENDER:$2|Binaliwan}} ni $1 ti agpang ti salaknib para iti $3 $4",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Binaliwan}} ni $1 ti agpang ti salaknib para iti $3 $4 [sariap]",
        "logentry-rights-rights": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3 manipud ti $4 iti $5",
        "logentry-rights-rights-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3",
        "logentry-rights-autopromote": "Ni $1 ket automatiko idi a {{GENDER:$2|naipangato}} manipud ti $4 iti $5",
        "api-error-badaccess-groups": "Saanka mapalubosan nga agikarga kadagiti papeles iti daytoy a wiki.",
        "api-error-badtoken": "Akin-uneg a biddut: Dakes a tandaan.",
        "api-error-copyuploaddisabled": "Ti panagikarga babaen ti URL ket nabaldado iti daytoy server.",
-       "api-error-duplicate": "Adda {{PLURAL:$1|ket [$2 a sabali a papeles] |dagiti [$2 sabsabali a papeles]}} nga addaan ditoy a sitio nga agpada ti linaon.",
-       "api-error-duplicate-archive": "Adda {{PLURAL:$1|idi [$2 sabali a papeles]|dagidi [$2 sabali a papeles]}} nga addaan ditoy a sitio nga agpada ti linaonda, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.",
-       "api-error-duplicate-archive-popup-title": "Duplikado {{PLURAL:$1|ti papeles|dagiti papeles}} a naikkaten.",
-       "api-error-duplicate-popup-title": "Duplikado {{PLURAL:$1|ti papeles|dagiti papeles}}.",
+       "api-error-duplicate": "Adda {{PLURAL:$1|sabali a papeles|dagiti sabali a papeles}} nga addan iti daytoy a sitio nga agraman iti agpada a linaon.",
+       "api-error-duplicate-archive": "Adda {{PLURAL:$1|idi sabali a papeles|dagidi sabali a papeles}} nga addaan ditoy a sitio nga agpada ti linaonda, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.",
        "api-error-empty-file": "Ti papeles nga intedmo ket awan linaon.",
        "api-error-emptypage": "Agparprtuat ti baro, dagiti awan ti linaon a panid ket saan a maipalubos.",
        "api-error-fetchfileerror": "Akin-uneg a biddut: Addaan ti dakes a napasamak bayat nga agal-ala ti papeles.",
index 0f697a9..b78bd11 100644 (file)
@@ -20,7 +20,8 @@
                        "아라",
                        "Macofe",
                        "Sveinn í Felli",
-                       "Jonbg"
+                       "Jonbg",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Undirstrika tengla:",
        "mergehistory-go": "Sýna breytingar sem hægt er að sameina",
        "mergehistory-submit": "Sameina útgáfur",
        "mergehistory-empty": "Engar útgáfur sem hægt er að sameina.",
-       "mergehistory-success": "$3 {{PLURAL:$3|útgáfa|útgáfur}} af [[:$1]] sameinaðar í [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|útgáfa|útgáfur}} af $1 sameinaðar í [[:$2]].",
        "mergehistory-fail": "Gat ekki sameinað breytingasögur. Vinsamlegast athugaðu síðuna og tímabreyturnar.",
        "mergehistory-no-source": "Upprunasíðan $1 er ekki til.",
        "mergehistory-no-destination": "Marksíðan $1 er ekki til.",
        "filerevert-legend": "Taka aftur skrá",
        "filerevert-intro": "Þú ert í þann mund að breyta skránni '''[[Media:$1|$1]]''' aftur til [$4 útgáfu frá $3, $2].",
        "filerevert-comment": "Ástæða:",
-       "filerevert-defaultcomment": "Breytt til útgáfu $2 $1",
+       "filerevert-defaultcomment": "Breytt til útgáfu $2 $1 ($3)",
        "filerevert-submit": "Taka aftur",
        "filerevert-success": "'''[[Media:$1|$1]]''' var breytt aftur til [$4 útgáfu frá $3, $2].",
        "filerevert-badversion": "Það er ekki til nein fyrri staðbundin útgáfa af þessari skrá með þessum tímastimpli.",
        "movepagetext": "Hér er hægt að endurnefna síðu. Hún færist, ásamt breytingaskránni, yfir á nýtt heiti og eldra heitið myndar tilvísun á það. Þú getur sjálfkrafa uppfært tilvísanir á nýja heitið. Ef þú vilt það síður, athugaðu þá hvort nokkuð myndist [[Special:DoubleRedirects|tvöfaldar]] eða [[Special:BrokenRedirects|brotnar tilvísanir]].\nÞú berð ábyrgð á því að tenglar vísi á rétta staði.\n\nAthugaðu að síðan mun '''ekki''' færast ef þegar er síða á nafninu sem þú hyggst færa hana á, nema sú síða sé tóm eða tilvísun sem vísar á síðuna sem þú ætlar að færa. Þú getur þar með fært síðuna aftur til baka án þess að missa breytingarsöguna, en ekki fært hana yfir venjulega síðu.\n\n'''Varúð:'''\nAthugaðu að þessi aðgerð getur kallað fram viðbrögð annarra notenda og getur þýtt mjög rótækar breytingar á vinsælum síðum.",
        "movepagetext-noredirectfixer": "Með þessu eyðublaði er hægt að endurnefna síðu og færa alla breytingarskrá hennar á nýja nafnið. Gamli titillinn verður að tilvísun á nýja titilinn. \nAthugaðu hvort síðan tengist [[Special:DoubleRedirects|tvöfaldri]]- eða [[Special:BrokenRedirects|brotinni]] tilvísun.\nÞú berð ábyrgð á því að tenglarnir haldi áfram að tengjast á réttan stað.\n\nAthugaðu að síðan verður '''ekki''' færð ef síða er þegar til á nýja titlinum, nema hann sé annaðhvort tómur, tilvísun eða hafi enga breytingarskrá.\nÞetta merkir að þú getur fært síðu aftur til baka á þann stað sem hún var færð frá ef þú gerir mistök og þú getur ekki skrifað yfir síðu sem er þegar til.\n\n'''Varúð:'''\nEf síðan er vinsæl þá getur þessi aðgerð kallað fram viðbrögð annara notenda og getur þýtt mjög rótækar breytingar á öðrum síðum. Vertu viss um að þú skiljir hættuna áður en þú heldur áfram.",
        "movepagetalktext": "Spallsíða síðunnar verður sjálfkrafa færð með ef hún er til nema:\n* Þú sért að færa síðuna á milli nafnrýma\n* Spallsíða sé þegar til undir nýja nafninu\n* Þú veljir að færa hana ekki\nÍ þeim tilfellum verður að færa hana handvirkt.",
-       "movearticle": "Færa síðu:",
        "moveuserpage-warning": "'''Viðvörun:''' Þú ert í þann mund að færa notendasíðu. Athugaðu aðeins síðan verður færð og notendanafni hans verður '''ekki''' breytt.",
        "movenologintext": "Þú verður að vera [[Special:UserLogin|innskráð(ur)]] til að geta fært síður.",
        "movenotallowed": "Þú hefur ekki leyfi til að færa síður.",
        "api-error-badaccess-groups": "Þú hefur ekki leyfi til að hlaða inn skrám.",
        "api-error-badtoken": "Innri villa: Skemmdur tóki.",
        "api-error-copyuploaddisabled": "Ekki er hægt að hlaða upp með vefslóð á þessum vefþjón.",
-       "api-error-duplicate": "Það {{PLURAL:$1|er [$2 önnur skrá]|eru [$2 aðrar skrár]}} þegar til á vefsvæðinu sem hafa sama innihald.",
-       "api-error-duplicate-archive": "Það {{PLURAL:$1|var [$2 önnur skrá]|voru [$2 aðrar skrár]}} þegar á síðunni með sama innihald, en {{PLURAL:$1|henni|þeim}} var eytt.",
-       "api-error-duplicate-archive-popup-title": "Eins {{PLURAL:$1|skrá|skrár}} sem {{PLURAL:$1|hefur|hafa}} þegar verið eytt.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Afrituð skrá|Afritaðar skrár}}",
+       "api-error-duplicate": "Það {{PLURAL:$1|er önnur skrá|eru aðrar skrár}} þegar til á vefsvæðinu sem hafa sama innihald.",
+       "api-error-duplicate-archive": "Það {{PLURAL:$1|var önnur skrá|voru aðrar skrár}} þegar á síðunni með sama innihald, en {{PLURAL:$1|henni|þeim}} var eytt.",
        "api-error-empty-file": "Skráin sem þú valdir er tóm.",
        "api-error-emptypage": "Stofnun nýrra, tómra síðna er óheimil.",
        "api-error-fetchfileerror": "Innri villa: Mistókst að sækja skránna.",
index bc3d1bc..d01dc9a 100644 (file)
@@ -90,7 +90,8 @@
                        "Aquatech",
                        "Statix64",
                        "CassiodoroVicinetti",
-                       "Bultro"
+                       "Bultro",
+                       "Oggioniale"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "nstab-template": "Template",
        "nstab-help": "Aiuto",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pagina principale",
        "nosuchaction": "Operazione non riconosciuta",
        "nosuchactiontext": "L'azione specificata nella URL non è valida.\nÈ possibile che la URL sia stata digitata in modo errato o che sia stato seguito un collegamento non valido.\nCiò potrebbe anche indicare un bug in {{SITENAME}}.",
        "nosuchspecialpage": "Pagina speciale non disponibile",
        "viewsource": "Visualizza wikitesto",
        "viewsource-title": "Visualizza wikitesto di $1",
        "actionthrottled": "Azione ritardata",
-       "actionthrottledtext": "Come misura di sicurezza contro lo spam, l'esecuzione di alcune azioni è limitata a un numero massimo di volte in un determinato periodo di tempo, limite che in questo caso è stato superato. Si prega di riprovare tra qualche minuto.",
+       "actionthrottledtext": "Come misura di sicurezza contro lo spam, l'esecuzione di alcune azioni è limitata a un numero massimo di volte in un determinato periodo di tempo, limite che tu hai superato. Si prega di riprovare tra qualche minuto.",
        "protectedpagetext": "Questa pagina è stata protetta per impedirne la modifica o altre operazioni.",
        "viewsourcetext": "È possibile visualizzare e copiare il codice sorgente di questa pagina.",
        "viewyourtext": "È possibile visualizzare e copiare il codice sorgente delle <strong>tue modifiche</strong> a questa pagina.",
        "createacct-captcha": "Controllo di sicurezza",
        "createacct-imgcaptcha-ph": "Inserisci il testo che vedi sopra",
        "createacct-submit": "Crea la tua utenza",
-       "createacct-another-submit": "Crea un'altra utenza",
+       "createacct-another-submit": "Crea utenza",
        "createacct-benefit-heading": "{{SITENAME}} cresce grazie a persone come te.",
        "createacct-benefit-body1": "{{PLURAL:$1|modifica|modifiche}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|pagine}}",
        "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-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": "È stata inviata una email di reimpostazione della password.",
+       "passwordreset-emailsent": "Se questo è un indirizzo di posta elettronica registrato per la tua utenza, 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 indirizzo email",
-       "changeemail-text": "Completa questo modulo per cambiare il tuo indirizzo email. Sarà necessario inserire la password per confermare la modifica.",
+       "changeemail": "Modifica o rimuovi indirizzo email",
+       "changeemail-text": "Completa questo modulo per cambiare il tuo indirizzo email. Sarà necessario inserire la password per confermare la modifica. Se vuoi rimuovere l'associazione di qualsiasi indirizzo email dalla tua utenza, lascia il nuovo indirizzo email vuoto quando invii il modulo.",
        "changeemail-no-info": "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
        "changeemail-oldemail": "Indirizzo email attuale:",
        "changeemail-newemail": "Nuovo indirizzo email:",
        "changeemail-password": "La password su {{SITENAME}}:",
        "changeemail-submit": "Modifica email",
        "changeemail-throttled": "Sono stati effettuati troppi tentativi di accesso.\nAttendi $1 e riprova in seguito.",
+       "changeemail-nochange": "Per favore inserisci un nuovo indirizzo e-mail.",
        "resettokens": "Reimposta token",
        "resettokens-text": "Qui puoi reimpostare le chiavi che permettono l'accesso a determinati dati privati associati alla tua utenza.\n\nDovresti farlo se le hai accidentalmente condivise con qualcuno o se la tua utenza è stato compromessa.",
        "resettokens-no-tokens": "Non ci sono token da reimpostare.",
        "permissionserrorstext-withaction": "Non si dispone dei permessi necessari per $2, per {{PLURAL:$1|il seguente motivo|i seguenti motivi}}:",
        "recreate-moveddeleted-warn": "<strong>Attenzione: si sta per ricreare una pagina già cancellata in passato.</strong>\n\nAccertarsi che sia davvero opportuno continuare a modificare questa pagina.\nL'elenco delle relative cancellazioni e degli spostamenti viene riportato di seguito per comodità:",
        "moveddeleted-notice": "Questa pagina è stata cancellata. L'elenco delle relative cancellazioni e degli spostamenti viene riportato di seguito per informazione.",
+       "moveddeleted-notice-recent": "Spiacenti, questa pagina è stata cancellata recentemente (nelle ultime 24 ore).\n\nLe azioni di cancellazione e spostamento per questa pagina sono disponibili di seguito per completezza.",
        "log-fulllog": "Visualizza log completo",
        "edit-hook-aborted": "La modifica è stata annullata dall'hook.\nNon è stata restituita alcuna spiegazione.",
        "edit-gone-missing": "Impossibile aggiornare la pagina.\nSembra che sia stata cancellata.",
        "mergehistory-go": "Mostra le modifiche che possono essere unite",
        "mergehistory-submit": "Unisci le versioni",
        "mergehistory-empty": "Nessuna versione da unire.",
-       "mergehistory-success": "{{PLURAL:$3|Una versione di [[:$1]] è stata unita|$3 versioni di [[:$1]] sono state unite}} alla cronologia di [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Una versione di $1 è stata unita|$3 versioni di $1 sono state unite}} alla cronologia di [[:$2]].",
        "mergehistory-fail": "Impossibile unire le cronologie. Verificare la pagina e i parametri temporali.",
        "mergehistory-fail-toobig": "Impossibile eseguire l'unione della cronologia essendoci oltre $1 {{PLURAL:$1|versione|versioni}} da spostare.",
        "mergehistory-no-source": "La pagina di origine $1 non esiste.",
        "search-category": "(categoria $1)",
        "search-file-match": "(corrispondenza nel contenuto del file)",
        "search-suggest": "Forse cercavi: $1",
-       "search-rewritten": "Mostrando i risultati per $1. Cerca invece per $2.",
+       "search-rewritten": "Mostro i risultati per $1. Altrimenti, cerca $2.",
        "search-interwiki-caption": "Progetti fratelli",
        "search-interwiki-default": "Risultati da $1:",
        "search-interwiki-more": "(altro)",
        "prefs-watchlist-token": "Token osservati speciali:",
        "prefs-misc": "Varie",
        "prefs-resetpass": "Cambia password",
-       "prefs-changeemail": "Modifica email",
+       "prefs-changeemail": "Modifica o rimuovi indirizzo email",
        "prefs-setemail": "Imposta un indirizzo email",
        "prefs-email": "Opzioni email",
        "prefs-rendering": "Aspetto",
        "group-bot": "Bot",
        "group-sysop": "Amministratori",
        "group-bureaucrat": "Burocrati",
-       "group-suppress": "Oversight",
+       "group-suppress": "Soppressori",
        "group-all": "(tutti)",
        "group-user-member": "{{GENDER:$1|utente}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utente autoconvalidato|utente autoconvalidata|utente autoconvalidato/a}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|amministratore|amministratrice|amministratore/trice}}",
        "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
-       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "group-suppress-member": "{{GENDER:$1|soppressore|sopprimitrice}}",
        "grouppage-user": "{{ns:project}}:Utenti",
        "grouppage-autoconfirmed": "{{ns:project}}:Utenti autoconvalidati",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Amministratori",
        "grouppage-bureaucrat": "{{ns:project}}:Burocrati",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "grouppage-suppress": "{{ns:project}}:Soppressori",
        "right-read": "Legge pagine",
        "right-edit": "Modifica pagine",
        "right-createpage": "Crea pagine (escluse le pagine di discussione)",
        "recentchangeslinked-summary": "Questa pagina speciale mostra le modifiche più recenti alle pagine collegate da quella specificata (o contenute nella categoria specificata).\nLe pagine contenute nella propria lista degli [[Special:Watchlist|Osservati speciali]] sono evidenziate in <strong>grassetto</strong>.",
        "recentchangeslinked-page": "Nome della pagina:",
        "recentchangeslinked-to": "Mostra solo le modifiche alle pagine collegate a quella specificata",
+       "recentchanges-page-added-to-category": "[[:$1]] aggiunto alla categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|una pagina è aggiunta|$2 pagine sono aggiunte}} alla categoria",
+       "recentchanges-page-removed-from-category": "[[:$1]] rimosso dalla categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|una pagina è rimossa|$2 pagine sono rimosse}} dalla categoria",
+       "autochange-username": "Modifica automatica MediaWiki",
        "upload": "Carica un file",
        "uploadbtn": "Carica",
        "reuploaddesc": "Torna al modulo per il caricamento.",
        "upload-options": "Opzioni di caricamento",
        "watchthisupload": "Aggiungi agli osservati speciali",
        "filewasdeleted": "Un file con questo nome è stato già caricato e cancellato in passato. Verificare il log delle $1 prima di caricarlo di nuovo.",
+       "filename-thumb-name": "Questo sembra essere il titolo di una miniatura. Non caricare le miniature sulla stessa wiki. Oppure, modifica il nome del file in modo che sia più significativo e non abbia il prefisso della miniatura.",
        "filename-bad-prefix": "Il nome del file che si sta caricando inizia con '''\"$1\"''', che è un nome generico simile a quelli assegnati automaticamente dalle fotocamere digitali. Si prega di scegliere un nome più descrittivo per il file.",
        "filename-prefix-blacklist": " #<!-- lascia questa riga esattamente com'è --> <pre>\n# La sintassi è la seguente:\n#   * Tutto ciò che segue il carattere \"#\" sino alla fine della riga è un commento\n#   * Ogni riga non vuota è un prefisso per nomi di file tipici assegnati automaticamente da fotocamere digitali\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alcuni telefonini\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- lascia questa riga esattamente com'è -->",
        "upload-success-subj": "Caricamento completato",
        "upload-http-error": "Si è verificato un errore HTTP: $1",
        "upload-copy-upload-invalid-domain": "Non è consentito il caricamento di copie da questo dominio.",
        "upload-dialog-title": "Carica file",
-       "upload-dialog-error": "Si è verificato un errore",
-       "upload-dialog-warning": "Si è verificato un avviso",
        "upload-dialog-button-cancel": "Annulla",
        "upload-dialog-button-done": "Fatto",
        "upload-dialog-button-save": "Salva",
        "upload-dialog-button-upload": "Carica",
-       "upload-dialog-label-select-file": "Seleziona file",
-       "upload-dialog-label-infoform-title": "Dettagli",
-       "upload-dialog-label-infoform-name": "Nome",
-       "upload-dialog-label-infoform-description": "Descrizione",
-       "upload-dialog-label-usage-title": "Utilizzo",
-       "upload-dialog-label-usage-filename": "Nome del file",
+       "upload-process-error": "Si è verificato un errore",
+       "upload-process-warning": "Si è verificato un avviso",
+       "upload-form-label-select-file": "Seleziona file",
+       "upload-form-label-infoform-title": "Dettagli",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrizione",
+       "upload-form-label-usage-title": "Utilizzo",
+       "upload-form-label-usage-filename": "Nome del file",
+       "foreign-structured-upload-form-label-own-work": "Questo è un mio lavoro",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorie",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
        "backend-fail-stream": "Impossibile trasmettere il file $1.",
        "backend-fail-backup": "Impossibile eseguire il backup del file $1 .",
        "backend-fail-notexists": "Il file $1 non esiste.",
        "filerevert-legend": "Ripristina file",
        "filerevert-intro": "Si sta per ripristinare il file '''[[Media:$1|$1]]''' alla [$4 versione del $2, $3].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Ripristinata la versione del $2, $1",
+       "filerevert-defaultcomment": "Ripristinata la versione del $2, $1 ($3)",
        "filerevert-submit": "Ripristina",
        "filerevert-success": "'''Il file [[Media:$1|$1]]''' è stato ripristinato alla [$4 versione del $2, $3].",
        "filerevert-badversion": "Non esistono versioni locali precedenti del file con il timestamp richiesto.",
        "nopagetext": "La pagina richiesta non esiste.",
        "pager-newer-n": "{{PLURAL:$1|1 più recente|$1 più recenti}}",
        "pager-older-n": "{{PLURAL:$1|1 meno recente|$1 meno recenti}}",
-       "suppress": "Oversight",
+       "suppress": "Sopprimi",
        "querypage-disabled": "Questa pagina speciale è disattivata per motivi di prestazioni.",
        "apihelp": "Aiuto API",
        "apihelp-no-such-module": "Modulo \"$1\" non trovato.",
        "emailccsubject": "Copia del messaggio inviato a $1: $2",
        "emailsent": "Messaggio inviato",
        "emailsenttext": "Il messaggio e-mail è stato inviato.",
-       "emailuserfooter": "Questa email è stata inviata da $1 a $2 attraverso la funzione \"{{int:emailuser}}\" su {{SITENAME}}.",
+       "emailuserfooter": "Questa email è stata {{GENDER:$1|inviata}} da $1 a {{GENDER:$2|$2}} attraverso la funzione \"{{int:emailuser}}\" su {{SITENAME}}.",
        "usermessage-summary": "Messaggio di sistema",
        "usermessage-editor": "Messaggero di sistema",
        "usermessage-template": "MediaWiki:MessaggioUtente",
        "deletepage": "Cancella pagina",
        "confirm": "Conferma",
        "excontent": "il contenuto era: '$1'",
-       "excontentauthor": "il contenuto era: '$1' (e l'unico contributore era '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "il contenuto era: '$1', e l'unico contributore era \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|msg]])",
        "exbeforeblank": "Il contenuto prima dello svuotamento era: '$1'",
        "delete-confirm": "Cancella \"$1\"",
        "delete-legend": "Cancella",
        "move-page-legend": "Spostamento di pagina",
        "movepagetext": "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Puoi aggiornare automaticamente i redirect che puntano al titolo originale. Puoi decidere di non farlo, ma ricordati di verificare che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.\n\nSi noti che la pagina '''non''' sarà spostata se ne esiste già una con il nuovo nome, a meno che quest'ultima non sia costituita solo da un redirect alla vecchia e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.\n\n'''ATTENZIONE:'''\nUn cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
        "movepagetext-noredirectfixer": "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Controlla che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.\n\nSi noti che la pagina '''non''' sarà spostata se ne esiste già una con il nuovo nome, a meno che non sia vuota o costituita solo da un redirect alla vecchia e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.\n\n'''ATTENZIONE:'''\nUn cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
-       "movepagetalktext": "La corrispondente pagina di discussione, se esiste, sarà spostata automaticamente insieme alla pagina principale, '''tranne che nei seguenti casi''':\n* lo spostamento della pagina è tra namespace diversi;\n* in corrispondenza del nuovo titolo esiste già una pagina di discussione (non vuota);\n* la casella qui sotto è stata deselezionata.\n\nIn questi casi, se lo si ritiene opportuno, occorre spostare o aggiungere manualmente le informazioni contenute nella pagina di discussione.",
-       "movearticle": "Sposta la pagina:",
+       "movepagetalktext": "Se selezioni questa casella, la corrispondente pagina di discussione sarà spostata automaticamente al nuovo titolo, a meno che esiste già una pagina di discussione non vuota.\n\nIn questi casi, dovrai spostare o unire manualmente la pagina, se lo si ritiene opportuno.",
        "moveuserpage-warning": "'''Attenzione:''' Si sta per spostare una pagina utente. Nota che verrà spostata solamente la pagina. L'utente ''non'' sarà rinominato.",
        "movecategorypage-warning": "<strong>Attenzione:</strong> si sta per spostare una categoria. Solo questa pagina verrà spostata: tutte le pagine nella vecchia categoria <em>non</em> saranno inserite nella nuova.",
        "movenologintext": "Lo spostamento delle pagine è consentito solo agli utenti registrati che hanno eseguito l'[[Special:UserLogin|accesso]] al sito.",
        "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]]\"",
-       "selfmove": "Il titolo di destinazione è uguale a quello di provenienza, non è possibile spostare una pagina su se stessa.",
+       "selfmove": "Il titolo di destinazione è uguale a quello di provenienza, non è possibile spostare una pagina su sé stessa.",
        "immobile-source-namespace": "Non è possibile spostare pagine del namespace \"$1\"",
        "immobile-target-namespace": "Non è possibile spostare pagine nel namespace \"$1\"",
        "immobile-target-namespace-iw": "Un collegamento interwiki non è una destinazione valida per spostare la pagina.",
        "watchlistedit-raw-done": "La lista degli osservati speciali è stata aggiornata.",
        "watchlistedit-raw-added": "{{PLURAL:$1|È stata aggiunta una pagina|Sono state aggiunte $1 pagine}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
-       "watchlistedit-clear-title": "Osservati speciali puliti",
-       "watchlistedit-clear-legend": "Pulisci osservati speciali",
+       "watchlistedit-clear-title": "Lista degli osservati speciali svuotata",
+       "watchlistedit-clear-legend": "Svuota osservati speciali",
        "watchlistedit-clear-explain": "Tutti i titoli saranno rimossi dai tuoi osservati speciali",
        "watchlistedit-clear-titles": "Titoli:",
-       "watchlistedit-clear-submit": "Pulisci gli osservati speciali (sarà permanente!)",
-       "watchlistedit-clear-done": "La lista degli osservati speciali è stata pulita.",
+       "watchlistedit-clear-submit": "Svuota gli osservati speciali (sarà permanente!)",
+       "watchlistedit-clear-done": "La lista degli osservati speciali è stata svuotata.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
        "watchlistedit-too-many": "Ci sono troppe pagine da visualizzare qui.",
-       "watchlisttools-clear": "Pulisci gli osservati speciali",
+       "watchlisttools-clear": "Svuota la lista degli osservati speciali",
        "watchlisttools-view": "Visualizza le modifiche pertinenti",
        "watchlisttools-edit": "Visualizza e modifica la lista degli osservati speciali",
        "watchlisttools-raw": "Modifica la lista in formato testo",
        "logentry-newusers-byemail": "L'utenza $3 è stata {{GENDER:$2|creata}} da $1 e la password è stata inviata via email",
        "logentry-newusers-autocreate": "L'utenza $1 è stata {{GENDER:$2|creata}} automaticamente",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|ha spostato}} le impostazioni di protezione da $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|ha rimosso}} la protezione da $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|ha protetto}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ha protetto}} $3 $4 [ricorsiva]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ha modificato}} il livello di protezione per $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ha modificato}} il livello di protezione per $3 $4 [ricorsiva]",
        "logentry-rights-rights": "$1 {{GENDER:$2|ha modificato}} l'appartenenza di $3 dal gruppo $4 al gruppo $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha modificato}} l'appartenenza a gruppi di $3",
        "logentry-rights-autopromote": "$1 è {{GENDER:$2|stato promosso|stata promossa|stato/a promosso/a}} automaticamente da $4 a $5",
        "api-error-badaccess-groups": "Non sei autorizzato a caricare documenti su questa wiki.",
        "api-error-badtoken": "Errore interno: token errato.",
        "api-error-copyuploaddisabled": "Il caricamento tramite URL è disabilitato su questo server.",
-       "api-error-duplicate": "Sul sito {{PLURAL:$1|c'è già [$2 un altro documento]|ci sono già [$2 altri documenti]}} con lo stesso contenuto.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|C'era [$2 un altro file]|C'erano [$2 altri file]}} già nel sito con lo stesso contenuto, ma {{PLURAL:$1|è stato cancellato|sono stati cancellati}}.",
-       "api-error-duplicate-archive-popup-title": "File duplicat{{PLURAL:$1|o che è già stato cancellato|i che sono già stati cancellati}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|documento duplicato|documenti duplicati}}",
+       "api-error-duplicate": "Sul sito {{PLURAL:$1|c'è già un altro documento|ci sono già altri documenti}} con lo stesso contenuto.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|C'era un altro file|C'erano altri file}} già nel sito con lo stesso contenuto, ma {{PLURAL:$1|è stato cancellato|sono stati cancellati}}.",
        "api-error-empty-file": "Il file selezionato era vuoto.",
        "api-error-emptypage": "La creazione di nuove pagine vuote non è consentita.",
        "api-error-fetchfileerror": "Errore interno: c'è stato un problema durante il recupero del documento.",
index 8939be7..f82502a 100644 (file)
        "nstab-template": "テンプレート",
        "nstab-help": "ヘルプページ",
        "nstab-category": "カテゴリ",
+       "mainpage-nstab": "メインページ",
        "nosuchaction": "そのような操作はありません",
        "nosuchactiontext": "この URL で指定された操作は正しくありません。\nURL を間違って入力したか、正しくないリンクをたどった可能性があります。\n{{SITENAME}}が利用するソフトウェアのバグの可能性もあります。",
        "nosuchspecialpage": "そのような特別ページはありません",
        "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|ページ}}",
        "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": "ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89å\86\8d設å®\9aã\83¡ã\83¼ã\83«ã\82\92ã\81\8aé\80\81ã\82\8aã\81\97ã\81¾ã\81\97ã\81\9f。",
+       "passwordreset-emailsent": "ã\82\82ã\81\97ã\80\81ã\81\93ã\82\8cã\81\8cã\81\82ã\81ªã\81\9fã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®ã\81\9fã\82\81ã\81«ç\99»é\8c²ã\81\95ã\82\8cã\81\9fã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81§ã\81\82ã\82\8bå ´å\90\88ã\80\81ã\81\93ã\82\8cã\81\8bã\82\89ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\83ªã\82»ã\83\83ã\83\88ã\81®ã\83¡ã\83¼ã\83«ã\81\8cé\80\81ä¿¡ã\81\95ã\82\8cã\81¾ã\81\99。",
        "passwordreset-emailsent-capture": "下記の内容の、パスワード再設定メールをお送りしました。",
        "passwordreset-emailerror-capture": "以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1",
-       "changeemail": "ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81®å¤\89æ\9b´",
-       "changeemail-text": "このフォームではメールアドレスを変更できます。この変更を確認するためにパスワードを入力する必要があります。",
+       "changeemail": "ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92å¤\89æ\9b´ã\81¾ã\81\9fã\81¯é\99¤å\8e»",
+       "changeemail-text": "このフォームではメールアドレスを変更できます。この変更を確認するためにパスワードを入力する必要があります。あなたのアカウントから任意のメールアドレスの関連付けを削除したい場合は、フォームを投稿する際に新しい電子メールアドレスを空白のままにします。",
        "changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "changeemail-oldemail": "現在のメールアドレス:",
        "changeemail-newemail": "新しいメールアドレス:",
+       "changeemail-newemail-help": "あなたのメールアドレスを削除したい場合は、このフィールドを空白のままにする必要があります。あなたは忘れてしまったパスワードをリセットすることができず、また、電子メールアドレスが削除された場合は、このウィキからのメールを受信しません。",
        "changeemail-none": "(なし)",
        "changeemail-password": "{{SITENAME}}のパスワード:",
        "changeemail-submit": "メールアドレスを変更",
        "savearticle": "ページを保存",
        "preview": "プレビュー",
        "showpreview": "プレビューを表示",
-       "showdiff": "å¤\89æ\9b´を表示",
+       "showdiff": "å·®å\88\86を表示",
        "blankarticle": "<strong>警告:</strong>作成しようとしているページの内容がありません。{{Int:savearticle}}\"をもう一度クリックすると、中身の無いページが作成されます。",
        "anoneditwarning": "<strong>警告:</strong> ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。<strong>[$1 ログイン]</strong>または<strong>[$2 アカウントを作成]</strong>すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。",
        "anonpreviewwarning": "<em>ログインしていません。投稿を保存すると、ご使用中のIPアドレスがこのページの履歴に記録されます。</em>",
        "permissionserrorstext-withaction": "あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "recreate-moveddeleted-warn": "<strong>警告: 以前削除されたページを再作成しようとしています。</strong>\n\nこのページの編集を続行するのが適切かどうかご確認ください。\n参考までに、このページの削除と移動の記録を以下に示します:",
        "moveddeleted-notice": "このページは削除されています。\n参考のため、このページの削除と移動の記録を以下に表示します。",
+       "moveddeleted-notice-recent": "ごめんなさい、このページは最近に削除されました (過去24時間以内)。このページについての削除と移動のログが、参考のため、以下にて提供されています。",
        "log-fulllog": "完全な記録を閲覧",
        "edit-hook-aborted": "フックによって編集が破棄されました。\n理由は不明です。",
        "edit-gone-missing": "ページを更新できませんでした。\n既に削除されているようです。",
        "mergehistory-go": "統合できる版を表示",
        "mergehistory-submit": "版を統合",
        "mergehistory-empty": "統合できる版がありません。",
-       "mergehistory-success": "[[:$1]]の $3 {{PLURAL:$3|版}}を[[:$2]]に統合しました。",
+       "mergehistory-done": "$1の $3 {{PLURAL:$3|版}}は[[:$2]]に統合されました。",
        "mergehistory-fail": "履歴の統合を実行できません。ページと時刻の引数を再確認してください。",
        "mergehistory-fail-toobig": "移動させた{{PLURAL:$1|版}}の数が上限を超えているため、履歴の統合を実行できません。",
        "mergehistory-no-source": "統合元ページ $1 が存在しません。",
        "prefs-watchlist-token": "ウォッチリストのトークン:",
        "prefs-misc": "その他",
        "prefs-resetpass": "パスワードを変更",
-       "prefs-changeemail": "メールアドレスを変更",
+       "prefs-changeemail": "メールアドレスを変更または除去",
        "prefs-setemail": "メールアドレスを設定",
        "prefs-email": "メールの設定",
        "prefs-rendering": "表示",
        "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-passwordreset": "パスワード再設定メールを閲覧",
        "right-managechangetags": "[[Special:Tags|タグ]]のデータベースにおける作成および削除",
        "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
-       "right-changetags": "個々の版とログエントリの任意の[[Special:Tags|タグ]]の追加と削除",
+       "right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
        "newuserlogpage": "アカウント作成記録",
        "newuserlogpagetext": "以下はアカウント作成の記録です。",
        "rightslog": "利用者権限変更記録",
        "action-editcontentmodel": "ページのコンテンツモデルを編集",
        "action-managechangetags": "タグのデータベースにおける作成および削除",
        "action-applychangetags": "自分の編集にタグを適用する",
-       "action-changetags": "個々のリビジョン上およびログエントリ上での任意のタグについての追加と除去",
+       "action-changetags": "個々の版および記録項目への任意のタグの追加と除去",
        "nchanges": "$1 {{PLURAL:$1|回の変更}}",
        "enhancedrc-since-last-visit": "最終閲覧以降 $1 {{PLURAL:$1|件}}",
        "enhancedrc-history": "履歴",
        "recentchangeslinked-summary": "これは指定したページからリンクされている (または指定したカテゴリに含まれている) ページの最近の変更の一覧です。\n[[Special:Watchlist|自分のウォッチリスト]]にあるページは<strong>太字</strong>で表示されます。",
        "recentchangeslinked-page": "ページ名:",
        "recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え",
+       "autochange-username": "メディアウィキ自動変更",
        "upload": "ファイルをアップロード",
        "uploadbtn": "ファイルをアップロード",
        "reuploaddesc": "アップロードを中止してアップロードフォームへ戻る",
        "upload-options": "アップロードのオプション",
        "watchthisupload": "このファイルをウォッチ",
        "filewasdeleted": "この名前のファイルは一度アップロードされ、その後削除されています。\n再度アップロードする前に$1を確認してください。",
+       "filename-thumb-name": "これはサムネイルのタイトルのように見えます。けっして同じウィキに戻ってサムネイルをアップロードしないでください。そうでなければ、それはより多くの意味があるので、ファイル名を修正し、サムネイル接頭辞を持たなくしてください。",
        "filename-bad-prefix": "アップロードしようとしているファイルの名前が<strong>「$1」</strong>から始まっていますが、これはデジタルカメラによって自動的に付与されるような具体性を欠いた名前です。\nファイルの内容をより具体的に説明する名前を使用してください。",
        "filename-prefix-blacklist": " #<!-- この行はそのままにしておいてください --> <pre>\n# 構文は以下の通り:\n#   * \"#\" 記号から行末まではすべてがコメント\n#   * 空ではない行はすべてデジタルカメラによって自動的に付けられる典型的なファイル名の接頭辞\nCIMG # カシオ\nDSC_ # ニコン\nDSCF # 富士フイルム\nDSCN # ニコン\nDUW # 一部の携帯電話\nIMG # 一般\nJD # Jenoptik\nMGP # ペンタックス\nPICT # その他\n #</pre> <!-- この行はそのままにしておいてください -->",
        "upload-success-subj": "アップロード成功",
        "upload-http-error": "HTTP エラー発生: $1",
        "upload-copy-upload-invalid-domain": "このドメインからのアップロードは許可されていません。",
        "upload-dialog-title": "ファイルをアップロード",
-       "upload-dialog-error": "エラーが発生しました",
-       "upload-dialog-warning": "警告",
        "upload-dialog-button-cancel": "中止",
        "upload-dialog-button-done": "完了",
        "upload-dialog-button-save": "保存",
        "upload-dialog-button-upload": "アップロード",
-       "upload-dialog-label-select-file": "ファイル選択",
-       "upload-dialog-label-infoform-title": "詳細",
-       "upload-dialog-label-infoform-name": "名前",
-       "upload-dialog-label-infoform-description": "説明",
-       "upload-dialog-label-usage-title": "使用法",
-       "upload-dialog-label-usage-filename": "ファイル名",
+       "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": "日付",
+       "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|the upload page on {{SITENAME}}]]を使用してみてください",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "私は、このファイルの著作権を所有していることを宣誓し、取消し不能な形で  [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] ライセンスのもとでウィキメディア・コモンズに、このファイルを解放することに同意します。そして私は、  [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use] に同意します。",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "このファイルの著作権を所有していない場合、または別のライセンスの下でそれをリリースしたい場合には、 [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] を使用することを検討してください。",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "もしサイトが、それらの方針の下で、このファイルのアップロードを許可する場合は、You may also want to try using [[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": "このファイルに指定された時刻印を持つ過去の版はありません。",
        "booksources-text": "お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:",
        "booksources-invalid-isbn": "指定した ISBN は有効ではないようです。情報源から写し間違えていないか確認してください。",
        "specialloguserlabel": "実行者:",
-       "speciallogtitlelabel": "対象 (ページまたは{{ns:user}}:利用者のための利用者名):",
+       "speciallogtitlelabel": "対象 (ページ名または利用者の場合、{{ns:user}}:利用者名):",
        "log": "記録",
        "all-logs-page": "すべての公開記録",
        "alllogstext": "{{SITENAME}}の取得できる記録をまとめて表示しています。\n記録の種類、実行した利用者 (大文字小文字は区別)、影響を受けたページ (大文字小文字は区別) による絞り込みができます。",
        "emailccsubject": "$1 に送信したメールの控え: $2",
        "emailsent": "メールを送信しました",
        "emailsenttext": "メールを送信しました。",
-       "emailuserfooter": "このメールは$1から$2へ、{{SITENAME}}の「{{int:emailuser}}」機能で送信されました。",
+       "emailuserfooter": "このメールは$1から{{GENDER:$2|$2}}へ、{{SITENAME}}の「{{int:emailuser}}」機能で{{GENDER:$1|送信}}されました。",
        "usermessage-summary": "システムメッセージを残す。",
        "usermessage-editor": "システムメッセンジャー",
        "watchlist": "ウォッチリスト",
        "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": "削除",
        "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これらの場合、必要に応じて、トークページを移動または統合する必要があります。",
-       "movearticle": "移動するページ:",
+       "movepagetalktext": "ここにチェックを付けると、関連付けられたトークページも一緒に、自動的に新しいページ名に移動されます。ただし、移動先に空ではないトークページが既に存在する場合を除きます。\n\nこの場合、手動でトークページを移動または統合する必要があります。",
        "moveuserpage-warning": "<strong>警告:</strong> 利用者ページを移動しようとしています。この操作ではページのみが移動され、利用者名は<em>変更されない</em>点に注意してください。",
        "movecategorypage-warning": "<strong>警告:</strong> カテゴリのページを移動させようとしています。カテゴリのページのみが移動するため、元のカテゴリに属していたどのページも新しいカテゴリには移動 <em>しない</em> ことにご注意ください。",
        "movenologintext": "ページを移動するためには、登録利用者でありかつ、[[Special:UserLogin|ログイン]]している必要があります。",
        "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 を {{GENDER:$2|保護}}しました $4 [カスケード]",
+       "logentry-protect-modify": "$1 が $3 の保護レベルを{{GENDER:$2|変更}}しました $4",
+       "logentry-protect-modify-cascade": "$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|昇格しました}}",
        "api-error-badaccess-groups": "このウィキへのファイルのアップロードが許可されていません。",
        "api-error-badtoken": "内部エラー: トークンが正しくありません。",
        "api-error-copyuploaddisabled": "URLによるアップロードはこのサーバーでは無効になっています。",
-       "api-error-duplicate": "当ウェブサイト上には、既に同じ内容の{{PLURAL:$1|[$2 他のファイル]が|[$2 他のファイルがいくつか]}}存在しています。",
-       "api-error-duplicate-archive": "サイト上に同じ内容の{{PLURAL:$1|[$2 別のファイル]が|[$2 他のファイルがいくつか]}}既にありましたが、{{PLURAL:$1|それは|それらは}}削除されました。",
-       "api-error-duplicate-archive-popup-title": "重複した{{PLURAL:$1|ファイル|ファイル群}}は削除済みです。",
-       "api-error-duplicate-popup-title": "重複した{{PLURAL:$1|ファイル|ファイル群}}です。",
+       "api-error-duplicate": "当ウェブサイト上には、既に同じ内容の{{PLURAL:$1|他のファイルが|他のファイルがいくつか}}存在しています。",
+       "api-error-duplicate-archive": "サイト上に同じ内容の{{PLURAL:$1|別のファイルが|他のファイルがいくつか}}既にありましたが、{{PLURAL:$1|それは|それらは}}削除されました。",
        "api-error-empty-file": "送信されたファイルは空でした。",
        "api-error-emptypage": "内容がないページの新規作成は許可されていません。",
        "api-error-fetchfileerror": "内部エラー: ファイルを取得する際に問題が発生しました。",
index 9ebdaa0..2e1c848 100644 (file)
                        "Xabier Armendaritz",
                        "Ælsån",
                        "Midnight Gambler",
-                       "아라"
+                       "아라",
+                       "Jyllanj"
                ]
        },
-       "tog-underline": "Understreg henvesnenger",
-       "tog-hideminor": "Skjul mendre ændrenger i'n liste åver seneste ændrenger",
-       "tog-extendwatchlist": "Udvedet liste ve seneste ændrenger",
-       "tog-usenewrc": "Førbedret liste åver seneste ændrenger (JavaScript)",
-       "tog-numberheadings": "Åtåmatisk nåmererenge åf åverskrefter",
-       "tog-showtoolbar": "Ves værktøjslenje til redigærenge",
-       "tog-editondblclick": "Redigær sider ve dåbeltklik",
-       "tog-editsectiononrightclick": "Redigær åfsnet ve at klikke på deres titler",
-       "tog-watchcreations": "Tilføj sider a åpretter til miin åvervågnengsliste",
-       "tog-watchdefault": "Tilføj sider a redigærer til miin åvervågnengsliste",
-       "tog-watchmoves": "Tilføj sider a flytter til miin åvervågnengsliste",
-       "tog-watchdeletion": "Tilføj sider a sletter til miin åvervågnengsliste",
-       "tog-minordefault": "Markær søm standård ål redigærenge søm mendre",
-       "tog-previewontop": "Ves førhåndsvesnenge åver æ rædigerengsboks",
-       "tog-previewonfirst": "Ves førhåndsvesnenge når du stårtst ve at redigære",
-       "tog-enotifwatchlistpages": "Send mig en e-mail ve sideændrenger",
-       "tog-enotifusertalkpages": "Send mig en e-mail når miin brugerdiskusjeside ændres",
-       "tog-enotifminoredits": "Send mig også en e-mail ve mendre ændrenger åf åvervågede sider",
-       "tog-enotifrevealaddr": "Ves miin e-mail-adresse i mails ve besked ændrenger'm",
-       "tog-shownumberswatching": "Ves åntal brugere, der åvervåger",
-       "tog-fancysig": "Signaturer uden åtåmatisk henvesnenge",
-       "tog-uselivepreview": "Brug åtåmatisk førhåndsvesnenge (eksperimentel)",
-       "tog-forceeditsummary": "Advar, hves sammenfatnenge mangler ve gemnenge",
-       "tog-watchlisthideown": "Skjul egne ændrenger i'n åvervågnengsliste",
-       "tog-watchlisthidebots": "Skjul ændrenger frå bots i'n åvervågnengsliste",
-       "tog-watchlisthideminor": "Skjul mendre ændrenger i'n åvervågnengsliste",
-       "tog-ccmeonemails": "Send mig kopier åf e-mails, søm a sender til andre brugere.",
-       "tog-diffonly": "Ves ve versjesammenlegnenger kun førskelle, ekke'n hele side",
-       "tog-showhiddencats": "Ves skjulte klynger",
-       "underline-always": "åltid",
-       "underline-never": "åldreg",
-       "underline-default": "æfter brovserendstellenge",
-       "sunday": "søndåg",
-       "monday": "måndåg",
-       "tuesday": "tirsdåg",
-       "wednesday": "ønsdåg",
-       "thursday": "tårsdåg",
-       "friday": "fredåg",
-       "saturday": "lørsdåg",
+       "tog-underline": "Unjestreg henwisnenge:",
+       "tog-hideminor": "Sjul lie øndrenge i listen öwe siensti øndrenge",
+       "tog-hidepatrolled": "Sjul patruljiirtje redigiirenge i siensti øndrenge",
+       "tog-newpageshidepatrolled": "Sjul patruljiirtje side på listen öwe nyj side",
+       "tog-extendwatchlist": "Utwiid öwewågnengslisten te å wis åll øndrenge å ett kons di nysti",
+       "tog-usenewrc": "Gruppiir øndrenge pro siid i listen öwe siensti øndrenge å i öwewågnengslisten",
+       "tog-numberheadings": "Automatisk nummeriireng å öweskrifte",
+       "tog-showtoolbar": "Wis wærktyeslinje te redigiireng",
+       "tog-editondblclick": "Redigiir side mä doppeltklikk",
+       "tog-editsectiononrightclick": "Redigiir åsnit we å højaklikk på dæes title",
+       "tog-watchcreations": "Tilfye side, æ oprette, å fili, æ lägge op, te min öwewågnengslist",
+       "tog-watchdefault": "Tilfye side å file, æ redigiire, te min öwewågnengslist",
+       "tog-watchmoves": "Tilfye side å file, æ flytte, te min öwewågnengslist",
+       "tog-watchdeletion": "Tilfye side å file, æ slette, te min öwewågnengslist",
+       "tog-watchrollback": "Tilfye side, hwor æ hår utförtj en tebagrullneng te min öwewågnengslist",
+       "tog-minordefault": "Markiir som standard åll redigiirenge som lie",
+       "tog-previewontop": "Wis forhånjswisneng öwe redigiirengsboksi",
+       "tog-previewonfirst": "Wis forhånjswisneng we fösjti redigiireng",
+       "tog-enotifwatchlistpages": "Senj mej i e-mail we øndrenge te en siid elle i fil på min öwewågnengslist",
+       "tog-enotifusertalkpages": "Senj mej i e-mail nær min brugediskusjonssiid øndas",
+       "tog-enotifminoredits": "Senj mej åsså i e-mail we lie øndrenge å side å file på min öwewågnengslist",
+       "tog-enotifrevealaddr": "Wis min e-mailadress i e-mails mä besked om øndrenge",
+       "tog-shownumberswatching": "Wis åntal bruga som öwewåge",
+       "tog-oldsig": "Nuwærenje signatur:",
+       "tog-fancysig": "Behånjl signatur som wikitekst uen automatisk henwisneng",
+       "tog-uselivepreview": "Benøtt løbenje forhånjswisneng",
+       "tog-forceeditsummary": "Adwar mej hwes æ ett utfylle beskriiwelsfeltje",
+       "tog-watchlisthideown": "Sjul ejne øndrenge i öwewågnengslisten",
+       "tog-watchlisthidebots": "Sjul øndrenge fra bots i öwewågnengslisten",
+       "tog-watchlisthideminor": "Sjul lie øndrenge i öwewågningslisten",
+       "tog-watchlisthideliu": "Sjul inloggtje brugas redigiirenge i öwewågnengslist",
+       "tog-watchlisthideanons": "Sjul anonym brugas redigiirenge i öwewågnengslist",
+       "tog-watchlisthidepatrolled": "Sjul patruljiirtje øndrenge fra öwewågnengslist",
+       "tog-ccmeonemails": "Senj mej kopie å e-mails som æ senje te anjer bruga",
+       "tog-diffonly": "Wis ett sidinholj nier unje versjonssammelliiknenge",
+       "tog-showhiddencats": "Wis sjulen kategorie",
+       "tog-norollbackdiff": "Wis ett forskell ette tebagrullneng",
+       "tog-useeditwarning": "Adwar mej, hwes æ forlade en redigiirengssiid mä øndrenge, som ett ä djiemen",
+       "tog-prefershttps": "Brug ålltins en siker forbinjels, nær du ä loggen in",
+       "underline-always": "Åltid",
+       "underline-never": "Åller",
+       "underline-default": "Brug dej browserens instelleng elle standarden for walgtje utsienje",
+       "editfont-style": "Skriftstil we redigiireng:",
+       "editfont-default": "Brug browseris instelleng",
+       "editfont-monospace": "Fästbrieddeskrift",
+       "editfont-sansserif": "Skrift uen fyed",
+       "editfont-serif": "Skrift mä fyed",
+       "sunday": "søndaw",
+       "monday": "måndaw",
+       "tuesday": "tirsdaw",
+       "wednesday": "onsdaw",
+       "thursday": "tårsdaw",
+       "friday": "friedaw",
+       "saturday": "lørsdaw",
        "sun": "søn",
        "mon": "mån",
        "tue": "tir",
-       "wed": "øns",
+       "wed": "ons",
        "thu": "tår",
-       "fri": "fre",
+       "fri": "fri",
        "sat": "lør",
        "january": "januar",
        "february": "februar",
        "march": "mårts",
        "april": "åpril",
-       "may_long": "mæ",
+       "may_long": "maj",
        "june": "juni",
        "july": "juli",
        "august": "ågust",
        "september": "september",
        "october": "oktober",
        "november": "november",
-       "december": "desember",
+       "december": "december",
        "january-gen": "januars",
        "february-gen": "februars",
-       "march-gen": "mårtses",
+       "march-gen": "mårts'",
        "april-gen": "åprils",
-       "may-gen": "mæs",
-       "june-gen": "juniis",
-       "july-gen": "juliis",
+       "may-gen": "majs",
+       "june-gen": "junis",
+       "july-gen": "julis",
        "august-gen": "ågusts",
        "september-gen": "septembers",
        "october-gen": "oktobers",
        "november-gen": "novembers",
-       "december-gen": "desembers",
+       "december-gen": "decembers",
        "jan": "jan",
        "feb": "feb",
-       "mar": "mår",
-       "apr": "åpr",
-       "may": "mæ",
+       "mar": "mar",
+       "apr": "apr",
+       "may": "maj",
        "jun": "jun",
        "jul": "jul",
-       "aug": "ågu",
+       "aug": "aug",
        "sep": "sep",
        "oct": "okt",
        "nov": "nov",
-       "dec": "des",
-       "pagecategories": "{{PLURAL:$1|Klynge|Klynger}}",
-       "category_header": "Ertikler i'n klynge \"$1\"",
-       "subcategories": "Underklynger",
-       "category-media-header": "Medier i'n klynge „$1“",
-       "category-empty": "''Denne klynge endeholter før øjeblikket æ verke sider æller medie-gøret.''",
-       "hidden-categories": "{{PLURAL:$1|Skjult klynge|Skjulte klynger}}",
-       "hidden-category-category": "Skjulte klynger",
-       "listingcontinuesabbrev": "førtgøte",
-       "about": "Åm",
-       "article": "Ertikel",
-       "newwindow": "(åbner i et nyt vendue)",
-       "cancel": "Åfbryd",
-       "moredotdotdot": "Mære...",
-       "mypage": "Miin side",
-       "mytalk": "Min diskusje",
-       "anontalk": "Diskusjeside før denne IP-adresse",
-       "navigation": "Navigasje",
-       "and": "&#32;og",
-       "qbfind": "Søĝ",
-       "qbbrowse": "Gennemse",
-       "qbedit": "Redigær",
-       "qbpageoptions": "Endstellenger før side",
-       "qbmyoptions": "Miine endstellenger",
-       "faq": "VSF",
-       "faqpage": "Project:Vøl stellen fråĝer (VSF)",
+       "dec": "dec",
+       "january-date": "$1. januar",
+       "february-date": "$1. februar",
+       "march-date": "$1. mårts",
+       "april-date": "$1. åpril",
+       "may-date": "$1. maj",
+       "june-date": "$1. juni",
+       "july-date": "$1. juli",
+       "august-date": "$1. ågust",
+       "september-date": "$1. september",
+       "october-date": "$1. oktober",
+       "november-date": "$1. november",
+       "december-date": "$1. december",
+       "pagecategories": "{{PLURAL:$1|Kategori|Kategorie}}",
+       "category_header": "Side i kategorien \"$1\"",
+       "subcategories": "Unjekategorie",
+       "category-media-header": "Medie i kategorien „$1“",
+       "category-empty": "''Kategorien inholje for yeblikke hverken side elle mediefile.''",
+       "hidden-categories": "{{PLURAL:$1|Sjultj kategori|Sjultj kategorie}}",
+       "hidden-category-category": "Sjulen kategorie",
+       "category-subcat-count": "{{PLURAL:$2|Kategorien hår en unjekategori.|Kategorien inholje nierstoenje {{PLURAL:$1|unjerkategori|$1 unjerkategorie}}, å i ållt $2.}}",
+       "category-subcat-count-limited": "Kategorien inholje {{PLURAL:$1|nästi unjekategorien|di nästi unjekategorie}}.",
+       "category-article-count": "Kategorien inholje {{PLURAL:$2|kons den nierstoenje siid|{{PLURAL:$1|den nierstoenje siid|di nierstoenje $1 side}} å i ållt $2.}}",
+       "category-article-count-limited": "Kategorien inholje {{PLURAL:$1|nierstoenje siid|di nierstoenje $1 side}}.",
+       "category-file-count": "Kategorien inholje {{PLURAL:$2|kons den nierstoenje siid|{{PLURAL:$1|i nierstoenje fil|di nierstoenje $1 file}} å i ållt $2.}}",
+       "category-file-count-limited": "Kategorien inholje {{PLURAL:$1|nierstoenje fili|di nierstoenje $1 file}}.",
+       "listingcontinuesabbrev": "forts.",
+       "index-category": "Indeksiirtje side",
+       "noindex-category": "Intj-indeksiirtje side",
+       "broken-file-category": "Side mä bruden filhenwisnenge",
+       "about": "Om",
+       "article": "Artikel",
+       "newwindow": "(åbne i e ny winjye)",
+       "cancel": "Åbryd",
+       "moredotdotdot": "Mier...",
+       "morenotlisted": "Listen ä ett komplett.",
+       "mypage": "Siid",
+       "mytalk": "Diskusjon",
+       "anontalk": "Diskusjonssiid for denn IP-adress",
+       "navigation": "Navigasjon",
+       "and": "&#32;å",
+       "qbfind": "Syeg",
+       "qbbrowse": "Djennemsie",
+       "qbedit": "Redigiir",
+       "qbpageoptions": "Instellenge for siid",
+       "qbmyoptions": "Min instellenge",
+       "faq": "OSS",
+       "faqpage": "Project:OSS",
+       "actions": "Hånjlenge",
+       "namespaces": "Naunrum",
+       "variants": "Variantje",
+       "navigation-heading": "Navigasjonsmenu",
        "errorpagetitle": "Fejl",
-       "returnto": "Tilbage til $1.",
-       "tagline": "Frå {{SITENAME}}",
-       "help": "Hjælp",
-       "search": "Søĝ",
-       "searchbutton": "Søĝ",
-       "go": "Gå til",
-       "searcharticle": "Gå til",
-       "history": "Skigt",
-       "history_short": "Skigte",
-       "updatedmarker": "(ændret)",
-       "printableversion": "Utskreftsvelig utgåf",
-       "permalink": "Permanent henvesnenge",
-       "print": "Udskrev",
-       "edit": "Redigær",
-       "create": "Skep",
-       "editthispage": "Redigær side",
-       "create-this-page": "Skep denne side",
-       "delete": "Slet",
-       "deletethispage": "Slet side",
-       "undelete_short": "Førtryd sletnenge åf {{PLURAL:$1|$1 versje|$1 versje}}",
-       "protect": "Beskyt",
-       "protect_change": "Ændret beskyttelse",
-       "protectthispage": "Beskyt side",
-       "unprotect": "Fjern beskyttelse",
-       "unprotectthispage": "Frigæv side",
-       "newpage": "Ny side",
-       "talkpage": "Diskusje",
-       "talkpagelinktext": "diskusje",
-       "specialpage": "Sonst side",
-       "personaltools": "Personlige værktø'r",
-       "articlepage": "Se'n ertikel",
-       "talk": "Diskusje",
-       "views": "Vesnenger",
-       "toolbox": "Værktø'r",
-       "userpage": "Se'n brugerside",
-       "projectpage": "Se'n projektside",
-       "imagepage": "Se'n billetside",
-       "mediawikipage": "Vese endholtsside",
-       "templatepage": "Vese skablånside",
-       "viewhelppage": "Vese hjælpeside",
-       "categorypage": "Vese klyngeside",
-       "viewtalkpage": "Se'n diskusje",
-       "otherlanguages": "Andre språĝ",
-       "redirectedfrom": "(Åmstyret frå $1)",
-       "redirectpagesub": "Åmstyrenge",
-       "lastmodifiedat": "Denne side blev senest ændret den $2, $1.",
-       "viewcount": "Æ side er vest i alt $1 {{PLURAL:$1|geng|genger}}.",
-       "protectedpage": "Beskyttet side",
-       "jumpto": "Skeft til:",
-       "jumptonavigation": "navigasje",
-       "jumptosearch": "Søĝnenge",
-       "aboutsite": "{{SITENAME}}'m",
-       "aboutpage": "Project:Åm",
-       "copyright": "Endholtet er udgævet under $1.",
-       "copyrightpage": "{{ns:project}}:Åphavsret",
-       "currentevents": "Nænte begevenheder",
-       "currentevents-url": "Project:Nænte begevenheder",
-       "disclaimers": "Førbeholt",
-       "disclaimerpage": "Project:Huses førbeholt",
-       "edithelp": "Hjælp til redigærenge",
-       "mainpage": "Førsit",
-       "mainpage-description": "Førsit",
+       "returnto": "Tebag te $1.",
+       "tagline": "Fra {{SITENAME}}",
+       "help": "Hjälp",
+       "search": "Syeg",
+       "searchbutton": "Syeg",
+       "go": "Go te",
+       "searcharticle": "Go te",
+       "history": "Historik",
+       "history_short": "Historik",
+       "updatedmarker": "opdatiirtj sien siensti besyeg",
+       "printableversion": "Utskriftswenli utgaw",
+       "permalink": "Permanentj henvisneng",
+       "print": "Utskriiw",
+       "view": "Wis",
+       "view-foreign": "Wis på $1",
+       "edit": "Redigiir",
+       "edit-local": "Redigiir lokal beskriiwels",
+       "create": "Oprett",
+       "create-local": "Tilfye lokal beskriiwels",
+       "editthispage": "Redigiir siid",
+       "create-this-page": "Oprett siden",
+       "delete": "Slett",
+       "deletethispage": "Slett siid",
+       "undeletethispage": "Djenta siden",
+       "undelete_short": "Fortryd slettneng å {{PLURAL:$1|jen versjon|$1 versjone}}",
+       "viewdeleted_short": "Wis {{PLURAL:$1|en sletten redigiireng|$1 sletten redigiirenge}}",
+       "protect": "Beskøtt",
+       "protect_change": "ønda",
+       "protectthispage": "Beskøtt siid",
+       "unprotect": "Ønda beskøttels",
+       "unprotectthispage": "Ønda beskøttelsen å siden",
+       "newpage": "Ny siid",
+       "talkpage": "Diskusjon",
+       "talkpagelinktext": "diskusjon",
+       "specialpage": "Specialsiid",
+       "personaltools": "Personli wærktya",
+       "articlepage": "Sie artikli",
+       "talk": "Diskusjon",
+       "views": "Wisnenge",
+       "toolbox": "Wærktya",
+       "userpage": "Sie brugesiden",
+       "projectpage": "Sie projektsiden",
+       "imagepage": "Sie filsiden",
+       "mediawikipage": "Wis inholjssiid",
+       "templatepage": "Wis skabelonsiid",
+       "viewhelppage": "Wis hjälpsiid",
+       "categorypage": "Wis kategorisiid",
+       "viewtalkpage": "Sie diskusjon",
+       "otherlanguages": "Anjer spraw",
+       "redirectedfrom": "(Omdirigiirtj fra $1)",
+       "redirectpagesub": "Omdirigiirengssiid",
+       "redirectto": "Omdirigiir te:",
+       "lastmodifiedat": "Siden bløw sienst øndatj $1 kl. $2.",
+       "viewcount": "Siden ä wisen {{PLURAL:$1|jen gång|$1 gång}}.",
+       "protectedpage": "Beskøttetj siid",
+       "jumpto": "Skift te:",
+       "jumptonavigation": "navigasjon",
+       "jumptosearch": "Syegneng",
+       "view-pool-error": "Beklawe, men serveren ä i yeblikk öwebelasten. \nFor mång bruga forsyege å sietj siden.\nWentj e yeblikk, för du forsyege å besyeg siden idjen.\n\n$1",
+       "generic-pool-error": "Beklawe, men serveren ä i yeblikk öwebelasten.\nFor mång bruga forsyeg å sietj siden.\nWentj e yeblikk för du forsyege å besyeg siden idjen.",
+       "pool-timeout": "Timeout mens man wentje på låsnengen",
+       "pool-queuefull": "Pool-køen ä full",
+       "pool-errorunknown": "Utjentj fejl",
+       "pool-servererror": "Pool-counterservicen ä ett te rådihed ($1).",
+       "poolcounter-usage-error": "Brugsfejl: $1",
+       "aboutsite": "Om {{SITENAME}}",
+       "aboutpage": "Project:Om",
+       "copyright": "Inholje ä utdjøwen unje $1 mämenna ånj ä åndjøwen.",
+       "copyrightpage": "{{ns:project}}:Ophawsrett",
+       "currentevents": "Aktuell bedjøwenhede",
+       "currentevents-url": "Project:Aktuell bedjøwenhede",
+       "disclaimers": "Forbeholj",
+       "disclaimerpage": "Project:Generell forbeholj",
+       "edithelp": "Hjälp te redigiireng",
+       "helppage-top-gethelp": "Hjälp",
+       "mainpage": "Forsiid",
+       "mainpage-description": "Forsiid",
        "policy-url": "Project:Politik",
-       "portal": "Førside før skrebenter",
-       "portal-url": "Project:Førside før skrebenter",
-       "privacy": "Behandlenge åf personlige åplysnenger",
-       "privacypage": "Project:Behandlinge åf personlige åplysnenger",
-       "badaccess": "Manglende rettigheder",
-       "badaccess-group0": "Du harst ekke de nødvendege rettegheder til denne håndlenge.",
-       "badaccess-groups": "Denne håndlenge ken kun udføres åf brugere, søm tilhører en åf grupperne „$1“.",
-       "versionrequired": "Kræver versje $1 åf MediaWiki",
-       "versionrequiredtext": "Versje $1 åf MediaWiki er påkrævet, før at bruge denne side. Se'n [[Special:Version|versjeside]]",
-       "ok": "Er åkæ",
-       "retrievedfrom": "Hæntet frå \"$1\"",
-       "youhavenewmessages": "Du har $1 ($2).",
-       "youhavenewmessagesmulti": "Der er nye meddelelser til dig: $1",
-       "editsection": "redigær",
-       "editold": "redigær",
-       "viewsourceold": "ves æ kelde",
-       "editsectionhint": "Redigær åfsnet: $1",
-       "toc": "Endholtsførtegnelse",
-       "showtoc": "ves",
-       "hidetoc": "skjul",
-       "thisisdeleted": "Se æller gendan $1?",
-       "viewdeleted": "Ves $1?",
-       "restorelink": "{{PLURAL:$1|en slettet ændrenge|$1 slettede ændrenger}}",
-       "feedlinks": "Fiid:",
-       "feed-invalid": "Ugyldeg abånmentstype.",
-       "feed-unavailable": "RSS og Atåm fiid er ekke tilgængelege på {{SITENAME}}",
-       "site-rss-feed": "$1 RSS-fiid",
-       "site-atom-feed": "$1 Atom-fiid",
-       "page-rss-feed": "\"$1\" RSS-fiid",
-       "page-atom-feed": "\"$1\" Atom-fiid",
-       "red-link-title": "$1 (ekke skrevet endnu)",
-       "nstab-main": "ertikel",
-       "nstab-user": "brugerside",
-       "nstab-media": "medie",
-       "nstab-special": "sonst",
-       "nstab-project": "åm",
-       "nstab-image": "billet",
-       "nstab-mediawiki": "besked",
-       "nstab-template": "skablån",
-       "nstab-help": "hjælp",
-       "nstab-category": "Klynge",
-       "nosuchaction": "Æ funksje fendes ekke",
-       "nosuchactiontext": "Funksje ångævet i'n URL ken ekke genkendes åf æ MediaWiki-softwær",
-       "nosuchspecialpage": "En sådan sonstside fendes ekke",
-       "nospecialpagetext": "Du harst bedt en sonstside'm, der ekke ken genkendes åf æ MediaWiki-softwær.",
+       "portal": "Forsiid for skribentje",
+       "portal-url": "Project:Forsiid for skribentje",
+       "privacy": "Behånjleng å personli opløsnenge",
+       "privacypage": "Project:Behånjleng å personli opløsnenge",
+       "badaccess": "Månglenje rettighede",
+       "badaccess-group0": "Du hår ett di nødwenji rettighede te hånjlengen.",
+       "badaccess-groups": "Handlingen kan kons utförs å bruga som tilhör {{PLURAL:$2|gruppen|jen å grupper:}} $1.",
+       "versionrequired": "Kräwe versjon $1 å MediaWiki",
+       "versionrequiredtext": "Versjon $1 å MediaWiki ä påkräwen, for å brug siden. Sie [[Special:Version|versjonssiden]]",
+       "ok": "OK",
+       "retrievedfrom": "Hentjen fra \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|Du hår}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Du hår}} $1 fra {{PLURAL:$3|i ånj bruge| $3 bruga}} ($2).",
+       "youhavenewmessagesmanyusers": "Du hår $1 fra mång bruga ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|e ny besked|999=nyj beskede}}",
+       "newmessagesdifflinkplural": "siensti {{PLURAL:$1|øndreng|999=øndrenge}}",
+       "youhavenewmessagesmulti": "Du hår nyj beskede på $1",
+       "editsection": "redigiir",
+       "editold": "redigiir",
+       "viewsourceold": "wis tjeljkode",
+       "editlink": "redigiir",
+       "viewsourcelink": "wis tjeljtekst",
+       "editsectionhint": "Redigiir åsnit: $1",
+       "toc": "Inholjsfortejnels",
+       "showtoc": "wis",
+       "hidetoc": "sjul",
+       "collapsible-collapse": "Folj sammel",
+       "collapsible-expand": "Folj ut",
+       "confirmable-confirm": "Ä {{GENDER:$1|du}} siker?",
+       "confirmable-yes": "Ja",
+       "confirmable-no": "Nej",
+       "thisisdeleted": "Sie elle djensätt $1?",
+       "viewdeleted": "Wis $1?",
+       "restorelink": "{{PLURAL:$1|en sletten øndreng|$1 sletten øndrenge}}",
+       "feedlinks": "Feed:",
+       "feed-invalid": "Udjylji abonnementjstyp.",
+       "feed-unavailable": "Där ä in syndikiirengsfeeds tildjængeli",
+       "site-rss-feed": "$1 RSS-feed",
+       "site-atom-feed": "$1 Atom-feed",
+       "page-rss-feed": "\"$1\" RSS-feed",
+       "page-atom-feed": "\"$1\" Atom-feed",
+       "red-link-title": "$1 (siden ä ett skrøwen ennu)",
+       "sort-descending": "Sortiir fallenje",
+       "sort-ascending": "Sortiir stigenje",
+       "nstab-main": "Siid",
+       "nstab-user": "Brugesiid",
+       "nstab-media": "Mediesiid",
+       "nstab-special": "Specialsiid",
+       "nstab-project": "Projektsiid",
+       "nstab-image": "Fil",
+       "nstab-mediawiki": "Besked",
+       "nstab-template": "Skabelon",
+       "nstab-help": "Hjælp",
+       "nstab-category": "Kategori",
+       "mainpage-nstab": "Forsiid",
+       "nosuchaction": "Funksjonen finjs ett",
+       "nosuchactiontext": "Hånjlengen som ä åndjøwen i URL'i ä udjylji.\nDu kan ha skrøwen URL'i forkiertj, elle fuljtj en ukorrekt henwisneng.\nDä kan åsså skyljs en fejl i programmet som brugs å {{SITENAME}}.",
+       "nosuchspecialpage": "En sån specialsiid finjs ett",
+       "nospecialpagetext": "<strong>Du hår bien om en specialsiid, som ett kan djenkentjs å MediaWiki-softwari.</strong>\n\nEn list öwe djylji specialside finjs på [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Fejl",
        "databaseerror": "Databasefejl",
-       "laggedslavemode": "Bemærk: Den veste side endholter mulegves ekke de nyeste ændrenger.",
-       "readonly": "Æ database er skrevebeskyttet",
-       "enterlockreason": "Skrev en begrundelse før æ skrevebeskyttelse, ve samt en vurderenge åf, hvornår æ skrevebeskyttelse åphæves ig'n",
-       "readonlytext": "Æ database er midlertedegt skrevebeskyttet. Førsøĝ venlegst senere.\n\nÅrsag til æ spærrenge: $1",
-       "readonly_lag": "Æ database er åtåmatisk blevet låst mens slæfdatabaseserverne synkroniserer ve'n master database",
+       "databaseerror-text": "Där opstue fejl i en forspöyrgsel te databasi.\nDetj kan indikiir en fejl i softwari.",
+       "databaseerror-textcl": "Där opstue fejl i en forspöyrgsel te databasi.",
+       "databaseerror-query": "Forspöyrgsel: $1",
+       "databaseerror-function": "Funksjon: $1",
+       "databaseerror-error": "Fejl: $1",
+       "laggedslavemode": "'''Bemærk:''' Den wisen siid inholje muliwis ett di nysti øndrenge.",
+       "readonly": "Databasi ä skriiwbeskøtten",
+       "enterlockreason": "Skriiw en begrunjels for skriiwbeskøttelsen, mä samt en wurdiireng å, nær skriiwbeskøttelsen ophäws idjen",
+       "readonlytext": "Databasi ä i yeblikke låsen for nyj poste å anje øndrenge, sånnsynliwis for rutinmæssi databaseweliholjels, hworette den will wær tebag te normal.\n\nAdministratori som hår låsen, djij forklarengen: $1",
+       "readonly_lag": "Databasi ä automatisk bløwen låsen mens slejvdatabaseserveren synkronisiir mä masterdatabasi",
        "internalerror": "Intern fejl",
        "internalerror_info": "Intern fejl: $1",
-       "filecopyerror": "Kan ekke kopiere'n file \"$1\" til \"$2\".",
-       "filerenameerror": "Kan ekke omdøbe'n file \"$1\" til \"$2\".",
-       "filedeleteerror": "Kan ekke slette'n file \"$1\".",
-       "directorycreateerror": "Kan ekke åprette katalåget \"$1\".",
-       "filenotfound": "Kan ekke finde'n file \"$1\".",
-       "unexpected": "Uventet værdi: \"$1\"=\"$2\".",
-       "formerror": "Fejl: Kan ekke åfsende formulær",
-       "badtitle": "Førkert skrevselenger",
-       "badtitletext": "Den ønskede sides nav var ekke tilladt, tøm æller æ side er førkert henvest frå en {{SITENAME}} på et andet språĝ.",
-       "viewsource": "Ves æ kelde",
+       "filecopyerror": "Ku ett kopiiir fili \"$1\" te \"$2\".",
+       "filerenameerror": "Ku ett omdøb fili \"$1\" te \"$2\".",
+       "filedeleteerror": "Ku ett slett fili \"$1\".",
+       "directorycreateerror": "Ku ett oprett mappen \"$1\".",
+       "filenotfound": "Ku ett finj fili \"$1\".",
+       "unexpected": "Uwentjen wärdi: \"$1\"=\"$2\".",
+       "formerror": "Fejl: Ku ett åsenj formular",
+       "badtitle": "Udjylji titel",
+       "badtitletext": "Titelen å onske siden war ett tillæt, tomm elle siden ä fortjiertj henwistj fra {{SITENAME}} på e ånj spraw.\nDen kan inholj iet elle flier tejn, som ett ma ånwenjs i title.",
+       "viewsource": "Wis tjeljtekst",
+       "viewsource-title": "Sie tjeljkoden te $1",
+       "actionthrottled": "Begrænsneng å hånjleng",
        "viewsourcetext": "Du ken dog se og åfskreve'n keldekode til æ side:",
-       "yourname": "Dit brugernav",
-       "yourpassword": "Din adgangskode",
-       "remembermypassword": "Husk min adgangskode til næste gang (for a maximum of $1 {{PLURAL:$1|day|days}})",
-       "login": "Loĝ på",
-       "nav-login-createaccount": "Åpret æ konto æller loĝ på",
-       "userlogin": "Åpret æ konto æller loĝ på",
-       "logout": "Loĝ åf",
-       "userlogout": "Loĝ åf",
-       "nologin": "Du har engen brugerkonto? $1.",
-       "nologinlink": "Åpret ny brugerkonto",
-       "createaccount": "Åpret en ny konto",
-       "gotaccount": "Du har ålerede en brugerkonto? '''$1'''.",
-       "gotaccountlink": "Loĝ på",
-       "loginsuccesstitle": "Du er nu loĝget på",
-       "loginsuccess": "Du er nu loĝget på {{SITENAME}} søm \"$1\".",
+       "welcomeuser": "Wælkomen, $1!",
+       "welcomecreation-msg": "Det konto ä bløwen opretten.\nGlæmm ett å ønda din [[Special:Preferences|instellenge for {{SITENAME}}]].",
+       "yourname": "Det brugenaun:",
+       "userlogin-yourname": "Brugenaun",
+       "userlogin-yourname-ph": "Intast det brugenaun",
+       "createacct-another-username-ph": "Intast brugenaun",
+       "yourpassword": "Din adgångskode",
+       "userlogin-yourpassword": "Adgångskode",
+       "userlogin-yourpassword-ph": "Intast din adgångskode",
+       "createacct-yourpassword-ph": "Intast en adgångskode",
+       "yourpasswordagain": "Djentast adgångskode:",
+       "createacct-yourpasswordagain": "Bekräft adgångskode",
+       "createacct-yourpasswordagain-ph": "Intast adgångskode idjen",
+       "remembermypassword": "Husk min brugenaun i denn browser (hyest $1 {{PLURAL:$1|daw}})",
+       "userlogin-remembermypassword": "Husk mej",
+       "userlogin-signwithsecure": "Brug siker forbinjels",
+       "yourdomainname": "Det domænnaun:",
+       "password-change-forbidden": "Du kan ett ønda adgångskoder på wikien.",
+       "externaldberror": "Där ä opstotj en fejl i i ekstern adgångsdatabase, elle du hår ett rettihede te å opdatiir denn.",
+       "login": "Logg på",
+       "nav-login-createaccount": "Oprett e konto ellerlogg på",
+       "userlogin": "Oprett e konto elle logg på",
+       "userloginnocreate": "Logg på",
+       "logout": "Logg å",
+       "userlogout": "Logg å",
+       "notloggedin": "Ikke loggen på",
+       "userlogin-noaccount": "Hår du ett e konto?",
+       "userlogin-joinproject": "Slut dej te {{SITENAME}}",
+       "nologin": "Du hår iet kronto? $1.",
+       "nologinlink": "Oprett e ny brugekonto",
+       "createaccount": "Oprett e ny brugekonto",
+       "gotaccount": "Hår du ållried e konto? '''$1'''.",
+       "gotaccountlink": "Logg på",
+       "userlogin-resetlink": "Hår du glommen din login-oplysnenge?",
+       "userlogin-resetpassword-link": "Glommen din adgångskode?",
+       "userlogin-helplink2": "Hjälp mä å logg på",
+       "userlogin-loggedin": "Du ä ållried loggen på som {{GENDER:$1|$1}}. Brug formulari nierfor te å logg på som i ånj bruge.",
+       "userlogin-createanother": "Oprett e ånj konto",
+       "createacct-emailrequired": "E-mailadress",
+       "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}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|siid|side}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|nyli bidrawye|nyli bidrawya}}",
+       "loginsuccesstitle": "Du ä nu loggen på",
+       "loginsuccess": "'''Du ä nu loggen på {{SITENAME}} som \"$1\".'''",
        "nosuchuser": "Der er ig'n bruger ve navnet \"$1\". Kontrollér æ stavemåde ig'n, æller brug æ formulår herunder til at åprette en ny brugerkonto.",
-       "nosuchusershort": "Der er ig'n bruger ve navn \"$1\". Tjek din stavnenge.",
-       "nouserspecified": "Angæv venlegst et brugernavn.",
-       "wrongpassword": "Den endtastede adgangskode var førkert. Prøv ig'n.",
-       "wrongpasswordempty": "Du glemte at endtaste password. Prøv ig'n.",
+       "nosuchusershort": "Där är ien bruge we naun \"$1\". Tjekk din stawneng.",
+       "nouserspecified": "Åndjie wenlist e brugenaun.",
+       "wrongpassword": "Den intasten adgångskode war forkiertj. Forsyeg idjen.",
+       "wrongpasswordempty": "Du glomm å intast adgångskode. Forsyeg idjen.",
        "passwordtooshort": "Dit kodeort er før kårt. Det skal være mendst $1 tegn langt.",
        "mailmypassword": "Send et nyt adgangskode til min e-mail-adresse",
-       "passwordremindertitle": "Nyt password til {{SITENAME}}",
+       "passwordremindertitle": "Ny midletidi adgångskode te {{SITENAME}}",
        "passwordremindertext": "Nogen (sandsynlegves dig, frå'n IP-addresse $1)\nhar bedt at vi sender dig en ny adgangskode til at loĝge på {{SITENAME}} ($4)'m.\nÆ adgangskode før bruger \"$2\" er nu \"$3\".\nDu bør loĝge på nu og ændre din adgangskode.,\n\nHves en anden har bestilt den nye adgangskode æller hves du er kåmet i tanke dit gamle password og ekke mære vil ændre det'm,\nkenst du bare ignorere denne mail og førtsætte ve at bruge dit gamle password.",
-       "noemail": "Der er ekke åplyst en e-mail-adresse før bruger \"$1\".",
-       "passwordsent": "En ny adgangskode er sendt til æ e-mail-adresse,\nsøm er registræret før \"$1\".\nDu bør loĝge på og ændre din adgangskode straks æfter du harst modtaget æ e-mail.",
+       "noemail": "Där ä ett opløstj en e-mailadress for bruge \"$1\".",
+       "passwordsent": "En ny adgångskode ä senjen te e-mailadressen, som ä registriirtj for \"$1\".\nDu bör logg på å ønda din adgangskode ette du hår modtan e-maili.",
        "eauthentsent": "En bekrftelsesmail er sendt til den angævne e-mail-adresse.\n\nFør en e-mail ken modtages åf andre brugere åf æ {{SITENAME}}-mailfunksje, skel æ adresse og dens tilhørsførholt til denne bruger bekræftes. Følg venlegst anvesnengerne i denne mail.",
-       "retypenew": "Gentag ny adgangskode",
-       "bold_sample": "Fed skrevselenger",
-       "bold_tip": "Fed skrevselenger",
-       "italic_sample": "Skyn skrevselenger",
-       "italic_tip": "Skyn skrevselenger",
-       "link_sample": "Henvesnenge",
-       "link_tip": "Ensende henvesnenge",
-       "extlink_sample": "http://www.example.com Skrevselenger på henvesnenge",
-       "extlink_tip": "Utsende henvesnenge (husk http:// førgøret)",
-       "headline_sample": "Skrevselenger til åverskreft",
-       "headline_tip": "Skå 2 åverskreft",
-       "nowiki_sample": "Endsæt skrevselenger her søm ekke skal redigær påke wikiskrevselenger",
-       "nowiki_tip": "Ekke wikiskrevselenger utse",
-       "image_tip": "Endlejret billet",
-       "media_tip": "Henvesnenge til multimediagøret",
-       "sig_tip": "Din håndstep ve tidsstep",
-       "hr_tip": "Plat lenje (brug den sparsåmt)",
-       "summary": "Beskrevelse:",
-       "subject": "Emne/åverskreft:",
-       "minoredit": "Dette'r en mendre æller lile ændrenge.",
-       "watchthis": "Åvervåg denne ertikel",
-       "savearticle": "Gem side",
-       "preview": "Førhåndsvesnenge",
-       "showpreview": "Førhåndsvesnenge",
-       "showdiff": "Ves ændrenger",
-       "anoneditwarning": "Du arbejder uden at være loĝget på. Estedet før brugernav veses så'n IP-adresse i'n hersenengerskigt.",
-       "summary-preview": "Førhåndsvesnenge åf beskrevelselejne:",
+       "loginlanguagelabel": "Spraw: $1",
+       "pt-login": "Logg på",
+       "pt-login-button": "Logg på",
+       "pt-createaccount": "Oprett konto",
+       "pt-userlogout": "Logg å",
+       "retypenew": "Djentast ny adgångskode",
+       "resetpass-submit-cancel": "Åbryd",
+       "passwordreset": "Nullstell adgångskode",
+       "bold_sample": "Fied tekst",
+       "bold_tip": "Fied tekst",
+       "italic_sample": "Kursiw tekst",
+       "italic_tip": "Kursiw tekst",
+       "link_sample": "Henwisneng",
+       "link_tip": "Intern henwisneng",
+       "extlink_sample": "http://www.example.com titel på henwisneng",
+       "extlink_tip": "Ekstern henwisneng (husk http:// præfiks)",
+       "headline_sample": "Tekst te öweskrift",
+       "headline_tip": "Typ 2-øweskrift",
+       "nowiki_sample": "Insätt tekst her som ett skal wikiformatiirs",
+       "nowiki_tip": "Ignoriir wikiformatiireng",
+       "image_tip": "Inlejretj fil",
+       "media_tip": "Henwisneng te fil",
+       "sig_tip": "Din signatur mä tidsstempel",
+       "hr_tip": "Horisontal linje (brug den spårsom)",
+       "summary": "Sammelfattneng:",
+       "subject": "Emn/öweskrift:",
+       "minoredit": "Detj ä en lie øndreng",
+       "watchthis": "Öwewåg siden",
+       "savearticle": "Slo siid op",
+       "preview": "Forhånjswisneng",
+       "showpreview": "Forhånjswisneng",
+       "showdiff": "Wis øndrenge",
+       "anoneditwarning": "<strong>Advarsel:</strong> Du ä ett loggen på. Din IP-adress will blyw offentjlien tedjängli, hwes du foretår noe øndrenge. Hwes du <strong>[$1 logge på]</strong> elle <strong>[$2 oprette e konto]</strong> will din redigiirenge blyw tilskrøwen det brugenaun, å du will få flier anjer fordiel.",
+       "summary-preview": "Forhånjswisneng å beskriiwelsen:",
        "blockedtext": "'''Dit brugernav æller din IP-adresse er blevet blokeret.'''\n\nÆ blokerenge er lavet åf $1. Æ begrundelse er ''$2''.\n\nÆ blokerenge starter: $8\nÆ blokerenge udløber: $6\nÆ blokerenge er rettet mod: $7\n\nDu ken kåle $1 æller en åf de andre [[{{MediaWiki:Grouppage-sysop}}|administratårer]] før at diskutere æ blokerenge.\nDu ken ekke bruge æ funksje 'e-mail til denne bruger' vemendre der er ångevet en gyldig email-addresse i dine\n[[Special:Preferences|kontoendstellenger]]. Din nuværende IP-addresse er $3, og blokerengs-ID er #$5. Ångev venlegst en æller begge i åle henvendelser.",
+       "loginreqlink": "logg på",
        "newarticle": "(Ny)",
-       "newarticletext": "'''{{SITENAME}} har endnu ekke nogen {{NAMESPACE}}-side ve nav {{PAGENAME}}.'''<br /> Du ken begynde en side ve at skreve i'n boks herunder. (se'n [$1 hjælp] før yderligere åplysnenger).<br /> Æller du ken [[Special:Search/{{PAGENAME}}|søĝe æfter {{PAGENAME}} i {{SITENAME}}].<br /> Ves det ekke var din meneng, så tryk på æ '''Tilbage'''- æller æ '''Back'''-knåp.",
-       "noarticletext": "'''{{SITENAME}} har ekke nogen side ve prånt dette nav.'''\n* Du ken '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} starte æ side {{PAGENAME}}]'''\n* Æller [[Special:Search/{{PAGENAME}}|søĝe æfter {{PAGENAME}}]] i andre ertikler\n----\n* Ves du har åprettet denne ertikel endenfør de sedste få minutter, så ken de skyldes at der er ledt førsenkelse i'n åpdaterenge åf {{SITENAME}}s cache. Vent venligst og tjek igen senere'n ertikel'm dukker åp, enden du førsøĝer at åprette'n ertikel igen.",
+       "newarticletext": "Du hår fuljtj en henwisneng te en siid som ennu ett finjs.\nFor å oprett siden skal du bedjynn å skriiw i boksi nierfor\n(sie [$1 hjälpsiden] for ytelia informasjon).\nHwes du ä her we en fejl, så trykk på '''tebag'''-knappi å dej browser.",
+       "noarticletext": "Där ä i yeblikke ett noe tekst på siden.\nDu kan [[Special:Search/{{PAGENAME}}|syeg ette sidenaune]] på anjer side,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} syeg i relatiirtje logge]\nelle [{{fullurl:{{FULLPAGENAME}}|action=edit}} oprett siden]</span>.",
+       "noarticletext-nopermission": "Där ä i yeblikke ett no tekst på siden.\nDu kan [[Special:Search/{{PAGENAME}}|syeg ette sidenaune]] på anje side,\nelle <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} syeg i relatiirtje loggliste]</span>,\nmen du hår ett tillædels te å oprett siden.",
        "previewnote": "'''Husk at dette er kun en førhåndsvesnenge, æ side er ekke gemt endnu!'''",
-       "editing": "Redigærer $1",
-       "editingsection": "Redigærer $1 (åfsnet)",
-       "copyrightwarning": "'''Husk: åpskrev engen websider, søm ekke tilhører dig selv, brug engen åphavsretsligt beskyttede værker uden tilladelse frå'n ejer!'''<br />\nDu lover os hermed, at du selv '''har skrevet skrevselenger''', at skrevselenger tilhører ålmenheden, er ('''åpværer hus'''), æller at æ '''åphavsrets-endehaver''' har gevet sen '''tilladelse'''. Ves denne skrevselenger ålerede er åfentliggkort andre steder, skrev det venligst på æ diskusjesside.\n<i>Bemærk venligst, at ål {{SITENAME}}-ertikler åtomatisk står under „$2“ (se $1 før lileskrevselenger). Ves du ekke vel, at dit arbejde her ændres og udbredes åf andre, så tryk ekke på „Gem“.</i>",
-       "templatesused": "Skablåner der er brugt på denne side:",
+       "editing": "Redigiire $1",
+       "creating": "Oprette $1",
+       "editingsection": "Redigiire $1 (åsnit)",
+       "editingcomment": "Redigiire $1 (ny åsnit)",
+       "editconflict": "Redigiirengskonflikt: $1",
+       "copyrightwarning": "Bemærk wenlist å åll bidraw te {{SITENAME}} ä å betrakt som utdjøwen unje $2 (se $1 for detalje).\nHwes du ett onske å din tekst skal utsätts for nådesløs redigiirenge å å den kan blyw kopiiirtj ette forgodtbefinjenje, så skal du ett placiir den her.<br />\nDu låwe os åsså, å du siel hår forfatten teksten elle hår kopiiirtj den fra en public domain-tjelj elle en tilswarenje fri tjelj.\n'''Lägg åller material her som ä beskøttetj å anjas ophawsrett uen dæes tillædels!'''",
+       "templatesused": "{{PLURAL:$1|Skabelon|Skabelone}} som ä brugtj på siden:",
        "templatesusedpreview": "Følgende skablåner bruges åf denne ertikelførhåndsvesnenge:",
-       "template-protected": "(skrevebeskyttet)",
-       "template-semiprotected": "(skrevebeskyttet før ekke ånmeldte og nye brugere)",
-       "nocreatetext": "Æ'n åpdiin har begrænset åprettelse åf nye sider. Bestående sider ken ændres æller [[Special:UserLogin|loĝge på]].",
-       "recreate-moveddeleted-warn": "'''Advarsel: Du er ve at genskabe en tidligere slettet side.'''\n\nÅvervej det'm er passende at genåprette'n side. De slettede hersenenger før\ndenne side er vest nedenfør:",
-       "viewpagelogs": "Ves loglister før denne side",
-       "currentrev": "Nuværende hersenenge",
-       "revisionasof": "Hersenenger frå $1",
-       "revision-info": "Hersenenge frå $1 til $2",
-       "previousrevision": "←Ældre hersenenge",
-       "nextrevision": "Nyere hersenenge→",
-       "currentrevisionlink": "se nuværende hersenenge",
-       "cur": "nuværende",
-       "last": "forrige",
-       "page_first": "Startem",
-       "page_last": "Enden",
-       "histlegend": "Førklårenge: (nuværende) = førskel til den nuværende\nhersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre ændrenge",
-       "histfirst": "Ældste",
-       "histlast": "Nyeste",
-       "history-feed-item-nocomment": "$1 ve $2",
-       "history-title": "Hersengsskigte før \"$1\"",
-       "lineno": "Lenje $1:",
-       "compareselectedversions": "Sammenlign valgte hersenenger",
-       "editundo": "baĝgøt",
-       "prevn": "førge {{PLURAL:$1|$1}}",
-       "nextn": "nægste {{PLURAL:$1|$1}}",
-       "viewprevnext": "Ves ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchall": "ål",
-       "preferences": "Endstellenger",
-       "mypreferences": "Endstellenger",
-       "skin-preview": "Førhåndsvesnenge",
+       "template-protected": "(skriiwbeskøttetj)",
+       "template-semiprotected": "(dielwis beskyttetj)",
+       "hiddencategories": "Siden ä i {{PLURAL:$1|en sjulen kategori|$1 sjulen kategorie}}:",
+       "nocreatetext": "Serveri hår begrænstj oprettels å nyj side. Bestoenje side kan øndas elle [[Special:UserLogin|logg på]].",
+       "permissionserrorstext-withaction": "Du hår ett rettihede te å $2 å följenje {{PLURAL:$1|grunj}}:",
+       "recreate-moveddeleted-warn": "'''Advarsel: Du ä we å djenskab en tidlia sletten siid.'''\n\nÖwewæj om dä ä passenje å djenoprett siden. Slettnengs- å flyttlogger for siden ä wisen nierfor.",
+       "moveddeleted-notice": "Siden ä bløwen sletten.\nSlettnengs- å flyttlogger for siden ä wisen nierfor.",
+       "postedit-confirmation-saved": "Din redigiireng ä djiemen.",
+       "content-model-wikitext": "wikitekst",
+       "content-model-text": "ållminneli tekst",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Tomm objekt",
+       "content-json-empty-array": "Tomm array",
+       "viewpagelogs": "Wis loggliste for denn siid",
+       "currentrev": "Nuwærenje versjon",
+       "currentrev-asof": "Nuwærenje versjon fra $1",
+       "revisionasof": "Versjonen fra $1",
+       "revision-info": "Versjon fra $1 å $2 {{GENDER:$6|$2}}$7",
+       "previousrevision": "←Äälja versjon",
+       "nextrevision": "Nya versjon→",
+       "currentrevisionlink": "sie nuwærenje versjon",
+       "cur": "nuwærenje",
+       "last": "förri",
+       "page_first": "fösjt",
+       "page_last": "sist",
+       "histlegend": "Selektiir forskell: Markiir radiobokser å versjone som du will jämnför å trykk på enter elle knappi på bueni.<br />\n\nForklareng: <strong>({{int:cur}})</strong> = forskell te den nuwærenje versjon, <strong>({{int:last}})</strong> = forskell te den förri versjon, <strong>{{int:minoreditletter}}</strong> = lie øndreng.",
+       "histfirst": "älsti",
+       "histlast": "nysti",
+       "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
+       "history-feed-title": "Versjonshistori",
+       "history-feed-item-nocomment": "$1 mä $2",
+       "rev-delundel": "ønda sijtbarhed",
+       "history-title": "$1: Versjonshistorik",
+       "difference-title": "Forskell mellem versjone å \"$1\"",
+       "lineno": "Linje $1:",
+       "compareselectedversions": "Djenför walgtje versjone",
+       "editundo": "fjän redigiireng",
+       "diff-multi-sameuser": "({{PLURAL:$1|En mellemliggenje versjon|$1 mellemliggenje versjone}} å sam brugari wises ett)",
+       "searchresults": "Syegresultate",
+       "searchresults-title": "Syegresultate for \"$1\"",
+       "prevn": "förri {{PLURAL:$1|$1}}",
+       "nextn": "nästi {{PLURAL:$1|$1}}",
+       "nextn-title": "Nästi {{PLURAL:$1|resultat|$1 resultate}}",
+       "shown-title": "Wis $1 {{PLURAL:$1|resultat|resultate}} pro siid",
+       "viewprevnext": "Wis ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Oprett siden \"[[:$1]]\" på wikien!</strong> {{PLURAL:$2|0=|Sie åsså siden som bløw funjen for din syegneng.|Sie åsså syegresultater som bløw funjen.}}",
+       "searchprofile-articles": "Inholjsside",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Ållt",
+       "searchprofile-advanced": "Avanciirtj",
+       "searchprofile-articles-tooltip": "Syeg i $1",
+       "searchprofile-images-tooltip": "Syeg ett file",
+       "searchprofile-everything-tooltip": "Syeg i ållt inholj (inklusiw diskusjonsside)",
+       "searchprofile-advanced-tooltip": "Syeg i bestemtje naunrum",
+       "search-result-size": "$1 ({{PLURAL:$2|1 uerd|$2 uerd}})",
+       "search-redirect": "(omdirigiireng $1)",
+       "search-section": "(åsnit $1)",
+       "search-suggest": "Mientje du: $1",
+       "search-interwiki-caption": "Systeprojekte",
+       "search-interwiki-default": "Resultate fra $1:",
+       "search-interwiki-more": "(mier)",
+       "search-relatedarticle": "Relatiirtj",
+       "searchrelated": "relatiirtj",
+       "searchall": "åll",
+       "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> å <strong>$3</strong>|Resultat <strong>$1 - $2</strong> å <strong>$3</strong>}}",
+       "search-nonefound": "Syegnengen djij ien resultate.",
+       "powersearch-ns": "Syeg i naunrummen:",
+       "preferences": "Instellenge",
+       "mypreferences": "Instellenge",
+       "prefs-skin": "Utsienje",
+       "skin-preview": "Forhånjswisneng",
+       "prefs-misc": "Forskelli",
+       "prefs-resetpass": "Skift adgångskode",
+       "prefs-changeemail": "Ønda e-mailadress",
+       "prefs-setemail": "Åndjie en e-mailadress",
+       "prefs-email": "Instellenge for e-mail",
+       "prefs-rendering": "Utsienje",
+       "saveprefs": "Djiem instellenge",
+       "restoreprefs": "Djensätt åll standardinstellenge (i åll seksjone)",
+       "prefs-editing": "Redigiireng",
+       "rows": "Räkke:",
+       "columns": "Kolonne:",
+       "searchresultshead": "Syegresultate",
+       "stub-threshold": "Græns for stumplinkformatiireng ($1):",
+       "stub-threshold-sample-link": "eksempel",
+       "stub-threshold-disabled": "Deaktiviirtj",
+       "recentchangesdays": "Åntal daw som skal wises i siensti øndrenge:",
+       "recentchangesdays-max": "Maksimal $1 {{PLURAL:$1|daw}}",
+       "recentchangescount": "Åntal redigiirenge som skal wises som standard:",
+       "prefs-help-recentchangescount": "Dä djälje for siensti øndrenge, historike å logge.",
+       "prefs-help-watchlist-token2": "Detj ä hemmeli lygli te webfeed å din öwewågnengslist.\nHwes anjer tjenne den, will man wær istånj te å läs din öwewågnengslist, så diel den ett.\n[[Special:ResetTokens|Klikk her hwes du hår brug å nullstell den]].",
+       "savedprefs": "Din instellenge ä bløwen djiemen.",
+       "timezonelegend": "Tidszone:",
+       "localtime": "Lokaltiid:",
+       "timezoneuseserverdefault": "Brug wikiis standardinstelleng ($1)",
+       "timezoneuseoffset": "Ånj (åndjie forskell)",
+       "servertime": "Serveris tiid:",
+       "guesstimezone": "Hentj tidszone fra browseri",
+       "timezoneregion-africa": "Afrika",
+       "timezoneregion-america": "Amerika",
+       "timezoneregion-antarctica": "Antarktis",
+       "timezoneregion-arctic": "Arktis",
+       "timezoneregion-asia": "Asien",
+       "timezoneregion-atlantic": "Atlantjerhawe",
+       "timezoneregion-australia": "Australien",
+       "timezoneregion-europe": "Europa",
+       "timezoneregion-indian": "Indisk Ocean",
+       "timezoneregion-pacific": "Stillhawe",
+       "allowemail": "Tillæd e-mail fra anjer bruga",
+       "prefs-searchoptions": "Syeg",
+       "prefs-namespaces": "Naunrum",
+       "default": "standard",
+       "prefs-files": "File",
+       "prefs-custom-css": "Personli CSS",
+       "prefs-custom-js": "Personli JavaScript",
+       "prefs-common-css-js": "Fælls CSS/JS for åll utsienje:",
+       "prefs-reset-intro": "Du kan brug siden te å tebagstell åll din instellenge te standardinstellenger.\nDä kan ett djendjörs.",
+       "prefs-emailconfirm-label": "Bekräftels å e-mail:",
        "youremail": "E-mail:",
-       "yourrealname": "Dit rigtege navn*",
-       "prefs-help-realname": "* <strong>Dit rigtege navn</strong> (valgfrit): Hves du vælger at åplyse dit navn hvil dette bleve brugt til at tilskreve dig dit arbejde.",
-       "grouppage-sysop": "{{ns:project}}:Administråtorer",
-       "newuserlogpage": "Brugeråprettelseslog",
-       "newuserlogpagetext": "Dett'er en log åver de senest åprettede brugere.",
-       "rightslog": "Rettigheds-logbåĝ",
-       "nchanges": "$1 {{PLURAL:$1|ændrenge|ændrenger}}",
-       "recentchanges": "Seneste ændrenger",
-       "recentchanges-feed-description": "Ve dette fiid ken du følge de seneste ændrenger på {{SITENAME}}.",
-       "rcnotefrom": "Nedenfør ses ændrengerne frå '''$2''' til '''$1''' vest.",
-       "rclistfrom": "Ves nye ændrenger startende frå $3 $2",
-       "rcshowhideminor": "$1 lile ændrenger",
-       "rcshowhidebots": "$1 råbotter",
-       "rcshowhideliu": "$1 regestrerede brugere",
-       "rcshowhideanons": "$1 anonyme brugere",
-       "rcshowhidepatr": "$1 bekiiknurede ændrenger",
-       "rcshowhidemine": "$1 egne bidråg",
-       "rclinks": "Ves seneste $1 ændrenger i de sedste $2 dåg<br />$3",
-       "diff": "førskel",
-       "hist": "skigte",
-       "hide": "skjul",
-       "show": "ves",
+       "username": "{{GENDER:$1|Brugenaun}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Mälemm}} å {{PLURAL:$1|gruppen|grupper}}:",
+       "prefs-registration": "Registriirengstidspuntj:",
+       "yourrealname": "Det rijti naun:",
+       "yourlanguage": "Spraw:",
+       "yourvariant": "Sprawvariantj for inholj:",
+       "prefs-help-variant": "Sprawvaruabtheb elle rettskriiwneng, som du forträkke, å denn wikis inholjsside wises i.",
+       "yournick": "Ny signatur:",
+       "prefs-help-signature": "Kommentare på diskusjonsside bör signiirs mä \"<nowiki>~~~~</nowiki>\" som will blyw konvertiirtj te din signatur å e tidsstempel.",
+       "badsig": "Syntaksi i signaturen ä udjylji; kontrolliir wenlist den brugtje HTML.",
+       "badsiglength": "Din signatur ä for lång. Den ma hyest inholj $1 {{PLURAL:$1|tejn}}.",
+       "yourgender": "Hwant forträkke du å blyw beskriiwen?",
+       "prefs-help-realname": "Åndjiels å rijti naun ä walgfritj.\nHwes du wælge å oplys det naun, wil dä blyw brugtj te å tilskriiw dej det arbejt.",
+       "prefs-editor": "Redigiirengsprogramme",
+       "prefs-preview": "Forhånjswisneng",
+       "prefs-advancedrc": "Avanciirtje instellinge",
+       "prefs-advancedrendering": "Avanciirtje instellinge",
+       "prefs-advancedsearchoptions": "Avanciirtje instellinge",
+       "prefs-advancedwatchlist": "Avanciirtje instellinge",
+       "prefs-displayrc": "Instellenge for wisneng",
+       "prefs-displaywatchlist": "Wisnengsmulihede",
+       "prefs-tokenwatchlist": "Märk",
+       "prefs-diffs": "Forskell",
+       "grouppage-sysop": "{{ns:project}}:Administrore",
+       "right-writeapi": "Brug redigiirengsdieli å API",
+       "newuserlogpage": "Brugeoprettelslogg",
+       "newuserlogpagetext": "Detj ä i logg öwe di siensti opretten bruga.",
+       "rightslog": "Rettihedslogg",
+       "action-history": "sie historik for siden",
+       "nchanges": "$1 {{PLURAL:$1|øndreng|øndrenge}}",
+       "enhancedrc-history": "historik",
+       "recentchanges": "Siensti øndrenge",
+       "recentchanges-legend": "Instellenge for siensti øndrenge",
+       "recentchanges-summary": "På denn siid kan du följ di siensti øndrenge på '''{{SITENAME}}'''.",
+       "recentchanges-feed-description": "Mä denn feed kan du följ di siensti øndrenge på {{SITENAME}}.",
+       "recentchanges-label-newpage": "Redigiirengen oprettje en ny siid",
+       "recentchanges-label-minor": "Detj ä en lie øndreng",
+       "recentchanges-label-bot": "Denn redigiireng bløw utförtj å i robott",
+       "recentchanges-label-unpatrolled": "Redigiireng ä ennu ett bløwen patruljiirtj.",
+       "recentchanges-label-plusminus": "Störrelsen på siden bløw øndan mä detj åntal bytes",
+       "recentchanges-legend-heading": "'''Forklareng:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sie åsså [[Special:NewPages|listen öwe nyj side]])",
+       "rcnotefrom": "Nierfor ä op te '''$1''' {{PLURAL:$5|øndreng|øndrenge}} sien '''$2''' wisen.",
+       "rclistfrom": "Wis nyj øndrenge startenje fra $3 kl. $2",
+       "rcshowhideminor": "$1 lie øndrenge",
+       "rcshowhideminor-show": "Wis",
+       "rcshowhideminor-hide": "Sjul",
+       "rcshowhidebots": "$1 robotte",
+       "rcshowhidebots-show": "Sjul",
+       "rcshowhidebots-hide": "Sjul",
+       "rcshowhideliu": "$1 registriirtje bruga",
+       "rcshowhideliu-show": "Wis",
+       "rcshowhideliu-hide": "Sjul",
+       "rcshowhideanons": "$1 anonym bruga",
+       "rcshowhideanons-show": "Wis",
+       "rcshowhideanons-hide": "Sjul",
+       "rcshowhidepatr": "$1 kontrolliirtje øndrenge",
+       "rcshowhidepatr-show": "Wis",
+       "rcshowhidepatr-hide": "Sjul",
+       "rcshowhidemine": "$1 ejne bidraw",
+       "rcshowhidemine-show": "Wis",
+       "rcshowhidemine-hide": "Sjul",
+       "rclinks": "Wis siensti $1 øndrenge i di sisti $2 daw<br />$3",
+       "diff": "forskell",
+       "hist": "historik",
+       "hide": "Sjul",
+       "show": "Wis",
        "minoreditletter": "l",
        "newpageletter": "N",
        "boteditletter": "b",
-       "recentchangeslinked": "Relaterede ændrenger",
-       "recentchangeslinked-feed": "Relaterede ændrenger",
-       "recentchangeslinked-toolbox": "Relaterede ændrenger",
-       "recentchangeslinked-title": "Ændrenger der vegånde til \"$1\"",
-       "recentchangeslinked-summary": "Denne sonstside beser de seneste ændrenger på de sider der henveses til. Sider på din åvervågnengsliste er vest ve '''fed''' skreft.",
-       "upload": "Læĝ æ billet åp",
-       "uploadbtn": "Læĝ æ gøret åp",
-       "uploadlogpage": "Åplægnengslog",
-       "listfiles": "Billetliste",
-       "file-anchor-link": "Billet",
-       "filehist": "Billetskigt",
-       "filehist-help": "Klik på'n dato/tid før at se den hersenenge åf gøret.",
-       "filehist-current": "nuværende",
-       "filehist-datetime": "Dato/tid",
-       "filehist-user": "Bruger",
-       "filehist-dimensions": "Treflåksjener",
-       "filehist-filesize": "Gøretstørrelse",
-       "filehist-comment": "Biskrevselenge",
-       "imagelinks": "Billethenvesnenger",
-       "linkstoimage": "De følgende sider henveser til dette billet:",
-       "nolinkstoimage": "Der er engen sider der henveser til dette billet.",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ette øndrengen",
+       "recentchangeslinked": "Relatiirtje øndrenge",
+       "recentchangeslinked-feed": "Relatiirtje øndrenge",
+       "recentchangeslinked-toolbox": "Relatiirtje øndrenge",
+       "recentchangeslinked-title": "Øndrenge som relatiire te \"$1\"",
+       "recentchangeslinked-summary": "Detj ä en list owe di siensti øndrenge å side, där links til fra en bestemtj siid (elle mälemme å en bestemtj kategori).\nSide på [[Special:Watchlist|din owewågnengslist]] ä wistj mä \"fied skrift\".",
+       "recentchangeslinked-page": "Sidenaun:",
+       "recentchangeslinked-to": "Wis øndrenge i side som henwise te åndjøwen siden i stæj",
+       "upload": "Lägg i fil op",
+       "uploadbtn": "Lägg i fil op",
+       "uploadlogpage": "Opläggnengslogg",
+       "filedesc": "Beskriiwels",
+       "license-header": "Licensiireng",
+       "imgfile": "fil",
+       "listfiles": "Fillist",
+       "file-anchor-link": "Fil",
+       "filehist": "Filhistorik",
+       "filehist-help": "Klikk på e dato/tid for å sietj versjonen å fili.",
+       "filehist-current": "nuwærenje",
+       "filehist-datetime": "Dato/tiid",
+       "filehist-thumb": "Thumbnail",
+       "filehist-thumbtext": "Thumbnail å versjonen fra $1",
+       "filehist-user": "Bruge",
+       "filehist-dimensions": "Dimensjone",
+       "filehist-filesize": "Filstörrels",
+       "filehist-comment": "Kommentar",
+       "imagelinks": "Filånwenjels",
+       "linkstoimage": "{{PLURAL:$1|Den följenje siid|Di följenje $1 side}} henwise te denn fil:",
+       "nolinkstoimage": "Där ä ien side som henwise te filen.",
        "sharedupload": "Denne gøret er en fælles læĝenge og ken bruges åf andre projekter.",
-       "uploadnewversion-linktext": "Læĝ en ny hersenenge åf denne gøret åp",
-       "mimesearch": "Søĝe æfter MIME-sårt",
-       "listredirects": "Henvesnengsliste",
-       "unusedtemplates": "Ekke brugte skablåner",
-       "randompage": "Tilfældig ertikel",
-       "randomredirect": "Tilfældige henvesnenger",
-       "statistics": "Sensje",
-       "doubleredirects": "Dåbbelte åmstyrenger",
-       "brokenredirects": "Bråken åmstyrenger",
-       "withoutinterwiki": "Sider uden henvesnenger til andre språĝ",
-       "fewestrevisions": "Sider ve de færreste hersenenger",
-       "nbytes": "$1 {{PLURAL:$1|åg|åger}}",
-       "nlinks": "{{PLURAL:$1|1 henvesnenge|$1 henvesnenger}}",
-       "nmembers": "- {{PLURAL:$1|1 ertikel|$1 ertikler}}",
-       "lonelypages": "Førældreløse ertikler",
-       "uncategorizedpages": "Uklyngede sider",
-       "uncategorizedcategories": "Uklyngede klynger",
-       "uncategorizedimages": "Ekke klyngede gøret",
-       "uncategorizedtemplates": "Ekke klyngede skablåner",
-       "unusedcategories": "Ubrugte klynger",
-       "unusedimages": "Ubrugte billeter",
-       "wantedcategories": "Brugte men ekke ånlagte klynger",
-       "wantedpages": "Ønskede ertikler",
-       "mostlinked": "Sider ve flest henvesnenger",
-       "mostlinkedcategories": "Mest brugte klynger",
-       "mostlinkedtemplates": "Hyppigst brugte skablåner",
-       "mostcategories": "Mest brugte sider",
-       "mostimages": "Mest brugte gøret",
-       "mostrevisions": "Sider ve de fleste ændrenger",
-       "prefixindex": "Åle sider (ve førgøret)",
-       "shortpages": "Kårte ertikler",
-       "longpages": "Långe ertikler",
-       "deadendpages": "Blendgydesider",
-       "protectedpages": "Skrevebeskyttede sider",
-       "listusers": "Brugerliste",
-       "newpages": "Nyeste ertikler",
-       "ancientpages": "Ældste ertikler",
-       "move": "Flyt",
-       "movethispage": "Flyt side",
-       "booksources": "Boĝkelder",
-       "specialloguserlabel": "Bruger:",
-       "speciallogtitlelabel": "Skrevselenge:",
-       "log": "Loglister",
-       "all-logs-page": "Åle loglister",
-       "allpages": "Åle ertikler",
-       "nextpage": "Næste side ($1)",
-       "prevpage": "Førge side ($1)",
-       "allpagesfrom": "Ves sider startende frå:",
-       "allarticles": "Åle ertikler",
-       "allpagessubmit": "Ves",
-       "allpagesprefix": "Ves sider ve førgøret:",
-       "categories": "Klynger",
-       "deletedcontributions": "Slettede brugerbidråg",
-       "deletedcontributions-title": "Slettede brugerbidråg",
-       "linksearch": "Søĝ i weblinks",
-       "linksearch-pat": "Søĝ æfter links til:",
-       "linksearch-ns": "Navnerum:",
-       "linksearch-ok": "Søĝ",
-       "linksearch-text": "Wildkårter søm \"*.wikipedia.org\" ken benyttes.<br />Understøttede pråtåkoller: <code>$1</code>",
-       "linksearch-line": "$2 linker til $1",
-       "linksearch-error": "Wildkårter må ken benyttes i'n stårt åf håstnavnet.",
-       "emailuser": "E-mail til denne bruger",
-       "watchlist": "Åvervågnengsliste",
-       "mywatchlist": "Åvervågnengsliste",
+       "sharedupload-desc-here": "Fili ä fra $1 å kan brugs på anje projekte. \nInholje på dens [$2 filbeskriiwelssiid] där ä wisen herunje.",
+       "uploadnewversion-linktext": "Lägg en ny versjon å fili op",
+       "upload-disallowed-here": "Du kan ett öweskriiw fili.",
+       "mimesearch": "Syeg ette MIME-typ",
+       "listredirects": "Henwisnengslist",
+       "unusedtemplates": "Ubrugtje skabelone",
+       "randompage": "Tefælji siid",
+       "randomredirect": "Tefælji henwisnenge",
+       "statistics": "Statistik",
+       "pageswithprop": "Side mä e side-ejnskåp",
+       "pageswithprop-legend": "Side mä e side-ejnskåp",
+       "doubleredirects": "Doppelt omdirigiirenge",
+       "brokenredirects": "Defekt omdirigiirenge",
+       "withoutinterwiki": "Side uen henwisnenge te anjer spraw",
+       "fewestrevisions": "Sider mä di færsti versjone",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "nlinks": "{{PLURAL:$1|1 henwisneng|$1 henwisnenge}}",
+       "nmembers": "- {{PLURAL:$1|1 mälemm|$1 mälemme}}",
+       "lonelypages": "Forääljaløs side",
+       "uncategorizedpages": "Ukategorisiirtje side",
+       "uncategorizedcategories": "Ukategorisiirtje kategorie",
+       "uncategorizedimages": "Ukategorisiirtje file",
+       "uncategorizedtemplates": "Ukategorisiirtje skabelone",
+       "unusedcategories": "Ubrugtje kategorie",
+       "unusedimages": "Ubrugtje file",
+       "wantedcategories": "Onske kategorie",
+       "wantedpages": "Onske side",
+       "wantedfiles": "Onske file",
+       "wantedtemplates": "Onske skabelone",
+       "mostlinked": "Side mä di fliesti henwisnenge",
+       "mostlinkedcategories": "Miest-brugtje kategorie",
+       "mostlinkedtemplates": "Miest-brugtje side",
+       "mostcategories": "Side mä di fliesti kategorie",
+       "mostimages": "Miest-brugtje file",
+       "mostinterwikis": "Side mä di fliesti interwikilinks",
+       "mostrevisions": "Side mä di fliesti versjone",
+       "prefixindex": "Åll side som bedjynne mä",
+       "shortpages": "Kort side",
+       "longpages": "Lång side",
+       "deadendpages": "Blinjenjside",
+       "protectedpages": "Skriiwbeskøttetj side",
+       "protectedtitles": "Beskøttetj sidenaun",
+       "listusers": "Brugelist",
+       "newpages": "Nysti side",
+       "ancientpages": "Älsti side",
+       "move": "Flytt",
+       "movethispage": "Flytt siden",
+       "pager-older-n": "{{PLURAL:$1|1 äälja|$1 äälja}}",
+       "booksources": "Buegtjilje",
+       "booksources-search-legend": "Syegneng ette byeg",
+       "booksources-search": "Syeg",
+       "specialloguserlabel": "Utförtj å:",
+       "speciallogtitlelabel": "Mol (titel elle {{ns:user}}:brugenaun til bruge):",
+       "log": "Loggliste",
+       "all-logs-page": "Åll offentjli logge",
+       "allpages": "Åll side",
+       "nextpage": "Nästi siid ($1)",
+       "prevpage": "Förri siid ($1)",
+       "allpagesfrom": "Wis side fra å mä:",
+       "allarticles": "Åll side",
+       "allpagessubmit": "Wis",
+       "allpagesprefix": "Wis side som bedjynne mä:",
+       "categories": "Kategorie",
+       "deletedcontributions": "Sletten brugebidraw",
+       "deletedcontributions-title": "Sletten brugebidraw",
+       "linksearch": "Syegneng i ekstern henwisnenge",
+       "linksearch-pat": "Syeg ette links te:",
+       "linksearch-ns": "Naunrum:",
+       "linksearch-ok": "Syeg",
+       "linksearch-text": "Wildcards som \"*.wikipedia.org\" kan benøtts.\nDär skal som minimum åndjies e topnivå-domæn som f. eks. \"*.org\".<br />\n{{PLURAL:$2|Unjestötten protokol|Unjestötten protokolle}}: $1 (bruge automatisk http:// hwes där ett ä åndjøwen no protokol).",
+       "linksearch-line": "$2 linke te $1",
+       "linksearch-error": "Wildcards ma kons benøtts i starti å hostnaune.",
+       "trackingcategories": "Spørengskategorie",
+       "emailuser": "E-mail te bruge",
+       "watchlist": "Öwewågnengslist",
+       "mywatchlist": "Öwewågnengslist",
        "addedwatchtext": "Æ side \"[[:$1]]\" er blevet tilføjet til din [[Special:Watchlist|åvervågningsliste]]. Fremtidige ændrenger til denne side og den tilhørende diskusjeside hvil bleve listet der, og æ side hvil fremstå '''fremhævet''' i'n [[Special:RecentChanges|liste ve de seneste ændrenger]] før at gøre det lettere at finde den. Hves du senere hvilst fjerne'n side frå din åvervågningsliste, så klik \"Fjern åvervågnenge\".",
        "removedwatchtext": "Æ side \"[[:$1]]\" er blevet fjernet frå din åvervågnengsliste.",
-       "watch": "Ã\85vervåg",
-       "watchthispage": "Ã\85vervÃ¥g side",
-       "unwatch": "Fjern åvervågnenge",
+       "watch": "Ã\96wewåg",
+       "watchthispage": "Ã\96wewÃ¥g siden",
+       "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",
-       "watching": "Åvervåge …",
-       "unwatching": "Ekke åvervåge …",
-       "deletepage": "Slet side",
+       "watching": "Tilfye öwewågneng...",
+       "unwatching": "Fjäne öwewågneng...",
+       "deletepage": "Slett siid",
        "historywarning": "Advarsel: Æ side du erst ve at slette har en skigte:",
-       "confirmdeletetext": "Du erst ve permanent at slette en side\næller et billet sammen ve hæle den tilhørende skigte frå'n database. Bekræft venlegst at du virkelg hvilst gøre dette, at du førstårst konsekvenserne, og at du gør dette i åverensstemmelse ve\n[[{{MediaWiki:Policy-url}}]].",
-       "actioncomplete": "Gennemført",
-       "deletedtext": "\"$1\" er slettet. Sæg $2 før en førtegnelse åver de nyeste sletnenger.",
-       "dellogpage": "Sletnengslog",
-       "deletecomment": "Begrundelse:",
-       "deleteotherreason": "Anden/uddybende begrundelse:",
-       "deletereasonotherlist": "Anden begrundelse",
-       "rollbacklink": "fjern redigærenge",
-       "protectlogpage": "Liste åver beskyttede sider",
-       "prot_1movedto2": "[[$1]] flyttet til [[$2]]",
-       "protectcomment": "Begrundelse:",
-       "protectexpiry": "Udløb:",
-       "protect_expiry_invalid": "Æ udløbstiid er ugyldeg.",
-       "protect_expiry_old": "Æ udløbstiid legger i'n førtiid.",
-       "protect-text": "Her ken beskyttelsesståt før æ side '''$1''' ses og ændres.",
-       "protect-locked-access": "Den brugerkonto har ekke de nødvendege rettegheder til at æ ændre sidebeskyttelse. Her er de aktuelle beskyttelsesendstellenger før æ side '''„$1“:'''",
+       "confirmdeletetext": "Du ä we å slett en siid sammel mä hiel dens tilhörenje historik.\nBekräft wenlist å du wirkeli will djör detj, å du forstor konsekvenser, å å du djör dä i öwe-iensstæmmels mä [[{{MediaWiki:Policy-url}}|rettnengslinjer]].",
+       "actioncomplete": "Djennemförtj",
+       "deletedtext": "\"$1\" ä sletten. Sie $2 for en fortejnels öwe di nysti slettnenge.",
+       "dellogpage": "Slettnengslogg",
+       "deletecomment": "Begrunjels:",
+       "deleteotherreason": "Ånj/utdybenje begrunjels:",
+       "deletereasonotherlist": "Ånj begrunjels",
+       "rollbacklink": "roll tebag",
+       "rollbacklinkcount": "tebagför $1 {{PLURAL:$1|redigiireng|redigiirenge}}",
+       "protectlogpage": "Skriiwbeskøttelslogg",
+       "prot_1movedto2": "[[$1]] flytten te [[$2]]",
+       "protectcomment": "Begrunjels:",
+       "protectexpiry": "Utløb:",
+       "protect_expiry_invalid": "Utløbstiden ä udjylji.",
+       "protect_expiry_old": "Utløbstiden ligge i fortiden.",
+       "protect-text": "Her kan beskøttelsstatus for siden '''$1''' sies å øndas.",
+       "protect-locked-access": "Det brugekonto hår ett di nødwenji rettihede te å ønda sidebeskøttelsen. Her ä di aktuell beskøttelsinstellenge for siden '''„$1“:'''",
        "protect-cascadeon": "Denne side er del åf en nedarvet skrevebeskyttelse. Wen er endeholt i nedenstående {{PLURAL:$1|side|sider}}, søm er skrevebeskyttet ve tilvalg åf \"nedarvende sidebeskyttelse\" Æ sidebeskyttelse ken ændres før denne side, det påverker dog ekke'n kaskadespærrenge:",
        "protect-default": "Ål (standård)",
        "protect-fallback": "Kræv \"$1\"-tilladelse",
        "protect-level-autoconfirmed": "Spærrenge før ekke registrærede brugere",
        "protect-level-sysop": "Kan administratårer",
-       "protect-summary-cascade": "nedarvende",
-       "protect-expiring": "til $1 (UTC)",
-       "protect-cascade": "Nedarvende spærrenge – ål skabelåner, søm er endbundet i denne side spærres også.",
-       "protect-cantedit": "Du kenst ekke ændre beskyttelsesnivå før denne side, da du ekke kenst redigære føden.",
-       "protect-expiry-options": "1 tême:1 hour,1 dåĝ:1 day,1 uge:1 week,2 uger:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,ubegrænset:indefinite",
-       "restriction-type": "Beskyttelsesståt",
-       "restriction-level": "Beskyttelseshøjde",
-       "undeletebtn": "Gendan!",
-       "namespace": "Naverum:",
-       "invert": "Næbiiner udvalg",
-       "blanknamespace": "(Ertikler)",
-       "contributions": "Brugerbidråg",
-       "mycontris": "Mine bidråg",
-       "contribsub2": "Før $1 ($2)",
-       "uctop": "(seneste)",
-       "month": "Måned:",
-       "year": "År:",
-       "sp-contributions-newbies-sub": "Før nybegyndere",
-       "sp-contributions-blocklog": "Blokerengslog",
-       "sp-contributions-deleted": "Slettede brugerbidråg",
-       "sp-contributions-talk": "diskusje",
-       "whatlinkshere": "Vat henveser hertil",
-       "whatlinkshere-title": "Sider der henveser til $1",
-       "linkshere": "De følgende sider henveser til '''„[[:$1]]“''':",
-       "nolinkshere": "Engen sider henveser til '''„[[:$1]]“'''.",
-       "isredirect": "åmstyrsside",
-       "istemplate": "Skablånvetagnenge",
-       "whatlinkshere-prev": "{{PLURAL:$1|førge|førge $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|nægste|nægste $1}}",
-       "whatlinkshere-links": "← henvesnenger",
-       "blockip": "Bloker bruger",
-       "ipboptions": "1 tême:1 hour,2 têmer:2 hours,6 têmer:6 hours,1 dåĝ:1 day,3 dåĝ:3 days,1 uge:1 week,2 uger:2 weeks,1 måned:1 month,3 måneder:3 months,1 år:1 year,ubegrænset:indefinite",
-       "ipblocklist": "Blokerede IP-adresser og brugernave",
-       "blocklink": "blåker",
-       "unblocklink": "åphæv blokerenge",
-       "contribslink": "bidråĝ",
-       "blocklogpage": "Blokerengslog",
-       "blocklogentry": "blokerede \"[[$1]]\" ve'n udløbstid på $2 $3",
+       "protect-summary-cascade": "nierarwenje",
+       "protect-expiring": "te $1 (UTC)",
+       "protect-cascade": "Beskøtt side som ä inkludiirtj på siden (nierarwenje beskøttels)",
+       "protect-cantedit": "Du kan ett ønda beskøttelsnivå for siden, fodä du ett hår tillædels te å redigiir den.",
+       "protect-expiry-options": "1 tiem:1 hour,1 daw:1 day,1 ug:1 week,2 uge:2 weeks,1 månj:1 month,3 månje:3 months,6 månje:6 months,1 or:1 year,ubegrænstj:infinite",
+       "restriction-type": "Beskøttelsstatus",
+       "restriction-level": "Beskøttelsnivå:",
+       "undeletebtn": "Djiensatt!",
+       "namespace": "Naunrum:",
+       "invert": "Utlokk walgtj naunrum",
+       "tooltip-invert": "Åkryds feltje for å sjul øndrenge te side i valgtje naunrume (å tilknøtten naunrume, hwes feltje åsså ä åkrydsen)",
+       "namespace_association": "Tilknøtten naunrum",
+       "tooltip-namespace_association": "Åkryds feltje for åsså å inkludiir diskusjons- elle emnnaunrume, som ä tilknøtten valgtje naunrume",
+       "blanknamespace": "(Hwoet)",
+       "contributions": "{{GENDER:$1|Brugebidraw}}",
+       "mycontris": "Bidraw",
+       "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "uctop": "(siensti)",
+       "month": "Månj:",
+       "year": "Or:",
+       "sp-contributions-newbies-sub": "Fra nyj konto",
+       "sp-contributions-blocklog": "blokiirengslogg",
+       "sp-contributions-deleted": "sletten brugebidraw",
+       "sp-contributions-talk": "diskusjon",
+       "whatlinkshere": "Hwa henwise hertil",
+       "whatlinkshere-title": "Side som linke te $1",
+       "whatlinkshere-page": "Siid:",
+       "linkshere": "Di följenje side henwise te '''„[[:$1]]“''':",
+       "nolinkshere": "Ien side henwise te '''„[[:$1]]“'''.",
+       "isredirect": "omdirigiirengssiid",
+       "istemplate": "inlejreng",
+       "isimage": "filhenwisneng",
+       "whatlinkshere-prev": "{{PLURAL:$1|förri|förri $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|nästi|nästi $1}}",
+       "whatlinkshere-links": "← henwisnenge",
+       "whatlinkshere-hideredirs": "$1 omdirigiirenge",
+       "whatlinkshere-hidetrans": "$1 inkludiirenge",
+       "whatlinkshere-hidelinks": "$1 henwisnenge",
+       "whatlinkshere-filters": "Filtjre",
+       "blockip": "Blokiir {{GENDER:$1|bruge}}",
+       "ipboptions": "2 tiem:2 hours,1 daw:1 day,3 daw:3 days,1 ug:1 week,2 uge:2 weeks,1 månj:1 month,3 månje:3 months,6 månje:6 months,1 or:1 year,ubegrænstj:infinite",
+       "ipblocklist": "Blokiirtje bruga",
+       "blocklink": "blokiir",
+       "unblocklink": "ophäw blokiireng",
+       "contribslink": "bidraw",
+       "blocklogpage": "Blokiirengslogg",
+       "blocklogentry": "blokiirtje [[$1]] mä $2 som utløbstiid $3",
        "movepagetext": "Når du brugerst æ formulær herunder hvilst du få omdøbt en side og flyttet æ hæle side han skigte til det nye navn.\nDen gamle titel hvil bleve en omdirigærengsside til den nye titel.\nHenvesnenger til den gamle titel hvil ekke bleve ændret.\nSørg før at tjekke før dåbelte æller dårlege omdirigærenger.\nDu erst ansvarleg før, at ål henvesnenger stadeg pæger derhen, hvår det er æ mænenge de skal pæge.\n\nBemærk at æ side '''ekke''' ken flyttes hves der ålrede er en side ve den nye titel, medmendre den side er tøm æller er en omdirigærenge uden nogen skigte.\nDet betyder at du kenst flytte en side tilbåge hvår den kåm frå, hves du kåmer til at lave en fejl.\n\n'''ADVARSEL!'''\nDette ken være en drastisk og uventet ændrenge før en populær side; vær sekker på, at du førstår konsekvenserne åf dette før du førtsætter.",
-       "movepagetalktext": "Den tilhørende diskusjeside, hves der er en, hvil åtåmatisk bleve flyttet ve'n side '''medmendre:'''\n*Du flytter æ side til et andet navnerum,\n*En ekke-tøm diskusjeside ålrede eksisterer under det nye navn, æller\n*Du fjerner æ markærenge i'n boks nedenunder.\n\nI disse tilfælde er du nødt til at flytte æller sammenflette'n side manuelt.",
-       "movearticle": "Flyt side:",
-       "newtitle": "Til ny titel:",
-       "move-watch": "Denne side åvervåges",
-       "movepagebtn": "Flyt side",
-       "pagemovedsub": "Flytnenge gennemført",
-       "movepage-moved": "Æ side '''\"$1\" er flyttet til \"$2\"'''",
-       "articleexists": "En side ve det navn eksisterer ålrede, æller det\nnavn du harst valgt er ekke gyldegt. Vælg et andet navn.",
-       "movetalk": "Flyt også'n \"diskusjeside\", hves den eksisterer.",
-       "movelogpage": "Flyttelog",
-       "movereason": "Begrundelse:",
-       "revertmove": "gendan",
-       "export": "Utgøter sider",
-       "allmessages": "Åle beskeder",
-       "thumbnail-more": "Førstør",
-       "thumbnail_error": "Fejl ve åprettelse åf thumbnail: $1",
-       "importlogpage": "Importlog",
-       "tooltip-pt-userpage": "Min brugersside",
-       "tooltip-pt-mytalk": "Min diskusjesside",
-       "tooltip-pt-preferences": "Min endstellenger",
-       "tooltip-pt-watchlist": "Æ liste åver sider du åvervåger før ændrenger.",
-       "tooltip-pt-mycontris": "Æ liste åver dine bidråg",
-       "tooltip-pt-login": "Du åpførdres til at loĝge på, men dat er ekke plechnenge.",
-       "tooltip-pt-logout": "Loĝ åf",
-       "tooltip-ca-talk": "Diskusje æ indholt'm på'n side",
-       "tooltip-ca-edit": "Du ken redigære denne side. Brug venligst førhåndsvesnenge før du gemmer.",
-       "tooltip-ca-addsection": "Tilføj en biskrevselenge til denne diskusje.",
-       "tooltip-ca-viewsource": "Denne side er beskyttet. Du ken kegge på'n keldekode.",
-       "tooltip-ca-protect": "Beskyt denne side",
-       "tooltip-ca-delete": "Slet denne side",
-       "tooltip-ca-move": "Flyt denne side",
-       "tooltip-ca-watch": "Sæt denne side på din åvervågnengsliste",
-       "tooltip-ca-unwatch": "Fjern denne side frå din åvervågnengsliste",
-       "tooltip-search": "Søĝ på {{SITENAME}}",
-       "tooltip-n-mainpage": "Besøĝ æ Førsit",
-       "tooltip-n-portal": "Æ projekt'm, vat du ken gøre, vår tenger fendes",
-       "tooltip-n-currentevents": "Find baĝgrundsinformasje nessende begivenheder'm",
-       "tooltip-n-recentchanges": "Æ liste åver de seneste ændrenger æ'n wiki.",
-       "tooltip-n-randompage": "Gå til æ tilfældig ertikel",
-       "tooltip-n-help": "Vordan gør a ...",
-       "tooltip-t-whatlinkshere": "Liste ve ål sider søm henveser hertil",
-       "tooltip-t-contributions": "Se denne brugers bidråg",
-       "tooltip-t-emailuser": "Send en e-mail til denne bruger",
-       "tooltip-t-upload": "Læĝ æ billet, æ sunnåm æller anden mediagøret åp",
-       "tooltip-t-specialpages": "Liste ve ål sonst sider",
-       "tooltip-ca-nstab-user": "Se'n brugerside",
-       "tooltip-ca-nstab-project": "Vese'n wiki'mside",
-       "tooltip-ca-nstab-image": "Se'n billetside",
-       "tooltip-ca-nstab-template": "Se'n skablån",
-       "tooltip-ca-nstab-help": "Se'n hjælpeside",
-       "tooltip-ca-nstab-category": "Se'n klyngeside",
-       "tooltip-minoredit": "Marker dette søm en mendre ændrenge",
-       "tooltip-save": "Gem dine ændrenger",
-       "tooltip-preview": "Førhånds dine ændrenger, brug venligst denne funksje enden du gemmer!",
-       "tooltip-diff": "Ves velke ændrenger du har lavet i æ skrevselenger.",
-       "tooltip-compareselectedversions": "Se førskellene imellem de to valgte hersenenger åf denne side.",
-       "tooltip-watch": "Tilføj denne side til din åvervågnengsliste",
-       "previousdiff": "← Gå til førge førskel",
-       "nextdiff": "Gå til næste førskel →",
-       "file-info-size": "$1 × $2 pixel, gøretstørrelse: $3, MIME-senenge: $4",
-       "file-nohires": "Engen højere åpløsnenge fundet.",
-       "svg-long-desc": "SVG gøret, wønetstørrelse $1 × $2 pixel, gøretstørrelse: $3",
-       "show-big-image": "Hersenenge i større åpløsnenge",
-       "newimages": "Liste ve de nyeste billeter",
-       "bad_image_list": "Æ førmåt er:\n\nKun endholtet åf æ liste (lenjer startende ve *) bliver brugt. Den første henvesnenge på'n lenje er til det uønskede billet. Æfterfølgende lenker på samme lenjer er undtagelser, dvs. sider vår æ billet må åptræde.",
+       "movepagetalktext": "Den tilhørenje diskusjonssiid, hwes där ä jen, will automatisk blyw flytten mä siden '''mämenja:''' \n*En intj-tomm diskusjonssiid ållried eksistiire unje ny naune, elle\n*Du fjäne markiirengen i boksi nierunje.\n\nI dyss tilfåll ä du nød til å flytt elle sammelflætt siden manuellt.",
+       "newtitle": "Te ny titel:",
+       "move-watch": "Öwewåg siden",
+       "movepagebtn": "Flytt siid",
+       "pagemovedsub": "Flyttneng djennemførtj",
+       "movepage-moved": "Siden '''\"$1\" ä flytten te \"$2\"'''",
+       "articleexists": "En siid mä detj naun eksistiire ållried, elle naune du hår valgtj ä ett djylji. Välg e ånj naun.",
+       "movetalk": "Flytt åsså \"diskusjonssiden\", hwes den eksistiire.",
+       "movelogpage": "Flyttlogg",
+       "movereason": "Begrunjels:",
+       "revertmove": "djensätt",
+       "export": "Eksportiir side",
+       "allmessages": "Åll beskede",
+       "thumbnail-more": "Forstör",
+       "thumbnail_error": "Fejl we oprettels å thumbnail: $1",
+       "importlogpage": "Importlogg",
+       "tooltip-pt-userpage": "Din brugesiid",
+       "tooltip-pt-mytalk": "Din diskusjonssiid",
+       "tooltip-pt-preferences": "Din instellenge",
+       "tooltip-pt-watchlist": "Listen öwe side som du öwewåge for øndrenge",
+       "tooltip-pt-mycontris": "List öwe din bidraw",
+       "tooltip-pt-login": "Du opfordas te å logg på, men dä ä ett obligatorisk.",
+       "tooltip-pt-logout": "Logg å",
+       "tooltip-pt-createaccount": "Du opfordas te å oprett e konto å logg på, men dä ä ett obligatorisk",
+       "tooltip-ca-talk": "Diskusjon om inholje på siden",
+       "tooltip-ca-edit": "Redigiir siden",
+       "tooltip-ca-addsection": "Tilfye e ny åsnit",
+       "tooltip-ca-viewsource": "Siden ä beskyttetj.\nDu kan sietj på tjeljteksten.",
+       "tooltip-ca-history": "Tiidlia versjone å siden",
+       "tooltip-ca-protect": "Beskøtt siden",
+       "tooltip-ca-delete": "Slett siden",
+       "tooltip-ca-move": "Flytt siden",
+       "tooltip-ca-watch": "Sätt siden på din öwewågnengslist",
+       "tooltip-ca-unwatch": "Fjän siden fra din öwewågnengslist",
+       "tooltip-search": "Syeg på {{SITENAME}}",
+       "tooltip-search-go": "Wis en siid mä præcis naune, hwes den finjs",
+       "tooltip-search-fulltext": "Syeg ette side som inholje teksten",
+       "tooltip-p-logo": "Besyeg forsiden",
+       "tooltip-n-mainpage": "Besyeg forsiden",
+       "tooltip-n-mainpage-description": "Besyeg forsiden",
+       "tooltip-n-portal": "Om projekte, hwa du kan djör, hwor tingen finjs",
+       "tooltip-n-currentevents": "Finj bawgrunjsinformasjon om aktuell bedjøwenhede",
+       "tooltip-n-recentchanges": "En list öwe di siensti øndrenge i wikien.",
+       "tooltip-n-randompage": "Go te en tefælji siid",
+       "tooltip-n-help": "Stæjje hwor du finje hjälp",
+       "tooltip-t-whatlinkshere": "En list mä åll side som henwise hertil",
+       "tooltip-t-recentchangeslinked": "Siensti øndrenge i side som denn siid henwise til",
+       "tooltip-feed-atom": "Atom-feed for siden",
+       "tooltip-t-contributions": "Sie bidrawen te brugari",
+       "tooltip-t-emailuser": "Senj i e-mail te brugari",
+       "tooltip-t-upload": "Lägg e bilj elle i ånj mediafil op",
+       "tooltip-t-specialpages": "List öwe åll specialside",
+       "tooltip-t-print": "Printjerwenli utgaw å siden",
+       "tooltip-t-permalink": "Permanentj henwisneng te denn versjon å siden",
+       "tooltip-ca-nstab-main": "Sie inholjssiden",
+       "tooltip-ca-nstab-user": "Sie brugesiden",
+       "tooltip-ca-nstab-special": "Detj ä en specialsiid å kan ett redigiirs",
+       "tooltip-ca-nstab-project": "Wis projektsiden",
+       "tooltip-ca-nstab-image": "Sie filsiden",
+       "tooltip-ca-nstab-template": "Sie skabeloni",
+       "tooltip-ca-nstab-help": "Sie hjälpsiden",
+       "tooltip-ca-nstab-category": "Sie kategorisiden",
+       "tooltip-minoredit": "Markiir detj som en lie øndreng",
+       "tooltip-save": "Djiem din øndrenge",
+       "tooltip-preview": "Forhånjswis din øndrenge, brug wenlist funktionen ien du djieme!",
+       "tooltip-diff": "Wis hwelk øndrenge du hår lawen i teksten.",
+       "tooltip-compareselectedversions": "Sie forskellen imellem di twå walgtje versjone å siden.",
+       "tooltip-watch": "Tilfye siden te din öwewågnengslist",
+       "tooltip-rollback": "\"Rull tebag\" fjäne den sisti bidrawsyes redigiireng(e) å siden mä jet klikk",
+       "tooltip-undo": "\"Fjän redigiireng\" fjän denn redigiireng å åbner redigiirengssiden mä forhånjswisneng.\nDä djie mulihed for å tilfye en begrunjels i beskriiwelsen.",
+       "tooltip-summary": "Intast en kort opsummiireng",
+       "simpleantispam-label": "Anti-spamtjekk.\nUtfyll <strong>ETT</strong> detj!",
+       "pageinfo-toolboxlink": "Opløsnenge om siden",
+       "previousdiff": "← Go te förri øndreng",
+       "nextdiff": "Go te nästi øndreng →",
+       "file-info-size": "$1 × $2 puntje, filstörrels: $3, MIME-typ: $4",
+       "file-nohires": "Ien hya oplösneng funjen.",
+       "svg-long-desc": "SVG fil, basisstörrels $1 × $2 puntjer, störrels: $3",
+       "show-big-image": "Oprinneli fil",
+       "show-big-image-preview": "Störrels å forhånjswisnengen: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Ånj  oplösneng|Anje oplösnenge}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
+       "newimages": "Galleri mä di nysti bilje",
+       "bad_image_list": "Formate ä:\n\nKons inholje å liste (linje startenje mä *) blywe brugtj. Den fösjti henwisneng på en linje ä te uonske bilje. Etteföljenje links på sam linje ä unjtalse, dws. side hwor bilje ma opträ.",
        "metadata": "Metadata",
-       "metadata-help": "Denne gøret endeholder yderligere informasje, der søm regel stammer frå lysnåmer æller den brugte skænner. Ve'n æfterføgende bearbejdnenge ken nogle data være ændret.",
-       "metadata-expand": "Ves udvedede data",
-       "metadata-collapse": "Skjul udvedede data",
-       "metadata-fields": "Æ følgende felter frå EXIF-metadata i denne MediaWiki-beskedskrevselenger veses på billetbeskrevelsessider; yderligere lileskrevselenger ken veses.\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",
-       "namespacesall": "åle",
-       "monthsall": "åle",
-       "watchlisttools-view": "Se ændrede sider i'n åvervågnengsliste",
-       "watchlisttools-edit": "Redigær åvervågnengsliste",
-       "watchlisttools-raw": "Redigær rå åvervågnengsliste",
-       "version": "Informasje MediaWiki'm",
-       "specialpages": "Sonst sider",
-       "expandtemplates": "Engråt templater",
-       "expand_templates_title": "Context titel, før {{SITENAME}}:",
-       "expand_templates_input": "Input skrevselenger:",
-       "expand_templates_output": "Resultåt",
-       "expand_templates_xml_output": "XML output",
-       "expand_templates_ok": "OK",
-       "expand_templates_remove_comments": "Slet kommentår",
-       "expand_templates_generate_xml": "Se XML parse træ",
-       "expand_templates_preview": "Førhåndsvesnenge"
+       "metadata-help": "Denn fil inholje yelia informasjone, di som regel stamme fra digitalkamera elle brugtje scanneri. We en etteföljenje bearbejtneng kan noe data wær øndatj.",
+       "metadata-expand": "Wis utwiiden data",
+       "metadata-collapse": "Sjul utwiiden data",
+       "metadata-fields": "Metadatafeltje inkludiirtj i MediaWiki-systemtekste wises på biljbeskriwelsside nær metadatatabellen ä slotj sammel.\nÖwrije feltje will wær sjultj som standard.\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": "Kamerarettneng",
+       "exif-xresolution": "Horisontal oplösneng",
+       "exif-yresolution": "Vertikal oplösneng",
+       "exif-datetime": "Lawrengstidspuntj",
+       "exif-make": "Kameraproducentj",
+       "exif-model": "Kameramodell",
+       "exif-software": "Brugtj software",
+       "exif-exifversion": "Exif-versjon",
+       "exif-colorspace": "Farwrum",
+       "exif-datetimeoriginal": "Optalstidspuntj",
+       "exif-datetimedigitized": "Digitalisiirengstidspuntj.",
+       "exif-orientation-1": "Normal",
+       "namespacesall": "åll",
+       "monthsall": "åll",
+       "watchlisttools-view": "Sie øndan side i öwewågnengslist",
+       "watchlisttools-edit": "Redigiir öwewågnengslist",
+       "watchlisttools-raw": "Redigiir row öwewågnengslist",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusjon]])",
+       "version": "Informasjon om MediaWiki",
+       "specialpages": "Specialside",
+       "specialpages-group-maintenance": "Weliholjelsside",
+       "specialpages-group-pages": "Sideliste",
+       "tag-filter": "[[Special:Tags|Tag]]filtjer:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|slettetj}} siden $3",
+       "logentry-move-move": "$1 {{GENDER:$2|flyttje}} siden $3 te $4",
+       "logentry-newusers-create": "Brugekontoe $1 bløw {{GENDER:$2|opretten}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|lagtj}} $3 op",
+       "searchsuggest-search": "Syeg",
+       "expandtemplates": "Utfolj skabelone",
+       "expand_templates_title": "Sammelhängstitel, for {{FULLPAGENAME}} åsw.:",
+       "expand_templates_input": "Inputtekst:",
+       "expand_templates_output": "Resultat",
+       "expand_templates_xml_output": "XML-kode",
+       "expand_templates_ok": "Utfolj",
+       "expand_templates_remove_comments": "Slett kommentare",
+       "expand_templates_generate_xml": "Wis analysträj som XML",
+       "expand_templates_preview": "Forhånjswisneng"
 }
index a31af01..1c8a949 100644 (file)
@@ -15,7 +15,8 @@
                        "StefanusRA",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Garisen ngisoré pranala:",
        "mergehistory-go": "Tuduhna suntingan-suntingan sing bisa digabung",
        "mergehistory-submit": "Gabung revisi",
        "mergehistory-empty": "Ora ana revisi sing bisa digabung.",
-       "mergehistory-success": "$3 {{PLURAL:$1|révisi|révisi}} saka [[:$1]] bisa suksès digabung menyang [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$1|révisi|révisi}} saka $1 bisa suksès digabung menyang [[:$2]].",
        "mergehistory-fail": "Ora bisa nggabung sajarah, coba dipriksa manèh kacané lan paramèter wektuné.",
        "mergehistory-no-source": "Kaca sumber $1 ora ana.",
        "mergehistory-no-destination": "Kaca tujuan $1 ora ana.",
        "filerevert-legend": "Balèkna berkas",
        "filerevert-intro": "Panjenengan mbalèkaké '''[[Media:$1|$1]]''' menyang [vèrsi $4 ing $3, $2].",
        "filerevert-comment": "Alesan:",
-       "filerevert-defaultcomment": "Dibalèkaké menyang vèrsi ing $2, $1",
+       "filerevert-defaultcomment": "Dibalèkaké menyang vèrsi ing $2, $1 ($3)",
        "filerevert-submit": "Balèkna",
        "filerevert-success": "'''[[Media:$1|$1]]''' wis dibalèkaké menyang [vèrsi $4 ing $3, $2].",
        "filerevert-badversion": "Ora ana vèrsi lokal sadurungé saka berkas iki mawa stèmpel wektu sing dikarepaké.",
        "movepagetext": "Formulir ing ngisor iki bakal ngowahi jeneng sawijining kaca, mindhah kabèh sajarahé menyang kaca sing anyar. Irah-irahan utawa judhul sing lawas bakal dadi kaca pangalihan menyang irah-irahan sing anyar. Pranala menyang kaca sing lawas ora bakal diowahi; dadi pastèkna dhisik mriksa pangalihan [[Special:DoubleRedirects|dobel]] utawa [[Special:BrokenRedirects|pangalihan sing rusak]] sawisé pamindhahan. Panjenengan sing tanggung jawab mastèkaké menawa kabèh pranala-pranala tetep nyambung ing kaca panujon kaya samesthiné.\n\nGatèkna yèn kaca iki '''ora''' bakal dipindhah yèn wis ana kaca liyané sing nganggo irah-irahan sing anyar, kejaba kaca iku kosong utawa ora nduwé sajarah panyuntingan. Dadi tegesé panjenengan bisa ngowahi jeneng kaca iku manèh kaya sedyakala menawa panjenengan luput, lan panjenengan ora bisa nimpani kaca sing wis ana.\n\n'''PÈNGET!'''\nPerkara iki bisa ngakibataké owah-owahan sing drastis lan ora kaduga kanggo kaca-kaca sing populèr;\npastekaké dhisik panjenengan ngerti konsekwènsi saka panggayuh panjenengan sadurungé dibanjuraké.",
        "movepagetext-noredirectfixer": "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
        "movepagetalktext": "Kaca dhiskusi sing kagandhèng uga bakal dipindhahaké sacara otomatis '''kejaba yèn:'''\n\n*Sawijining kaca dhiskusi sing ora kosong wis ana sangisoring irah-irahan (judhul) anyar, utawa\n*Panjenengan ora maringi tandha cèk ing kothak ing ngisor iki.\n\nIng kasus-kasus iku, yèn panjenengan gayuh, panjenengan bisa mindhahaké utawa nggabung kaca iku sacara manual.",
-       "movearticle": "Pindhah kaca",
        "moveuserpage-warning": "'''Pèngetan:''' Sampéyan arep mindhahaké kaca panganggo. Mangga cathet yèn namung kaca sing bakal dipindhahaké lan panganggo '''ora''' bakal diganti jenengé.",
        "movenologintext": "Panjenengan kudu dadi panganggo sing wis ndaftar lan wis [[Special:UserLogin|mlebu log]] kanggo mindhah kaca.",
        "movenotallowed": "Panjenengan ora pareng ngalihaké kaca.",
        "api-error-badaccess-groups": "Sampéyan ora dililakaké ngunggah berkas nèng wiki iki.",
        "api-error-badtoken": "Kasalahan njero: Token èlèk.",
        "api-error-copyuploaddisabled": "Ngunggah saka URL dipatèni nèng sasana iki.",
-       "api-error-duplicate": "Ana {{PLURAL:$1|[$2 berkas liya]|[$2 pirang-pirang berkas liya]}} sing wis ana nèng situsé saha isiné padha.",
-       "api-error-duplicate-archive": "Ana {{PLURAL:$1|[$2 berkas liya]|[$2 pirang-pirang berkas liya]}} sing wis ana nèng situsé saha isiné padha, nanging {{PLURAL:$1|kuwi|kuwi kabèh}} wis dibusak.",
-       "api-error-duplicate-archive-popup-title": "Gandhakaké {{PLURAL:$1berkas sing wis|berkas sing wis}} dibusak.",
-       "api-error-duplicate-popup-title": "Gandhakaké {{PLURAL:$1berkas|berkas}}.",
+       "api-error-duplicate": "Ana {{PLURAL:$1|berkas liya|pirang-pirang berkas liya}} sing wis ana nèng situsé saha isiné padha.",
+       "api-error-duplicate-archive": "Ana {{PLURAL:$1|berkas liya|pirang-pirang berkas liya}} sing wis ana nèng situsé saha isiné padha, nanging {{PLURAL:$1|kuwi|kuwi kabèh}} wis dibusak.",
        "api-error-empty-file": "Berkas sing Sampéyan kirim kosong.",
        "api-error-emptypage": "Nggawé kaca kosong anyar ora dilikaké.",
        "api-error-fetchfileerror": "Kasalahan njero: Ana sing salah nalika ngètukaké berkas iki.",
index 3366552..1d14786 100644 (file)
@@ -23,7 +23,9 @@
                        "გიორგიმელა",
                        "아라",
                        "Macofe",
-                       "SHOTHA"
+                       "SHOTHA",
+                       "Gi777ga",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "ბმულების ხაზგასმა:",
        "nstab-template": "თარგი",
        "nstab-help": "დახმარება",
        "nstab-category": "კატეგორია",
+       "mainpage-nstab": "მთავარი გვერდი",
        "nosuchaction": "მოქმედება არ არსებობს",
        "nosuchactiontext": "URL-ის მიერ მითითებული მოქმედება მცდარია.\nშესაძლოა შეცდომით აკრიფეთ URL, ან არასწორ ბმულზე გადახვედით.\nაგრეთვე შესაძლოა, {{SITENAME}}-ს მიერ გამოყენებულ პროგრამულ უზრუნველყოფაში იყოს შეცდომა.",
        "nosuchspecialpage": "სპეციალური გვერდი არ არსებობს",
        "actionthrottled": "სიჩქარის შეზღუდვა.",
        "actionthrottledtext": "სპამთან ბრძოლასთან დაკავშირებით აკრძალულია შემდეგი მონაცემების მრავალჯერ გამეორება. გთხოვთ გაიმეოროთ იგი მოგვიანებით.",
        "protectedpagetext": "ეს გვერდი დაბლოკილია რედაქტირებისათვის ან სხვა მოქმედებისათვის.",
-       "viewsourcetext": "თქვენ შეგიძლიათ ნახოთ ამ გვერდის საწყისი ფაილი და მისი ასლი შექმნათ:",
-       "viewyourtext": "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ  '''თქვენი რედაქტირებების''' საწყისი ტექსტი ამ გვერდზე:",
+       "viewsourcetext": "თქვენ შეგიძლიათ ნახოთ ამ გვერდის საწყისი ფაილი და მისი ასლი შექმნათ.",
+       "viewyourtext": "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ  <strong>თქვენი რედაქტირებების</strong> საწყისი ტექსტი ამ გვერდზე:",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "'''ყურადღება:''' თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც. \nიმისათვის, რომ დაამატოთ ან შეცვალოთ თარგმანები ყველა ვიკიში, გთხოვთ, გამოიყენოთ მედიავიკის ლოკალიზაციის პროექტი [//translatewiki.net/ translatewiki.net].",
        "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [//translatewiki.net/ translatewiki.net].",
        "createacct-captcha": "უსაფრთხოების შემოწმება",
        "createacct-imgcaptcha-ph": "შეიყვანეთ ზემოთ მოცემული ტექსტი",
        "createacct-submit": "შექმენით თქვენი ანგარიში",
-       "createacct-another-submit": "á\83¡á\83®á\83\95á\83\90 á\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98á\83¡ á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\90",
+       "createacct-another-submit": "ანგარიშის შექმნა",
        "createacct-benefit-heading": "{{SITENAME}} შექმნილია თქვენნაირი ადამიანების მიერ.",
        "createacct-benefit-body1": "{{PLURAL:$1|რედაქტირება|რედაქტირება}}",
        "createacct-benefit-body2": "{{PLURAL:$1|გვერდი|გვერდი}}",
        "changeemail-password": "თქვენი პაროლი პროექტში {{SITENAME}}:",
        "changeemail-submit": "ელ-ფოსტის შეცვლა",
        "changeemail-throttled": "თქვენ უკვე ძალიან ბევრჯერ სცადეთ შესვლა.\nგთხოვთ, მოიცადოთ $1, სანამ კიდევ სცდიდეთ.",
+       "changeemail-nochange": "გთხოვთ, შეიყვანოთ ახალი, განსხვავებული ელექტრონული მისამართი.",
        "resettokens": "ტოკენების ჩამოყრა",
        "resettokens-text": "თქვენ შეგიძლიათ ჩამოყაროთ ტოკენები, რომლებიც შესაძლებლობას იძლევიან შესვლას განსაზღვრულ პირად მონაცემებში, დაკავშირებულს თქვენ ანგარიშთან აქ. \n\nთქვენ ეს აუცილებლად უნდა გააკეთოთ, თუ თქვენ ის შემთხვევით გააცანით სხვას ან თუკი თქვენი ანგარიში იქნა გატეხილი.",
        "resettokens-no-tokens": "არ არის ტოკენები ჩამოსაყრელად",
        "yourdiff": "განსხვავებები",
        "copyrightwarning": "ყურადღება მიაქციეთ: ნებისმიერი წვლილი გვერდზე {{SITENAME}} $2 ლიცენზიას ექვემდებარება (იხ. $1 დეტალებისთვის). თუ არ გსურთ თქვენი ნამუშევარი თავისუფლად გავრცელდეს და მისი დაუნდობელი რედაქტირება მოხდეს, მაშინ ნუ შეიყვანთ მას აქ.<br />\nთქვენ ასევე პირობას დებთ, რომ ეს თქვენი დაწერილია, ან გადმოღებულია საზოგადოებრივი დომენიდან, ან მსგავსი თავისუფალი წყაროდან.\n'''ნუ შემოიტანთ საავტორო უფლებებით დაცულ ნაშრომს ავტორის თანხმობის გარეშე!'''",
        "copyrightwarning2": "*გაითვალისწინეთ, რომ ნებისმიერი წვლილი {{SITENAME}}-ში შეიძლება ჩასწორდეს, შეიცვალოს ან წაიშალოს სხვა რედაქტორების მიერ.\n*თუ არ გსურთ, რომ თქვენი ნამუშევარი შეუზღუდავად იქნეს რედაქტირებული, მას აქ ნუ განათავსებთ.<br />\n*თქვენ აგრეთვე პირობას დებთ, რომ თქვენს მიერ განთავსებული ტექსტი თქვენი დაწერილია, ან გადმოწერილია საზოგადოებრივი დომენიდან ან მსგავსი თავისუფალი წყაროდან. (იხ. $1 დეტალებისთვის).\n*'''ნუ შემოიტანთ საავტორო უფლებებით დაცულ ნაშრომს ავტორის ნებართვის გარეშე!'''",
+       "editpage-cannot-use-custom-model": "ამ გვერდის მასალის მოდელი არ შეიძლება, რომ შეიცვალოს.",
        "longpageerror": "'''შეცდომა: თქვენს მიერ აკრეფილი ტექსტის ზომა {{PLURAL:$1|$1 კილობაიტია}}, რაც აღემატება, დადგენილ {{PLURAL:$2|$2 კილობაიტიან}} ზღვარს. გვერდის შენახვა შეუძლებელია.'''",
        "readonlywarning": "'''გაფრთხილება: მონაცემთა ბაზა დახურულია პერიოდული შემოწმებისთვის, შესაბამისად თქვენ ვერ შეძლებთ რედაქტირებას ამ მომენტში.'''\nსასურველია ტექსტის ასლი შეინახოთ ტექსტურ რედაქტორში და მოგვიანებით შემოიტანოთ.\n\nმონაცემთა ბაზის დამბლოკველმა ადმინისტრატორმა შემდეგი კომენტარი დატოვა: $1",
        "protectedpagewarning": "'''ყურადღება:  ეს გვერდი დაბლოკილია და მისი რედაქტირება შეუძლიათ მხოლოდ მომხმარებლებს ადმინისტრატორის უფლებებით'''\nიხილეთ დაცვის ჟურნალის ჩანაწერი",
        "mergehistory-go": "აჩვენეთ გაერთიანებული ცვლილებები",
        "mergehistory-submit": "ცვლილებების შერწყმა",
        "mergehistory-empty": "რაიმე ცვლილების შერწყმა შეუძლებელია.",
-       "mergehistory-success": "$3 {{PLURAL:$3|შესწორება|შესწორებები|შესწორებების}}  [[:$1]]-დან წარმატებით {{PLURAL:$3|გადაიტანა|გადაიტანნენ|გადატანილი იქნენ}}  [[:$2]]-ში.",
+       "mergehistory-done": "$3 {{PLURAL:$3|შესწორება|შესწორებები|შესწორებების}}  $1-დან წარმატებით {{PLURAL:$3|გადაიტანა|გადაიტანნენ|გადატანილი იქნენ}}  [[:$2]]-ში.",
        "mergehistory-fail": "ვერ მოხერხდა გვერდების ისტორიის გაერთიანება, გთხოვთ შეამოწმოთ გვერდის პაარამეტრები და დრო.",
        "mergehistory-fail-toobig": "არ ხერხდება ისტორიების შერწყმა, რამეთუ აუცილებელია დაშვებული ლიმიტის მეტი ნაწილის გადატანა $1 ვერსიაში.",
        "mergehistory-no-source": "დანიშნულების გვერდი $1 არ არსებობს.",
        "columns": "სვეტები",
        "searchresultshead": "ძიება",
        "stub-threshold": "გაფორმების გასაუმჯობესებლად <a href=\"#\" class=\"stub\"> მოცემულია ესკიზების ბმულები</a> (ბაიტებში):",
+       "stub-threshold-sample-link": "მაგალითი",
        "stub-threshold-disabled": "გათიშულია",
        "recentchangesdays": "ბოლო ცვლილებებში საჩვენებელი დღეები:",
        "recentchangesdays-max": "მაქსიმუმ $1 {{PLURAL:$1|დღე}}",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 მომხმარებლის/ები კონტროლი]",
        "rc_categories": "მხოლოდ კატეგორიებიდან (განაცალკევეთ \"|\"-ის მიხედვით)",
-       "rc_categories_any": "ნებისმიერი",
+       "rc_categories_any": "á\83\90á\83 á\83©á\83\94á\83£á\83\9aá\83\98á\83\93á\83\90á\83\9c á\83\9cá\83\94á\83\91á\83\98á\83¡á\83\9bá\83\98á\83\94á\83 á\83\98",
        "rc-change-size": "$1",
        "rc-change-size-new": "ზომა ცვლილების შემდეგ არის: {{PLURAL:$1|ბაიტი|ბაიტი}}",
        "newsectionsummary": "/* $1 */ ახალი სექცია",
        "upload-too-many-redirects": "URL შეიცავს ძალიან ბევრ გადამისამართებებს",
        "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": "შენახვა",
+       "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": "ფაილის სახელი",
        "backend-fail-stream": "ფაილი $1 ტრანსლირება ვერ მოხერხდა.",
        "backend-fail-backup": "ფაილი $1 სარეზერვო ასლის გაკეთება ვერ მოხერხდა.",
        "backend-fail-notexists": "ფაილი $1 არ არსებობს.",
        "filerevert-legend": "დააბრუნე ფაილი",
        "filerevert-intro": "<span class=\"plainlinks\">თქვენ აბრუნებთ '''[[Media:$1|$1]]'''  [$4 ვერსიას $3, $2]-თან.</span>",
        "filerevert-comment": "მიზეზი:",
-       "filerevert-defaultcomment": "დაბრუნება ვერსიასთან $2, $1-დან.",
+       "filerevert-defaultcomment": "დაბრუნება ვერსიასთან $2, $1-დან ($3).",
        "filerevert-submit": "გაუქმება",
        "filerevert-success": "'''[[Media:$1|$1]]''' დაუბრუნდა ვერსიას [$4  $3, $2]-დან.",
        "filerevert-badversion": "არ არსებობს ფაილის წინა ლოკალური ვერსია მოთხოვნილი  თარიღითა და დროით",
        "nopagetext": "მოცემული სამიზნო გვერდი არ არის მიითებული.",
        "pager-newer-n": "{{PLURAL:$1|უახლესი 1|უახლესი $1}}",
        "pager-older-n": "{{PLURAL:$1|უფრო ძველი 1|უფრო ძველი $1}}",
-       "suppress": "á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\95ა",
+       "suppress": "á\83©á\83\90á\83®á\83¨á\83\9dá\83\91ა",
        "querypage-disabled": "ეს სპეცგვერდი გამორთულია წარმადობის გასაზრდელად.",
        "apihelp": "API დახმარება",
        "apihelp-no-such-module": "მოდული „$1“ ვერ მოიძებნა.",
        "booksources-text": "ქვემოთ არის ვებ გვერდების ბმულების სია სადაც იყიდება ახალი და ნახმარი წიგნები, და შესაძლოა შეიცავდნენ დამატებით ინფორმაციას წიგნების შესახებ, რომლებსაც ეძებთ:",
        "booksources-invalid-isbn": "თქვენს მიერ მითითებული ISBN, შეცდომას შეიცავს.  შეამოწმეთ, თუ თავდაპირველი წყარო სწორადაა აკრეფილი.",
        "specialloguserlabel": "შემსრულებელი:",
-       "speciallogtitlelabel": "მიზანი (სათაური, ან მომხმარებელი):",
+       "speciallogtitlelabel": "მიზანი (სათაური, ან {{ns:user}}:მომხმარებლის სახელი):",
        "log": "ჟურნალები",
        "all-logs-page": "ყველა საზოგადო ჟურნალი",
        "alllogstext": "{{SITENAME}}-ის ყველა არსებული ჩანაწერის კომბინირებული ჩვენება.\nშეგიძლიათ გაცხრილოთ იგი ჩანაწერის ტიპის, მომხმარებლის სახელის, ან დაკავშირებული გვერდის შერჩევით.",
        "rollback-success": "გაუქმდა რედაქტირება $1; დაბრუნება ვერსიაზე $2.",
        "sessionfailure-title": "სეანსის შეცდომა",
        "sessionfailure": "ჩანს, რომ პრობლემაა თქვენი რეგისტრაციის სესიისათვის;\nეს მოქმედება შეჩერდა თქვენი სესიაში შემოჭრის თავიდან ასაცილებლად.\nგთხოვთ, დააწკაპუნოთ ღილაკს „უკან“ და თავიდან ჩართოთ გვერდი, რომლიდანაც შემოხვედით და სცადოთ განმეორებით.",
+       "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]]“",
        "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ამ მოქმედებამ შეიძლება მნიშვნელოვანი და მოულოდნელი ცვლილება გამოიწვის პოპულარულ გვერდზე; სანამ გააგრძელებდეთ, გთხოვთ დარწმუნდეთ, რომ თქვენ გესმით თქვენი ქმედების შედეგები.",
        "movepagetalktext": "დაკავშირებული განხილვის გვერდი ავტომატურად გადავა მასთან ერთად, '''გარდა იმ შემთხვევისა, თუ''':\n*განხილვის გვერდი ახალი სათაურით და გარკვეული შინაარსით უკვე არსებობს, ან\n*თქვენ მოხსნით ნიშნულს ქვევით დაფაზე.\n\nამ შემთხვევებში, თქვენ თავად მოგიწევთ ამ გვერდის გადატანა, სურვილისამებრ.",
-       "movearticle": "გვერდის გადატანა",
        "moveuserpage-warning": "'''გაფრთხილება:''' თქვენ გადაგაქვთ მომხმარებლის გვერდი. გთხოვთ გაითვალისწინეთ, რომ გადატანა შესრულდება, მომხმარებლის სახელის გადარქმევა კი ''არა''.",
        "movecategorypage-warning": "<strong>გაფრთხილება:</strong> თქვენ გადაგაქვთ კატეგორიის გვერდი. გაითვალისწინეთ, რომ გვერდი გადავა, თუმცა მასში შემავალი გვერდები <em>დარჩება</em> ძველ კატეგორიაში. საჭირო იქნება კატეგორიის ჩასწორება სტატიებში ინდივიდუალურად.",
        "movenologintext": "თქვენ უნდა [[Special:UserLogin|წარუდგინოთ თავი]],\nსისტემას რათა გადაიტანოთ გვერდები.",
        "variantname-zh-my": "my",
        "variantname-zh": "zh",
        "variantname-gan-hans": "hans",
+       "variantname-kk-kz": "kk-kz",
+       "variantname-kk-tr": "kk-tr",
+       "variantname-kk-cn": "kk-cn",
+       "variantname-kk-cyrl": "kk-cyrl",
+       "variantname-kk-latn": "kk-latn",
+       "variantname-kk-arab": "kk-arab",
+       "variantname-kk": "kk",
        "metadata": "მეტამონაცემები",
        "metadata-help": "ეს ფაილი შეიცავს დამატებით ინფორმაციას, სავარაუდოდ ციფრული კამერიდან ან სკანერიდან, რომელიც მის შესაქმნელად გამოიყენეს. თუ ფაილის ორიგინალი შეცვლილია, ზოგიერთი დეტალი შესაძლოა სრულად არ ასახავდეს ფაილში შეტანილ ცვლილებებს.",
        "metadata-expand": "დამატებითი ინფორმაციის ჩვენება",
        "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-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 {{GENDER:$2|წაშალა}} გვერდი: „$3“",
        "api-error-badaccess-groups": "თქვენ არ გაქვთ ამ ვიკიში ფაილების ატვირთვის უფლება.",
        "api-error-badtoken": "შიდა შეცდომა: ცუდი ტოკენი.",
        "api-error-copyuploaddisabled": "ამ სერვერზე URL-მისამართის საშუალებით ატვირთვა გამორთულია.",
-       "api-error-duplicate": "უკვე {{PLURAL:$1|არსებობს [$2 სხვა ფაილი]|არსებობს [$2 სხვა მსგავსი ფაილი]}} ანალოგიური შინაარსით.",
-       "api-error-duplicate-archive": "საიტზე ადრე {{PLURAL:$1|უკვე იყო [$2 ფაილი]}} ანალოგიური შინაარსით, მაგრამ {{PLURAL:$1|ის წაიშალა|ისინი წაიშალა}}.",
-       "api-error-duplicate-archive-popup-title": "უკვე წაშლილი {{PLURAL:$1|ფაილის|ფაილის}} დუბლიკატი.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|ფაილის|ფაილის}} დუბლიკატი.",
+       "api-error-duplicate": "უკვე {{PLURAL:$1|არსებობს სხვა ფაილი|არსებობს სხვა მსგავსი ფაილი}} ანალოგიური შინაარსით.",
+       "api-error-duplicate-archive": "საიტზე ადრე {{PLURAL:$1|უკვე იყო ფაილი}} ანალოგიური შინაარსით, მაგრამ {{PLURAL:$1|ის წაიშალა|ისინი წაიშალა}}.",
        "api-error-empty-file": "არჩეული ფაილი ცარიელია.",
        "api-error-emptypage": "ახალი, ცარიელი გვერდების შექმნა აკრძალულია.",
        "api-error-fetchfileerror": "შიდა შეცდომა: ფაილის მიღებისას მოხდა რაღაც შეცდომა.",
        "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": "გვერდი ჯერ არ არსებობს",
index 805de26..7ffcaf2 100644 (file)
        "mergehistory-go": "Qosılıwı mu'mkin bolg'an oz'geriserdi ko'rset",
        "mergehistory-submit": "Nusqalardı biriktiriw",
        "mergehistory-empty": "Biriktiriwge nusqalar tabılmadı",
-       "mergehistory-success": "[[:$1]] betinin' $3 {{PLURAL:$3|nusqası|nusqaları}} [[:$2]] beti menen tabıslı biriktirildi.",
+       "mergehistory-done": "$1 betinin' $3 {{PLURAL:$3|nusqası|nusqaları}} [[:$2]] beti menen tabıslı biriktirildi.",
        "mergehistory-fail": "Bet tariyxların biriktiriw a'melge aspadı, bet ha'm waqıt sazlawların ja'ne bir tekserip ko'rin'.",
        "mergehistory-no-source": "$1 derek beti ele jaratılmag'an.",
        "mergehistory-no-destination": "$1 aqırg'ı beti ele jaratılmag'an.",
        "nlinks": "{{PLURAL:$1|1 siltew|$1 siltew}}",
        "nmembers": "{{PLURAL:$1|1 ag'za|$1 ag'zalar}}",
        "nrevisions": "{{PLURAL:$1|1 nusqa|$1 nusqa}}",
-       "nviews": "{{PLURAL:$1|1 ma'rte|$1 ma'rte}} ko'rip shıg'ılg'an",
        "specialpage-empty": "Bul sorawg'a hesh qanday na'tiyje joq.",
        "lonelypages": "Hesh betten siltelmegen betler",
        "lonelypagestext": "To'mendegi betlerge {{SITENAME}} proektindegi basqa betler siltemeydi.",
        "listgrouprights-removegroup-all": "Barlıq toparlardı o'shiriwi mu'mkin",
        "mailnologin": "Jiberiwge adres tabılmadı",
        "emailuser": "Xat jiberiw",
-       "emailpage": "Paydalanıwshıg'a e-mail jiberiw",
        "defemailsubject": "{{SITENAME}} e-mail",
        "noemailtitle": "E-mail adresi joq",
        "email-legend": "Basqa {{SITENAME}} paydalanıwshısına xat jiberiw",
        "deleteotherreason": "Basqa/qosımsha sebep:",
        "deletereasonotherlist": "Basqa sebep",
        "rollback": "O'zgerislerdi biykar etiw",
-       "rollback_short": "Biykar etiw",
        "rollbacklink": "qaytarıw",
        "rollbackfailed": "Biykar etiw sa'tsiz tamamlandı",
        "editcomment": "O'zgertiwge qaldırılg'an kommentariy: \"''$1''\".",
        "move-page-legend": "Betti ko'shiriw",
        "movepagetext": "To'mendegi formanı qollanıw arqalı bettin' ataması o'zgeredi, onın' barlıq tariyxı da taza atamag'a ko'shiredi.\nBurıng'ı bet ataması taza atamag'a qayta bag'ıtlang'an bet bolıp qaladı.\nOriginal atamag'a siltewshi qayta bag'ıtlang'an betlerdi avtomatik halda o'zgertiwin'iz mu'mkin.\nEger buni qa'lemesen'iz, [[Special:DoubleRedirects|shınjırlı]] yamasa [[Special:BrokenRedirects|natuwrı qayta bag'ıtlang'an betlerdin']] bar-joqlıg'ınj tekserip ko'rin'.\nSiltewlerdin' tuwrı islewine siz juwapker bolasız.\n\nItibar berin': eger taza atamalı bet aldınnan bar bolsa ha'm son'g'ı o'zgertiw tariyxısız bos bet yamasa qayta bag'ıtlandırıwshı bolg'anına deyin bet '''ko'shirilmeydi'''.\nBul degeni, eger betti aljasıp qayta atag'an bolsan'ız aldıng'ı atamag'a qaytıwın'ızg'a boladı, biraq bar bettin' u'stine jazıwın'ızg'a bolmaydi.\n\n'''ESTE TUTIN'!'''\nBul ko'p qaralatug'ın betke qatan' ha'm ku'tilmegen o'zgerisler alıp keliwi mu'mkin;\ndawam ettiriwden aldın qanday aqıbetlerge alıp keliwin oylap ko'rin'.",
        "movepagetalktext": "To'mendegi sebepler bar '''bolg'anısha''', sa'wbet beti avtomatik halda ko'shiriledi:\n* Bos emes sa'wbet beti jan'a atamada bar bolg'anda yaki\n* To'mendegi qutını belgilemegen'izde.\n\nBul jag'daylarda eger qa'lesen'iz betti qoldan ko'shiriwin'iz yamasa qosıwın'izg'a boladı.",
-       "movearticle": "Ko'shiriletug'ın bet:",
        "newtitle": "Taza atama:",
        "move-watch": "Bul betti baqlaw",
        "movepagebtn": "Betti ko'shir",
index 43ce460..ef33678 100644 (file)
@@ -12,7 +12,9 @@
                        "Urhixidur",
                        "아라",
                        "SalemB",
-                       "Mezgoug"
+                       "Mezgoug",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Aderrer n yezdayen:",
        "mergehistory-go": "Ẓeṛ ibeddilen i nezmer an zdi",
        "mergehistory-submit": "Azday n ileqman",
        "mergehistory-empty": "Ulac lqem i nezmer an zdi.",
-       "mergehistory-success": "$3 {{PLURAL:$3|lqem|ileqman}} n [[:$1]] {{PLURAL:$3|yezdukel|zdukelen}} deg [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|lqem|ileqman}} n $1 {{PLURAL:$3|yezdukel|zdukelen}} deg [[:$2]].",
        "mergehistory-fail": "Ulamek an zdukel imezruyen. Fru tikkelt nniḍen asebter d iɣewwaren is n uzmez.",
        "mergehistory-no-source": "Azar n usebter $1 ulac-it.",
        "mergehistory-no-destination": "Aserken n usebter $1 ulac-it",
        "filerevert-legend": "Erred afaylu",
        "filerevert-intro": "Ha-ta-n ad uɣaleḍ ar ufaylu  '''[[Media:$1|$1]]''' ar [$4 lqem n $2 af $3].",
        "filerevert-comment": "Taɣẓint :",
-       "filerevert-defaultcomment": "Uɣaleḍ ar lqem n $1 af $2",
+       "filerevert-defaultcomment": "Uɣaleḍ ar lqem n $1 af $2 ($3)",
        "filerevert-submit": "Erred",
        "filerevert-success": "'''[[Media:$1|$1]]''' yuɣaled ar  [$4 lqem n $2 af $3].",
        "filerevert-badversion": "Ulac, deg udigan, lqem aqbur n ufaylu yesɛan azmez agi.",
        "movepagetext": "Seqdec tiferkit ddaw agi iwakken ad beddeleḍ isem n usebter, s usiweḍ n akkw umezruy-is ɣer isem amaynut. Azwel aqbur ad yuɣal d asebter n usemmime ɣer azwel amaynut. Tzemreḍ ad mucceḍeḍ s uwurman isemmimen imiranen i sweṛen ɣer azwel amezwaru. Ma ur tebɣiḍ ara at sexdemeḍ wagi, ilaq ad selkeneḍ akkw [[Special:DoubleRedirects|Asemmimeḍ yeḍran snat tikwal]] neɣ [[Special:BrokenRedirects|asmmimeḍ yerẓan]]. Ilaq ad sɛuḍ talkint belli izdayen tsweṛen ɣer aserken is.\n\nAbeddel n isem <strong>ur</strong> yezmer <strong>ara</strong> ad yilli ma yella yakan asebter s isem agi, ḥaca ma ulac amezruy deg-es. Waya yetɛemmed an beddel isem n usebtar ɣer addud ines amezwaru ma tiggit d tuccḍit, dɣa ulamek an mzey yiwen asebtar yellan.\n\n'''Ɣur-wet !'''\nWagi yezmer ad yexdem abeddel ameqqṛan i asebter s aṭas timerziwin ; ilaq ad fehmeḍ uqbel ad beddeleḍ asebter.",
        "movepagetext-noredirectfixer": "Seqdec tiferkit ddaw agi iwakken ad beddeleḍ isem n usebter, s usiweḍ n akkw amezruy is ɣer isem amaynut. Azwel aqbur ad yuɣal d asebter n usemmime ɣer azwel amaynut.\nIlaq ad selkeneḍ akkw [[Special:DoubleRedirects|Asemmimeḍ yeḍran snat tikwal]] naɣ [[Special:BrokenRedirects|asmmimeḍ yerẓan]].\nIlaq ad sɛuḍ talkint belli izdayen tsweṛen ɣer aserken is.\n\nAbeddel n isem ur yezmer ara ad yilli ma yella yakan asebter s isem agi, ḥaca ma ulac amezruy deg-es dɣa yuɣal d-asebtar n usemmim. Waya yetɛemmed an beddel isem n usebtar ɣer addud ines amezwaru ma tiggit d tuccḍit, dɣa ulamek an mzey yiwen asebtar yellan.\n\n'''Ɣur-wet !'''\nWagi yezmer ad yexdem abeddel ameqqṛan i asebter s aṭas timerziwin ; ilaq ad fehmeḍ uqbel ad beddeleḍ asebter.",
        "movepagetalktext": "Asebter \"Amyannan\" yettusmimeḍ ula d netta '''ma ulac:'''\n*Yella asebter \"Amyannan\" deg isem amaynut, neɣ\n*Trecmeḍ tankult deg ukessar.\n\nLukan akka, yessefk a t-tedmeḍ weḥdek.",
-       "movearticle": "Smimeḍ asebter",
        "moveuserpage-warning": "'''Ɣur-wet !''' Atan ad beddeleḍ isem n usebtar n umseqdac. Ilaq ad fehmeḍ, isem n usebtar ad yetbeddel, maca isem n umseqdac '''ur''' d-yetbeddel '''ara'''.",
        "movenologintext": "Yessefk ad tesɛuḍ isem n wemseqdac u [[Special:UserLogin|tkecmeḍ]]\niwakken ad tesmimḍeḍ asebter.",
        "movenotallowed": "Ur tesɛiḍ ara turagt ad beddeleḍ isem n isebtar.",
        "api-error-badaccess-groups": "Ur tesɛiḍ ara turagt ad smireḍ ifuyla ɣef wiki agi.",
        "api-error-badtoken": "Tuccḍa tagensit : yir « tiddest ».",
        "api-error-copyuploaddisabled": "Issenɣal seg URL nsan ɣef aqeddac agi.",
-       "api-error-duplicate": "{{PLURAL:$1|[Yella yakan $2 afaylu nniḍen]|[Llan yakan $2 ifuyla nniḍen]}} ɣef asmel agi s ugbur am winna.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[Yella yakan $2 afaylu nniḍen]|[Llan yakan $2 ifuyla nniḍen]}} ɣef asmel agi s ugbur am winna, maca {{PLURAL:$1|yetwekkes|tetwekksen}}.",
-       "api-error-duplicate-archive-popup-title": "Sleg {{PLURAL:$1|afaylu|ifuyla}} yetwekksen yakan.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Afaylu|Ifuyla}} islagen.",
+       "api-error-duplicate": "{{PLURAL:$1|Yella yakan $2 afaylu nniḍen|Llan yakan $2 ifuyla nniḍen}} ɣef asmel agi s ugbur am winna.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Yella yakan afaylu nniḍen|Llan yakan ifuyla nniḍen}} ɣef asmel agi s ugbur am winna, maca {{PLURAL:$1|yetwekkes|tetwekksen}}.",
        "api-error-empty-file": "Afaylu id ceggɛeḍ d-ilem.",
        "api-error-emptypage": "Asnulfu n isebtar ilemawen ur yareg ara.",
        "api-error-fetchfileerror": "Tuccḍa tagensit : Yella kra ur yaɛeddan ara s luwqem deg tiririt n ufaylu.",
index e98a76e..57a1a7c 100644 (file)
        "mergehistory-go": "Гъэтэрэзыгъуэ зы хъухэр гъэлъэгъуэн",
        "mergehistory-submit": "Гъэтэрэзыгъуэхэр зы щӀын",
        "mergehistory-empty": "Гъэтэрэзыгъуэ зы щӀынхэр къэгъуэтакъым.",
-       "mergehistory-success": "$3 {{PLURAL:$3|гъэтэрэзыгъуэ}} [[:$1]] щыщхэр {{PLURAL:$3|ехьэкӀащ|ехьэкӀахэщ}} [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|гъэтэрэзыгъуэ}} $1 щыщхэр {{PLURAL:$3|ехьэкӀащ|ехьэкӀахэщ}} [[:$2]].",
        "mergehistory-fail": "НапэкӀуэцӀхэм я тхыдэр зы щӀын хъуакъым, напэкӀуэцӀым и щыпхъэхэм еплъщ я зэфӀэкӀыгъуэхэм.",
        "mergehistory-no-source": "Япэрей щытыкӀэу напӀэкӀуэцӀ «$1» гъуэтакъым.",
        "mergehistory-invalid-source": "КъыхэхыпӀэм псалъащхьэ захуэ иӀэн хуейщ.",
        "block-log-flags-nocreate": "аккаунт регистрациэхэр теубыдауэ щытщ",
        "movepagetext": "ИщӀагъым щӀэт формэр къэбгъэсэбэпмэ, напэкӀуэцӀым и цӀэр зэпхъуэкӀыну, и зэхъуэкӀыгъуэхэм я тхыдэ-тхылъри дэщӀыгъу пӀэ щӀэм иувэнущ.\nИ цӀэжъым и цӀэщӀэмкӀэ тригъыхьурэ ищӀынущ.\nАвтоматику къэбгъэщӀэрэщӀыжьыфыну тегъэхьэпӀэр, цӀэжьым тетыр.\nАр умыщӀэмэ, щӀэлъыплъ, [[Special:DoubleRedirects|тӀуанэ]] иэ [[Special:BrokenRedirects|зэбгырыдза тегъэхьэпӀэхэр]] щымыӀэмэ.\nУи пщэм илъщ техьэпэхэр зыхуэныкъуэ лъэныкъуэмкӀэ трагъэхьэным щхьэкӀэ.\n\nГу лъытэ! НапэкӀуэцӀым и цӀэр зэхъуэкӀынукъым, апхуэдэцӀэ зэрихьу напэкӀуэцӀ щыӀэхэмэ, иэ тегъэувауэ иэ гъэтэрэзыгъуэхэм я тхыдэр нэщӀу щытмэ.\nАбым къикӀыр напэкӀуэцӀым и цӀэуэ щытар аргуэру тепӀуэжыфынущ, зэрихьа къуэдеуэ щытам, щуэгъуэкӀэ зэпхъуэкӀамэ, ауэ щыуэгъуэкӀэ напэкӀуэцӀ щыӀэр тебгъэкӀыфынукъым.\n\n'''ГУЛЪЫТЫГЪУЭ!'''\nЦӀэзэхъуэкӀыным напэкӀуцӀ ''цӀэрыӀуэхэм'' гузэвэгъуэ узэмжа бжыгъэхэр къыхэкӀыфынущ.\nАрэзыгъуэ иӀэн щхьэкӀэ иджыри зэ егушыпс а быщӀэм къыхэкӀынур къызэрыбгурыӀуэр.",
        "movepagetalktext": "НапэкӀуэц тепсэлъыхьыгъуэ хэлъхьами автоматику и цӀэр зэхъуэкӀыну, '''мыбы хуэдэхэм щымыхъукӀэ:'''\n\n* Мы нэщӀу, напэкӀуэцӀ тепсэлъыхьыгъуэ щыӀэщ, апхуэдэ цӀэ зэрихьу иэ\n* ИщӀыгъ-игъувапӀэм деж щӀэптхъакъым.\n\nАпхуэдэм дежь, напэкӀуэцӀхэр уэр-уэру ӀэрыщӀу зэхэбгъэхьэжынущ, хуэныкъу щытмэ.",
-       "movearticle": "НапэкӀуэцӀым и цӀэр хъуэжын",
        "newtitle": "ЩIэуэ и цIэр",
        "move-watch": "НапэкІуэцІыр узыкІэлъыплъ къебжэкІым хэтхэн",
        "movepagebtn": "НапэкӀуэцӀым и цӀэр хъуэжын",
index cb108dd..985ca5b 100644 (file)
        "nstab-template": "ۇلگى",
        "nstab-help": "انىقتاما",
        "nstab-category": "سانات",
+       "mainpage-nstab": "باستى بەت",
        "nosuchaction": "مىناداي ەش ارەكەت جوق",
        "nosuchactiontext": "وسى URL جايىمەن ەنگىزىلگەن ارەكەتتى وسى ۋىيكىي جورامالداپ بىلمەدى.",
        "nosuchspecialpage": "مىناداي ەش ارنايى بەت جوق",
        "mergehistory-go": "بىرىكتىرلەتىن تۇزەتۋلەردى كورسەت",
        "mergehistory-submit": "تۇزەتۋلەردى بىرىكتىرۋ",
        "mergehistory-empty": "ەش تۇزەتۋلەر بىرىكتىرىلمەيدى",
-       "mergehistory-success": "[[:$1]] دەگەننىڭ $3 تۇزەتۋى [[:$2]] دەگەنگە ٴساتتى بىرىكتىرىلدى.",
+       "mergehistory-done": "$1 دەگەننىڭ $3 تۇزەتۋى [[:$2]] دەگەنگە ٴساتتى بىرىكتىرىلدى.",
        "mergehistory-fail": "تارىيح بىرىكتىرۋىن ورىنداۋ ىيكەمدى ەمەس, بەت پەن ۋاقىت باپتالىمدارىن قايتا تەكسەرىپ شىعىڭىز.",
        "mergehistory-no-source": "$1 دەگەن قاينار بەتى جوق.",
        "mergehistory-no-destination": "$1 دەگەن نىسانا بەتى جوق.",
        "nlinks": "$1 سىلتەمە",
        "nmembers": "$1 مۇشە",
        "nrevisions": "$1 تۇزەتۋ",
-       "nviews": "$1 رەت قارالعان",
        "specialpage-empty": "بۇل باياناتقا ەش ناتىيجە جوق.",
        "lonelypages": "ەش بەتتەن سىلتەلمەگەن بەتتەر",
        "lonelypagestext": "كەلەسى بەتتەرگە {{SITENAME}} جوباسىنداعى باسقا بەتتەر سىلتەمەيدى.",
        "mailnologin": "ەش مەكەنجاي جونەلتىلگەن جوق",
        "mailnologintext": "باسقا قاتىسۋشىعا حات جونەلتۋ ٴۇشىن [[Special:UserLogin|كىرۋىڭىز]] كەرەك, جانە [[Special:Preferences|باپتاۋىڭىزدا]] جارامدى ە-پوشتا جايى بولۋى ٴجون.",
        "emailuser": "قاتىسۋشىعا حات جازۋ",
-       "emailpage": "قاتىسۋشىعا حات جازۋ",
        "emailpagetext": "ەگەر بۇل قاتىسۋشى باپتاۋلارىندا جارامدى ە-پوشتا مەكەنجايىن ەنگىزسە, تومەندەگى ٴپىشىن ارقىلى بۇعان جالعىز ە-پوشتا حاتىن جونەلتۋگە بولادى.\nقاتىسۋشى باپتاۋىڭىزدا ەنگىزگەن ە-پوشتا مەكەنجايىڭىز «كىمنەن» دەگەن باس جولاعىندا كورىنەدى, سوندىقتان حات الۋشىسى تۋرا جاۋاپ بەرە الادى.",
        "defemailsubject": "{{SITENAME}} ە-پوشتاسىنىڭ حاتى",
        "noemailtitle": "ەش ە-پوشتا مەكەنجايى جوق",
        "move-page-legend": "بەتتى جىلجىتۋ",
        "movepagetext": "تومەندەگى ٴپىشىندى قولدانىپ بەتتەردى قايتا اتايدى, بارلىق تارىيحىن جاڭا اتاۋعا جىلجىتادى.\nبۇرىنعى بەت تاقىرىبىن اتى جاڭا تاقىرىپ اتىنا ايدايتىن بەت بولادى.\nەسكى تاقىرىپ اتىنا سىلتەيتىن سىلتەمەلەر وزگەرتىلمەيدى;\nجىلجىتۋدان سوڭ شىنجىرلى نە جارامسىز ايداعىشتار بار-جوعىن تەكسەرىپ شىعىڭىز.\nسىلتەمەلەر بۇرىنعى جولداۋىمەن بىلايعى ٴوتۋىن تەكسەرۋىنە ٴوزىڭىز مىندەتتى بولاسىز.\n\nاڭعارتپا: ەگەر وسى ارادا الداقاشان جاڭا تاقىرىپ اتى بار بەت بولسا, بۇل بوس نە ايداعىش بولعانشا دەيىن, جانە سوڭىندا تۇزەتۋ تارىيحى جوق بولسا, بەت '''جىلجىتىلمايدى'''. وسىنىڭ ماعىناسى: ەگەر بەتتى قاتەلىكپەن قايتا اتاساڭىز, بۇرىنعى اتاۋىنا قايتا اتاۋعا بولادى, جانە بار بەتتىڭ ۇستىنە جازۋىڭىزعا بولمايدى.\n\n'''قۇلاقتاندىرۋ!'''\nبۇل كوپ قارالاتىن بەتكە قاتاڭ جانە كەنەت وزگەرىس جاساۋعا مۇمكىن;\nوسىنىڭ سالدارىن بايىمداۋىڭىزدى ارەكەتتىڭ الدىنان باتىل بولىڭىز.",
        "movepagetalktext": "كەلەسى سەبەپتەر '''بولعانشا''' دەيىن, تالقىلاۋ بەتى بۇنىمەن بىرگە وزدىكتىك جىلجىتىلادى:\n* بوس ەمەس تالقىلاۋ بەتى جاڭا اتاۋدا الداقاشان بولعاندا, نە\n* تومەندەگى كوزگە قۇسبەلگى الىپ تاستالعاندا.\n\nوسى ورايدا, قالاۋىڭىز بولسا, بەتتى قولدان جىلجىتا نە قوسا الاسىز.",
-       "movearticle": "جىلجىتپاق بەت:",
        "movenologintext": "بەتتى جىلجىتۋ ٴۇشىن تىركەلگەن بولۋىڭىز جانە [[{{#special:UserLogin}}|كىرۋىڭىز]] ٴجون.",
        "movenotallowed": "{{SITENAME}} جوباسىندا بەتتەردى جىلجىتۋ رۋقساتىڭىز جوق.",
        "newtitle": "جاڭا تاقىرىپ اتىنا:",
index da2b2ce..299b1f0 100644 (file)
@@ -12,7 +12,8 @@
                        "Нұрлан Рахымжанов",
                        "아라",
                        "Macofe",
-                       "Batyrbek.kz"
+                       "Batyrbek.kz",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Сілтеменің астын сызу:",
        "nstab-template": "Үлгі",
        "nstab-help": "Анықтама беті",
        "nstab-category": "Санат",
+       "mainpage-nstab": "Басты бет",
        "nosuchaction": "Мұндай әрекет жоқ",
        "nosuchactiontext": "URL-дегі көрсетілген әрекет жарамсыз.\nМүмкін сіз URL теру барысында қате жібердіңіз немесе дұрыс емес сілтеме бойынша өттіңіз.\nБұл сондай-ақ {{SITENAME}} жобасында қолданылатын бағдарламалық жасақтама қатесін көрсетуі мүмкін.",
        "nosuchspecialpage": "Мұндай арнайы бет жоқ",
        "mergehistory-go": "Біріктірлетін түзетулерді көрсет",
        "mergehistory-submit": "Түзетулерді біріктіру",
        "mergehistory-empty": "Түзетулер біріктірілмейді.",
-       "mergehistory-success": "[[:$1]] дегеннің $3 түзетуі [[:$2]] дегенге сәтті біріктірілді.",
+       "mergehistory-done": "$1 дегеннің $3 түзетуі [[:$2]] дегенге сәтті біріктірілді.",
        "mergehistory-fail": "Тарих біріктіруін орындау икемді емес, бет пен уақыт бапталымдарын қайта тексеріп шығыңыз.",
        "mergehistory-fail-toobig": "$1 {{PLURAL:$1|нұсқа|нұсқа}} шегінен көп тарихын біріктіру орындалмайды.",
        "mergehistory-no-source": "$1 деген қайнар беті жоқ.",
        "filereuploadsummary": "Файлдағы өзгерістер",
        "filestatus": "Ауторлық құқықтар күйі:",
        "filesource": "Қайнар көзі:",
-       "ignorewarning": "Ð\95Ñ\81кеÑ\82Ñ\83дÑ\96 ÐµÐ»ÐµÐ¼Ðµ Ð´Ðµ Ñ\84айлдÑ\8b Ò\9bалайда Ñ\81аÒ\9bÑ\82а.",
+       "ignorewarning": "Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83дÑ\96 ÐµÐ»ÐµÐ¼ÐµÑ\83 Ð¶Ó\99не Ñ\84айлдÑ\8b Ò\9bалайда Ñ\81аÒ\9bÑ\82аÑ\83.",
        "ignorewarnings": "Ескертулерді елемеу",
        "minlength1": "Файл атауында ең кемінде бір әріп болуы жөн.",
        "illegalfilename": "«$1» файл атауында бет тақырыбы атында рұқсат берілмеген таңбалар бар.\nФайлды қайта атаңыз да бұны қотарып беруді қайта байқап көріңіз.",
        "upload-http-error": "HTTP қатесі кездесті: $1",
        "upload-copy-upload-invalid-domain": "Бұл домейннен еселеп жүктеу қолжетімді емес.",
        "upload-dialog-title": "Файл жүктеу",
-       "upload-dialog-error": "Белгісіз қате кездесті",
-       "upload-dialog-warning": "Ескерту кездесті",
        "upload-dialog-button-cancel": "Қажет емес",
        "upload-dialog-button-done": "Бітті",
        "upload-dialog-button-save": "Сақтау",
        "upload-dialog-button-upload": "Жүктеу",
-       "upload-dialog-label-select-file": "Файлды таңдау",
-       "upload-dialog-label-infoform-title": "Егжей-тегжейі",
-       "upload-dialog-label-infoform-name": "Атауы",
-       "upload-dialog-label-infoform-description": "Сипаттамасы",
-       "upload-dialog-label-usage-title": "Қолданылуы",
-       "upload-dialog-label-usage-filename": "Файл атауы",
+       "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": "Файл атауы",
        "backend-fail-stream": "«$1» файлы ақпады.",
        "backend-fail-backup": "«$1» файлының сақтық есесі жасалмады.",
        "backend-fail-notexists": "$1 файлы бар емес.",
        "movepagetext": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз. Беттің бұрынғы атауы жаңа бетке айдағыш сілтеме ретінде қалады. Қаласаңыз, бұрынғы атауды мегзейтін сілтемелердің автоматты түрде жаңартылуын таңдай аласыз. Бұны таңдамаған жағдайда, [[Special:DoubleRedirects|екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз. Жылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз. Егер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту <strong>орындалмайды</strong>. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет - бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрынғы атауына қайтаруды мүмкін ету үшін жасалған. </strong>Ескерту!</strong> Бұл көп қаралатын бет үшін қатаң және күтпеген өзгеріс болуы мүмкін; ілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
        "movepagetext-noredirectfixer": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз. \nБеттің бұрынғы атауы жаңа бетке айдағыш сілтеме ретінде қалады. \n[[Special:DoubleRedirects|Екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз. Жылжытудан кейін әр сілтеме өзіне тиісті бетке сілтейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту <strong>орындалмайды</strong>. Бұл шара әлдеқашаннан бар, беттің қайта жазылуынан сақтайды. Алайда, егер бет бос бет, не өткен тарихы жоқ айдағыш бет болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрынғы атауына қайтаруға мүмкіндік беру үшін жасалған.\n\n<strong>Ескерту!</strong> Бұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін; ілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
        "movepagetalktext": "Келесі жағдай орын алса, қатысты талқылау беті '''жылжытылмайды''':\n*жаңа атаумен аталатын беттің талқылау беті әлдеқашан бар болған кезде (бұл жағдайда талқылауын қолмен көшіруге болады, бірақ түйіндемесіне қай беттен көшірілгендігін міндетті түрде жазыңыз)\n*төмендегі қорапшадан құсбелгі алынып тасталғанда.\n\nАл мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
-       "movearticle": "Бетті жылжыту:",
        "moveuserpage-warning": "<strong>Ескерту:</strong> Сіз қатысушы бетін жылжытпақшысыз. Назар аударыңыз, қатысушы беті ғана жылжытылуы мүмкін және қатысушы аты <em>өзгертілмейді</em>.",
        "movecategorypage-warning": "<strong>Ескерту:</strong> Сіз санат бетінің атауын өзгерткелі жатырсыз. Бұл әрекетіңізде санат атауы ғана өзгерте аласыз, сондықтан санаттың бұрынғы атауындағы қандай да бір бет санаттың жаңа атауына өздігінен <em>санатталмайтыны</em> есіңізде болсын. Санаттың бұрынғы атауындағы беттері мен санатшаларын жаңа атауына қайта санаттап шығуға тура келеді.",
        "movenologintext": "Бетті жылжыту үшін тіркелген қатысуышы болуыңыз және [[Special:UserLogin|кіруіңіз]] керек.",
        "htmlform-float-invalid": "Сіз көрсеткен мән сан емес.",
        "htmlform-int-toolow": "Сіз көрсеткен мәні $1 минимум мәнінен кіші.",
        "htmlform-int-toohigh": "Сіз көрсеткен мәні $1 минимум мәнінен үлкен.",
-       "htmlform-required": "Бұл мән міндетті",
+       "htmlform-required": "Бұл мән міндетті.",
        "htmlform-submit": "Жіберу",
        "htmlform-reset": "Өзгерістерді болдырмау",
        "htmlform-selectorother-other": "Басқа",
        "logentry-suppress-revision": "$1 $3 бетіндегі {{PLURAL:$5|нұсқаның|$5 нұсқаның}} көрінулігін құпия түрде {{GENDER:$2|өзгертті}}",
        "logentry-suppress-event-legacy": "$1 $3 бетіндегі журнал оқиғаларының көрінулігін құпия түрде {{GENDER:$2|өзгертті}}",
        "logentry-suppress-revision-legacy": "$1 $3 бетіндегі нұсқалардың көрінулігін құпия түрде {{GENDER:$2|өзгертті}}",
-       "revdelete-content-hid": "мағлұматын жасырыды",
+       "revdelete-content-hid": "мағлұматын жасырды",
        "revdelete-summary-hid": "өңдеу түйіндемесін жасырды",
        "revdelete-uname-hid": "қатысушы есімін жасырды",
        "revdelete-content-unhid": "мағлұматы жасырылмаған",
        "api-error-badaccess-groups": "Сізге бұл уикиге файл жүктеуге рұқсат етілмеген.",
        "api-error-badtoken": "Ішкі қате: Жаман байрақша",
        "api-error-copyuploaddisabled": "URL бойынша жүктеу бұл серверде өшірілген",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 басқа файл]|[$2 кейбір басқа файл]}} әлеқашан сайтта басқа мазмұнда бар.",
-       "api-error-duplicate-archive-popup-title": "Бұл {{PLURAL:$1|файл|файл}} телнұсқасы әлдеқашан жойылған.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|file|files}} телнұсқасы.",
+       "api-error-duplicate": "{{PLURAL:$1|басқа файл|кейбір басқа файл}} әлеқашан сайтта басқа мазмұнда бар.",
        "api-error-empty-file": "Сіз жіберген файл бос.",
        "api-error-emptypage": "Бос бетті жаңадан бастау рұқсат етілмейді.",
        "api-error-fetchfileerror": "Ішкі қателік: Файлды алу барысында қате кетті.",
index ad40f2d..daf9a74 100644 (file)
        "nstab-template": "Ülgi",
        "nstab-help": "Anıqtama",
        "nstab-category": "Sanat",
+       "mainpage-nstab": "Bastı bet",
        "nosuchaction": "Mınadaý eş äreket joq",
        "nosuchactiontext": "Osı URL jaýımen engizilgen äreketti osı wïkï joramaldap bilmedi.",
        "nosuchspecialpage": "Mınadaý eş arnaýı bet joq",
        "mergehistory-go": "Biriktirletin tüzetwlerdi körset",
        "mergehistory-submit": "Tüzetwlerdi biriktirw",
        "mergehistory-empty": "Eş tüzetwler biriktirilmeýdi",
-       "mergehistory-success": "[[:$1]] degenniñ $3 tüzetwi [[:$2]] degenge sätti biriktirildi.",
+       "mergehistory-done": "$1 degenniñ $3 tüzetwi [[:$2]] degenge sätti biriktirildi.",
        "mergehistory-fail": "Tarïx biriktirwin orındaw ïkemdi emes, bet pen waqıt baptalımdarın qaýta tekserip şığıñız.",
        "mergehistory-no-source": "$1 degen qaýnar beti joq.",
        "mergehistory-no-destination": "$1 degen nısana beti joq.",
        "nlinks": "$1 silteme",
        "nmembers": "$1 müşe",
        "nrevisions": "$1 tüzetw",
-       "nviews": "$1 ret qaralğan",
        "specialpage-empty": "Bul bayanatqa eş nätïje joq.",
        "lonelypages": "Eş betten siltelmegen better",
        "lonelypagestext": "Kelesi betterge {{SITENAME}} jobasındağı basqa better siltemeýdi.",
        "mailnologin": "Eş mekenjaý jöneltilgen joq",
        "mailnologintext": "Basqa qatıswşığa xat jöneltw üşin [[Special:UserLogin|kirwiñiz]] kerek, jäne [[Special:Preferences|baptawıñızda]] jaramdı e-poşta jaýı bolwı jön.",
        "emailuser": "Qatıswşığa xat jazw",
-       "emailpage": "Qatıswşığa xat jazw",
        "emailpagetext": "Eger bul qatıswşı baptawlarında jaramdı e-poşta mekenjaýın engizse, tömendegi pişin arqılı buğan jalğız e-poşta xatın jöneltwge boladı.\nQatıswşı baptawıñızda engizgen e-poşta mekenjaýıñız «Kimnen» degen bas jolağında körinedi, sondıqtan xat alwşısı twra jawap bere aladı.",
        "defemailsubject": "{{SITENAME}} e-poştasınıñ xatı",
        "noemailtitle": "Eş e-poşta mekenjaýı joq",
        "move-page-legend": "Betti jıljıtw",
        "movepagetext": "Tömendegi pişindi qoldanıp betterdi qaýta ataýdı, barlıq tarïxın jaña atawğa jıljıtadı.\nBurınğı bet taqırıbın atı jaña taqırıp atına aýdaýtın bet boladı.\nEski taqırıp atına silteýtin siltemeler özgertilmeýdi;\njıljıtwdan soñ şınjırlı ne jaramsız aýdağıştar bar-joğın tekserip şığıñız.\nSiltemeler burınğı joldawımen bılaýğı ötwin tekserwine öziñiz mindetti bolasız.\n\nAñğartpa: Eger osı arada aldaqaşan jaña taqırıp atı bar bet bolsa, bul bos ne aýdağış bolğanşa deýin, jäne soñında tüzetw tarïxı joq bolsa, bet '''jıljıtılmaýdı'''. Osınıñ mağınası: eger betti qatelikpen qaýta atasañız, burınğı atawına qaýta atawğa boladı, jäne bar bettiñ üstine jazwıñızğa bolmaýdı.\n\n'''QULAQTANDIRW!'''\nBul köp qaralatın betke qatañ jäne kenet özgeris jasawğa mümkin;\nosınıñ saldarın baýımdawıñızdı ärekettiñ aldınan batıl bolıñız.",
        "movepagetalktext": "Kelesi sebepter '''bolğanşa''' deýin, talqılaw beti bunımen birge özdiktik jıljıtıladı:\n* Bos emes talqılaw beti jaña atawda aldaqaşan bolğanda, ne\n* Tömendegi közge qusbelgi alıp tastalğanda.\n\nOsı oraýda, qalawıñız bolsa, betti qoldan jıljıta ne qosa alasız.",
-       "movearticle": "Jıljıtpaq bet:",
        "movenologintext": "Betti jıljıtw üşin tirkelgen bolwıñız jäne [[{{#special:UserLogin}}|kirwiñiz]] jön.",
        "movenotallowed": "{{SITENAME}} jobasında betterdi jıljıtw rwqsatıñız joq.",
        "newtitle": "Jaña taqırıp atına:",
index 0cc83c4..e99c62f 100644 (file)
        "jumpto": "លោតទៅ៖",
        "jumptonavigation": "ការណែនាំ",
        "jumptosearch": "ស្វែងរក",
-       "view-pool-error": "សូមអភ័យទោស។ ប្រព័ន្ធបម្រើការមានការមមាញឹកខ្លាំងពេកនៅពេលនេះ។\n\nមានអ្នកប្រើប្រាស់ជាច្រើនកំពុងព្យាយាមចូលមើលទំព័រនេះ។\n\nសូមរង់ចាំមួយភ្លែតសិនរួចសាកល្បងចូលមកកាន់ទំព័រនេះឡើងវិញ។\n\n$1",
+       "view-pool-error": "សូមអភ័យទោស។ ប្រព័ន្ធបម្រើការមានការមមាញឹកខ្លាំងពេកនៅពេលនេះ។\nមានអ្នកប្រើប្រាស់ជាច្រើនកំពុងព្យាយាមចូលមើលទំព័រនេះ។\nសូមរង់ចាំមួយភ្លែតសិនរួចសាកល្បងចូលមកកាន់ទំព័រនេះឡើងវិញ។\n\n$1",
+       "generic-pool-error": "សូមអភ័យទោស។ ប្រព័ន្ធបម្រើការមានការមមាញឹកខ្លាំងពេកនៅពេលនេះ។\nមានអ្នកប្រើប្រាស់ជាច្រើនកំពុងព្យាយាមចូលមើលទំព័រនេះ។\nសូមរង់ចាំមួយភ្លែតសិនរួចសាកល្បងចូលមកកាន់ទំព័រនេះឡើងវិញ។",
        "pool-errorunknown": "កំហុសមិនស្គាល់",
        "aboutsite": "អំពី{{SITENAME}}",
        "aboutpage": "Project:អំពី",
        "nstab-template": "ទំព័រគំរូ",
        "nstab-help": "ទំព័រជំនួយ",
        "nstab-category": "ចំណាត់ថ្នាក់ក្រុម",
+       "mainpage-nstab": "ទំព័រដើម",
        "nosuchaction": "គ្មានសកម្មភាពបែបនេះទេ",
        "nosuchactiontext": "សកម្មភាព​បានបង្ហាញដោយ URL មិន​ត្រឹមត្រូវ​។\nអ្នក​ប្រហែលជាបាន​វាយ URL ខុស បើ​មិន​ដូច្នេះ​ទេ​មាន​តែ​តំណភ្ជាប់​មិន​ត្រឹមត្រូវ​។\nនេះ​ក៏​អាច​បញ្ជាក់​ប្រាប់​ពី​កំហុស​នៅ​ក្នុង​ផ្នែកទន់​ប្រើដោយ {{SITENAME}} ។",
        "nosuchspecialpage": "គ្មានទំព័រពិសេសបែបនេះទេ",
        "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": "ពាក្យសម្ងាត់ដែលអ្នកបានវាយបញ្ចូលនោះ គឺមិនស៊ីគ្នាទេ។",
+       "usernameinprogress": "ការបង្កើតគណនីសម្រាប់អ្នកប្រើប្រាស់នេះកំពុងប្រព្រឹត្តទៅ។ សូមរង់ចាំបន្តិច។",
        "userexists": "អត្តនាមដែលអ្នកបានវាយបញ្ចូលមានគេប្រើហើយ។\nសូមជ្រើសរើសអត្តនាមផ្សេងពីនេះ។",
        "loginerror": "កំហុសនៃការកត់ឈ្មោះចូល",
        "createacct-error": "បញ្ហាក្នុងការបង្កើតគណនី",
        "changeemail-password": "ពាក្យសំងាត់{{SITENAME}}របស់អ្នក:",
        "changeemail-submit": "ផ្លាស់ប្ដូរអ៊ីមែល",
        "changeemail-throttled": "អ្នកបានព្យាយាមកត់ឈ្មោះចូលច្រើនដងពេកហើយ។​\nសូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។",
+       "changeemail-nochange": "សូមវាយបញ្ចូលអាសយដ្ឋានអ៊ីមែលផ្សេងមួយទៀត។",
        "bold_sample": "អក្សរដិត",
        "bold_tip": "អក្សរដិត",
        "italic_sample": "អក្សរទ្រេត",
        "mergehistory-go": "បង្ហាញកំណែប្រែដែលអាចច្របាច់បញ្ចូលបាន",
        "mergehistory-submit": "ច្របាច់កំណែនានាបញ្ចូលគ្នា",
        "mergehistory-empty": "គ្មានកំណែណាមួយអាចច្របាច់បញ្ចូលគ្នាទេ។",
-       "mergehistory-success": "$3 {{PLURAL:$3|កំណែ​​|កំណែ}}របស់[[:$1]] បានច្របាច់បញ្ចូល​​គ្នា​​ទៅ[[:$2]]បានសំរេចហើយ។",
+       "mergehistory-done": "$3 {{PLURAL:$3|កំណែ​​|កំណែ}}របស់$1 បានច្របាច់បញ្ចូល​​គ្នា​​ទៅ[[:$2]]បានសំរេចហើយ។",
        "mergehistory-fail": "មិនអាចធ្វើការច្របាច់ប្រវត្តិបញ្ចូលគ្នា។ សូមពិនិត្យទំព័រនេះ និងប៉ារ៉ាម៉ែត្រពេលវេលាឡើងវិញ។",
        "mergehistory-no-source": "ទំព័រប្រភព $1 មិនមានទេ។",
        "mergehistory-no-destination": "ទំព័រគោលដៅ $1 មិនមានទេ។",
        "search-category": "(ចំណាត់ថ្នាក់ក្រុម $1)",
        "search-file-match": "(ខ្លឹមសារឯកសារត្រូវគ្នា)",
        "search-suggest": "ប្រហែលជាអ្នកចង់រក៖ $1",
+       "search-rewritten": "បង្ហាញលទ្ធផលពីការស្វែងរក $1។ ស្វែងរក $2 ជំនួសវិញ។",
        "search-interwiki-caption": "គម្រោងជាបងប្អូន",
        "search-interwiki-default": "លទ្ធផលពី$1៖",
        "search-interwiki-more": "(បន្ថែមទៀត)",
        "prefsnologintext2": "សូមកត់ឈ្មោះចូលដើម្បីផ្លាស់ប្ដូរចំណង់ចំណូលចិត្តរបស់អ្នក។",
        "prefs-skin": "សំបក",
        "skin-preview": "មើលជាមុន",
-       "datedefault": "គ្មានចំណូលចិត្ត",
-       "prefs-labs": "á\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fá\9e\90á\9f\92á\9e\98á\9e¸á\9f\97á\9e\8aá\9f\82á\9e\9bá\9e\9fá\9f\92á\9e\90á\9e·á\9e\8fá\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\80á\9e¶á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\84á\9e\92á\9e\93á\9f\8dá\9e\93á\9f\85á\9e¡á\9e¾á\9e\99",
+       "datedefault": "á\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\85á\9f\86á\9e\8eá\9e\84á\9f\8bá\9e\85á\9f\86á\9e\8eá\9e¼á\9e\9bá\9e\85á\9e·á\9e\8fá\9f\92á\9e\8f",
+       "prefs-labs": "á\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fá\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\80á\9e¶á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\84á\9e\92á\9e\93á\9f\8d",
        "prefs-user-pages": "ទំព័រអ្នកប្រើប្រាស់",
        "prefs-personal": "ប្រវត្តិរូប",
        "prefs-rc": "បន្លាស់​ប្ដូរ​ថ្មីៗ",
        "prefs-resetpass": "ប្តូរពាក្យសម្ងាត់",
        "prefs-changeemail": "ផ្លាស់ប្ដូរអ៊ីមែល",
        "prefs-setemail": "ដាក់អាសយដ្ឋានអ៊ីមែលមួយ",
-       "prefs-email": "\nជំរើសទាក់ទិននឹងអ៊ីមែល",
+       "prefs-email": "ជម្រើសទាក់ទិននឹងអ៊ីមែល",
        "prefs-rendering": "ការរចនា",
        "saveprefs": "រក្សាទុក",
        "restoreprefs": "ស្ដារ​ការកំណត់​ទាំងអស់​ទៅ​លំនាំដើម (គ្រប់ផ្នែកទាំងអស់)",
        "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|ថ្ងៃ|ថ្ងៃ}})",
        "savedprefs": "ចំណង់ចំណូលចិត្តនានារបស់អ្នកត្រូវបានរក្សាទុកហើយ។",
        "timezonelegend": "ល្វែង​ម៉ោង:",
        "localtime": "ម៉ោងក្នុងស្រុក​៖",
-       "timezoneuseserverdefault": "á\9e\8fá\9e¶á\9e\98á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\86á\9e\93ត់ដើមរបស់វិគី ($1)",
-       "timezoneuseoffset": "á\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\91á\9f\80á\9e\8f (á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\98á\9f\89á\9f\84á\9e\84á\9e\8aá\9f\84á\9e\99á\9e\81á\9f\92á\9e\9bá\9e½á\9e\93á\9e¯ង)",
-       "servertime": "ម៉ោងម៉ាស៊ីនបម្រើ​៖",
+       "timezoneuseserverdefault": "á\9e\8fá\9e¶á\9e\98á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\86á\9e\8eត់ដើមរបស់វិគី ($1)",
+       "timezoneuseoffset": "á\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\91á\9f\80á\9e\8f (á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e\82á\9e\98á\9f\92á\9e\9bá\9e¶á\9e\8fá\9e\98á\9f\89á\9f\84ង)",
+       "servertime": "á\9e\98á\9f\89á\9f\84á\9e\84á\9e\98á\9f\89á\9e¶á\9e\9fá\9f\8aá\9e¸á\9e\93á\9e\94á\9e\98á\9f\92á\9e\9aá\9e¾â\80\8bá\9e\80á\9e¶á\9e\9aá\9f\96",
        "guesstimezone": "បំពេញពីកម្មវិធីរាវរក",
        "timezoneregion-africa": "អាហ្វ្រិក",
        "timezoneregion-america": "អាមេរិក",
        "prefs-namespaces": "លំហឈ្មោះ",
        "default": "លំនាំដើម",
        "prefs-files": "ឯកសារ",
-       "prefs-custom-css": "កែតំរូវ CSS",
-       "prefs-custom-js": "កែតំរូវ JS",
+       "prefs-custom-css": "CSS កែសម្រួល",
+       "prefs-custom-js": "JavaScript កែសម្រួល",
        "prefs-common-css-js": "CSS/JavaScriptរួមសំរាប់សំបកទាំងអស់",
        "prefs-reset-intro": "អ្នក​អាច​ប្រើ​ទំព័រ​នេះ​ដើម្បី​កំណត់​ឡើង​វិញ​នូវ​ចំណូល​ចិត្ត​របស់​អ្នក​ដូច​លំនាំ​ដើម​របស់​តំបន់​វិញ​។\nសកម្មភាព​នេះ​មិន​អាច​ធ្វើ​ឡើង​វិញ​បាន​ទេ​។",
        "prefs-emailconfirm-label": "បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖",
        "recentchangeslinked-summary": "នេះជាបញ្ជីបន្លាស់ប្ដូរនានា ដែលត្រូវបានធ្វើឡើងនៅលើទំព័រទាំងឡាយ ដែលមានតំណភ្ជាប់ពីទំព័រកំណត់មួយ(ឬ មានតំណភ្ជាប់ទៅទំព័រ ដែលមានក្នុងចំណាត់ថ្នាក់ក្រុមណាមួយ) នាពេលថ្មីៗនេះ ។ ទំព័រ​នានាក្នុង[[Special:Watchlist|បញ្ជីតាមដាន​របស់អ្នក]]ត្រូវបានសរសេរជា '''អក្សរដិត''' ។",
        "recentchangeslinked-page": "ឈ្មោះទំព័រ៖",
        "recentchangeslinked-to": "បង្ហាញ​បន្លាស់ប្ដូររបស់​ទំព័រដែល​មានតំណភ្ជាប់នឹង​ទំព័រ​ដែល​បាន​ផ្ដល់​ឱ្យ​​វិញ",
+       "recentchanges-page-added-to-category": "[[:$1]] ត្រូវបានបន្ថែមទៅក្នុងចំណាត់ថ្នាក់ក្រុម",
        "upload": "ផ្ទុកឯកសារឡើង",
        "uploadbtn": "ផ្ទុកឯកសារឡើង",
        "reuploaddesc": "ឈប់ផ្ទុកឡើងរួចត្រឡប់ទៅបែបបទផ្ទុកឡើងវិញ។",
        "upload-too-many-redirects": "URLនេះមានតំណភ្ជាប់បញ្ជូនបន្តច្រើនពេកហើយ",
        "upload-http-error": "មានកំហុសHTTPមួយបានកើតឡើង៖ $1",
        "upload-dialog-title": "ផ្ទុកឯកសារឡើង",
-       "upload-dialog-error": "មានបញ្ហាកើតឡើង",
-       "upload-dialog-warning": "មានការព្រមាន",
        "upload-dialog-button-cancel": "បោះបង់",
        "upload-dialog-button-done": "រួចរាល់",
        "upload-dialog-button-save": "រក្សាទុក",
        "upload-dialog-button-upload": "ផ្ទុកឡើង",
-       "upload-dialog-label-select-file": "ជ្រើសរើសឯកសារ",
-       "upload-dialog-label-infoform-title": "ព័ត៌មាន​លំអិត",
-       "upload-dialog-label-infoform-name": "ឈ្មោះ​",
-       "upload-dialog-label-infoform-description": "ការ​ពិពណ៌នា",
-       "upload-dialog-label-usage-title": "បម្រើបម្រាស់",
-       "upload-dialog-label-usage-filename": "ឈ្មោះឯកសារ",
+       "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": "ឈ្មោះឯកសារ",
        "backend-fail-notexists": "គ្មានឯកសារ \"$1\" ទេ។",
        "backend-fail-notsame": "ឯកសារដែលមិនដូចគ្នាបេះបិទមួយមានរួចហើយនៅ \"$1\"។",
        "backend-fail-delete": "មិនអាចលុបឯកសារ \"$1\" បានទេ។",
        "filerevert-legend": "ត្រឡប់ឯកសារ",
        "filerevert-intro": "អ្នក​កំពុង​នឹង​ចាប់​ផ្ដើម​ត្រឡប់​ឯកសារ​'''[[Media:$1|$1]]''' ទៅ​កាន់​[កំណែ​ $4 ដែលមាន​កាល​បរិច្ឆេទ​ $3, $2]។",
        "filerevert-comment": "មូលហេតុ៖",
-       "filerevert-defaultcomment": "á\9e\94á\9e\98á\9f\92á\9e\9bá\9f\82á\9e\84á\9e\91á\9f\85á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8aá\9e¾á\9e\98á\9e\87á\9e¶$2, $1",
+       "filerevert-defaultcomment": "á\9e\94á\9e¶á\9e\93á\9e\94á\9f\86á\9e\9bá\9f\82á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¡á\9e\94á\9f\8bá\9e\91á\9f\85á\9e\80á\9f\86á\9e\8eá\9f\82 $2, $1 ($3)",
        "filerevert-submit": "ត្រឡប់",
        "filerevert-success": "បានត្រឡប់ '''[[Media:$1|$1]]''' ទៅ [$4 កំណែកាលពី $3, $2]",
        "filerevert-badversion": "ឯកសារដែលមានកាលបរិច្ឆេទដូចដែលអ្នកផ្ដល់អោយ មិនមានកំណែពីមុននៅក្នុងវិគីនេះទេ។",
        "move-page-legend": "ប្តូរទីតាំងទំព័រ",
        "movepagetext": "ការប្រើប្រាស់សំណុំបែបបទខាងក្រោម​នឹង​ប្តូរ​ឈ្មោះ​ទំព័រ និងប្តូរទីតាំង​ប្រវត្តិទាំងអស់​របស់​វា​ទៅ​ឈ្មោះថ្មី​នោះ។\nចំណងជើង​ចាស់​នឹង​ក្លាយជា​ទំព័រ​បញ្ជូនបន្តទៅ​ចំណងជើងថ្មី​។\nអ្នកអាចបន្ទាន់សម័យការបញ្ជូនបន្តដែលសំដៅទៅរកចំណងជើងចាស់ដោយស្វ័យប្រវត្តិ។ បើសិនជាអ្នកជ្រើសរើសមិនធ្វើបែបនេះ សូមកុំភ្លេចពិនិត្យ [[Special:DoubleRedirects|ការបញ្ជូនបន្តទ្វេដង]] និង[[Special:BrokenRedirects|ការបញ្ជូនបន្តដែលដាច់]]។ \nអ្នកមានភារៈធ្វើអោយប្រាកដថាតំណភ្ជាប់ទាំងនោះនៅតែបន្តសំដៅ​ទៅ​កាន់ទំព័រគោលដៅត្រឹមត្រូវ​។\n\nទំព័រចាស់នឹង'''មិន'''ត្រូវ បានប្តូរទីតាំង កាលបើ​មានទំព័រ​ក្នុងចំណងជើងថ្មី​រួចហើយ លើកលែងតែក្នុងករណីទំព័រ​ក្នុងចំណងជើងថ្មីជា​ទំព័របញ្ជូនបន្តហើយ​គ្មានប្រវត្តិកែប្រែពីមុន។ វាមានន័យថា អ្នកអាចប្តូរឈ្មោះទំព័រ​ទៅទីតាំងដើម ករណី​អ្នកបានធ្វើខុសដោយអចេនតនា ហើយអ្នកមិនអាចសរសេរជាន់ពីលើ ទំព័រមានស្រាប់​។\n\n'''ប្រយ័ត្ន!'''\nវាអាចជាបន្លស់ប្តូរដល់ឫសគល់និង​មិននឹកស្មានជាមុន សម្រាប់​ទំព័រប្រជាប្រិយ​។ អ្នកត្រូវតែ​ដឹងប្រាកដ​អំពី​ផលវិបាកទាំងអស់ មុននឹង​បន្តទង្វើនេះ​។",
        "movepagetalktext": "ទំព័រសហពិភាក្សាបើមាន នឹងត្រូវបានប្តូរទៅឈ្មោះ​ថ្មី​ជាមួយគ្នា​ដោយ​ស្វ័យប្រវត្តិ '''លើកលែងតែ៖'''\n*ទំព័រពិភាក្សាមិនទទេនិងមានរួចរាល់ក្រោមឈ្មោះថ្មី ឬ\n*អ្នក​ដោះប្រអប់ធីក​ខាងក្រោម។\n\nក្នុង​ករណី​ទាំង​នោះ អ្នក​នឹង​ត្រូវតែ​ប្តូរឈ្មោះ​ទំព័រ​ឬ​បញ្ចូលរួមគ្នា​បើ​អ្នក​ចង់។",
-       "movearticle": "ប្ដូរទីតាំងទំព័រ៖",
        "moveuserpage-warning": "'''ប្រយ័ត្ន៖''' អ្នកបំរុងនឹងប្ដូរទីតាំងទំព័រអ្នកប្រើប្រាស់មួយហើយ។ សូមសំគាល់ថា ទំព័រនឹងត្រូវបានប្ដូរទីតាំង ក៏ប៉ុន្តែអ្នកប្រើប្រាស់នឹង''មិន''ត្រូវបានប្ដូរឈ្មោះទេ។",
        "movenologintext": "អ្នក​ត្រូវតែ​ជា​អ្នកប្រើប្រាស់​ដែល​បាន​ចុះឈ្មោះ ហើយបាន [[Special:UserLogin|កត់ឈ្មោះចូល]] ដើម្បីប្ដូរទីតាំងទំព័រមួយ។",
        "movenotallowed": "អ្នកមិនត្រូវបាន​អនុញ្ញាត​ឱ្យ​ប្តូរទីតាំងទំព័រ​ទេ។",
index 8176256..f809817 100644 (file)
        "mergehistory-go": "ವಿಲೀನಗೊಳಿಸಬಹುದಾದ ಸಂಪಾದನೆಗಳನ್ನು ತೋರಿಸು",
        "mergehistory-submit": "ಆವೃತ್ತಿಗಳನ್ನು ವಿಲೀನಗೊಳಿಸು",
        "mergehistory-empty": "ಯಾವ ಸಂಪಾದನೆಗಳನ್ನೂ ಸೇರ್ಪಡೆ ಮಾಡಲು ಆಗುವುದಿಲ್ಲ.",
-       "mergehistory-success": "[[:$1]] ಪುಟದ $3 {{PLURAL:$3|ಬದಲಾವಣೆಯನ್ನು|ಬದಲಾವಣೆಗಳನ್ನು}} [[:$2]] ಒಳಗೆ ಯಶಸ್ವಿಯಾಗಿ ಸೇರ್ಪಡೆ ಮಾಡಲಾಯಿತು.",
+       "mergehistory-done": "$1 ಪುಟದ $3 {{PLURAL:$3|ಬದಲಾವಣೆಯನ್ನು|ಬದಲಾವಣೆಗಳನ್ನು}} [[:$2]] ಒಳಗೆ ಯಶಸ್ವಿಯಾಗಿ ಸೇರ್ಪಡೆ ಮಾಡಲಾಯಿತು.",
        "mergehistory-fail": "ಇತಿಹಾಸಗಳ ಸೇರ್ಪಡೆಯು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಪುಟದ ಮತ್ತು ಕಾಲದ ಮಾಹಿತಿಗಳನ್ನು ಮತ್ತೊಮ್ಮೆ ಪರಿಶೀಲಿಸಿ.",
        "mergehistory-no-source": "ಮೂಲ ಪುಟ $1 ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇಲ್ಲ.",
        "mergehistory-no-destination": "ಸೇರ್ಪಡೆಯನ್ನು ಸ್ವೀಕರಿಸಬೇಕಾದ ಪುಟ $1 ಅಸ್ಥಿತ್ವದಲ್ಲಿಲ್ಲ.",
        "move-page-legend": "ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "movepagetext": "ಈ ಕೆಳಗಿನ ಫಾರ್ಮನ್ನು ಉಪಯೋಗಿಸಿದಲ್ಲಿ ಪುಟವನ್ನು ಪುನರ್ನಾಮಕರಣ ಮಾಡಲಾಗುವುದು ಮತ್ತು ಅದರ ಸಂಪಾದನೆಯ ಇತಿಹಾಸವನ್ನು ಹೊಸ ಹೆಸರಿಗೆ ವರ್ಗಾಯಿಸಲಾಗುವುದು.\nಹಳೆ ಶೀರ್ಷಿಕೆ ಹೊಸ ಶೀರ್ಷಿಕೆಗೆ ಪುನರ್ನಿರ್ದೇಶಿಸಲಾಗುವುದು.\nಹಳೆ ಶೀರ್ಷಿಕೆಗೆ ಇರುವ ಸಂಪರ್ಕಗಳನ್ನು ಬದಲಾಯಿಸಲಾಗುವುದಿಲ್ಲ;\nದಯವಿಟ್ಟು ಹಳೆ ಶೀರ್ಷಿಕೆಗೆ ಪುನರ್ನಿರ್ದೇಶಿತವಾಗಿದ್ದ ಪುಟಗಳನ್ನು ಕೈಯಾರೆ ಹೊಸ ಶೀರ್ಷಿಕೆಗೆ ಬದಲಾಯಿಸಿ.\nಇದನ್ನು ಮಾಡದೆ ಇರುವ ಪಕ್ಷದಲ್ಲಿ, [[Special:DoubleRedirects|ಮರುಕಳಿಸಿದ ಪುನರ್ನಿರ್ದೇಶನಗಳು]] ಅಥವ [[Special:BrokenRedirects|ಮುರಿದ ರೀಡೈರೆಕ್ಟುಗಳು]] ನೋಡಿ.\nಇತರ ಸಂಪರ್ಕಗಳು ಯಾವೂ ಮುರಿದಿಲ್ಲವೆಂದು ಖಚಿತಪಡಿಸುವುದು ನಿಮ್ಮ ಜವಾಬ್ದಾರಿ.\n\nಗಮನಿಸಿ: ನೀವು ಸೂಚಿಸಿರುವ ಹೊಸ ಶೀರ್ಷಿಕೆಯಡಿಯಲ್ಲಿ ಆಗಲೇ ಪುಟವೊಂದು ಇದ್ದಲ್ಲಿ ಈ ಸ್ಥಳಾಂತರವನ್ನು ಮಾಡಲು ಸಾಮಾನ್ಯವಾಗಿ ''ಆಗುವುದಿಲ್ಲ'' - ಕೇವಲ ಆ ಪುಟ ಖಾಲಿ ಇದ್ದರೆ ಮತ್ತು ಯಾವುದೂ ಸಂಪಾದನೆ ಇತಿಹಾಸವು ಇಲ್ಲದಿದ್ದರೆ ಮಾತ್ರ ಸಾಧ್ಯ.\n\n'''ಎಚ್ಚರಿಕೆ!'''\nಅನೇಕ ಸಂಪರ್ಕಗಳಿರುವ ಪುಟವನ್ನು ನೀವು ಸ್ಥಳಾಂತರಿಸುತ್ತಿರುವುದೇ ಆದರೆ ಇದೊಂದು ದೊಡ್ಡ ಹಾಗು ಅನಿರೀಕ್ಷಿತ ಬದಲಾವಣೆಯಾಗಬಹುದು;\nದಯವಿಟ್ಟು ನೀವು ಮಾಡುತ್ತಿರುವ ಕ್ರಮದ ಪರಿಣಾಮಗಳನ್ನು ಅರಿತಿರುವಿರೆಂದು ಖಾತ್ರಿ ಪಡಿಸಿಕೊಂಡ ನಂತರ ಮುನ್ನಡೆಯಿರಿ.",
        "movepagetalktext": "ಜೊತೆಗಿನ ಚರ್ಚೆ ಪುಟವೂ ಸ್ಥಳಾಂತರಿಸಲಾಗುವುದು. ಈ ಸ್ಥಳಾಂತರ '''ಆಗದಿರುವ''' ಪ್ರಸಂಗಗಳು:\n*ಸ್ಥಳಾಂತರಿಕೆಯ ಹೆಸರಿನಲ್ಲಿ ಆಗಲೇ ಖಾಲಿಯಲ್ಲದ ಒಂದು ಪುಟವು ಇದ್ದಲ್ಲಿ, ಅಥವ\n*ಕೆಳಗಿನ ಚೌಕದಲ್ಲಿರುವ tick mark ಅನ್ನು ನೀವು ತಗೆದಲ್ಲಿ.\n\nಈ ಪ್ರಸಂಗಗಳಲ್ಲಿ ನೀವು ಸ್ವತಃ ಚರ್ಚೆ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಬೇಕು ಅಥವ ಒಂದುಗೂಡಿಸಬೇಕು.",
-       "movearticle": "ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "movenologintext": "ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ನೀವು ನೋಂದಾಯಿತ ಸದಸ್ಯರಾಗಿದ್ದು [[Special:UserLogin|ಲಾಗಿನ್]] ಆಗಿರಬೇಕು.",
        "movenotallowed": "ನಿಮಗೆ {{SITENAME}} ಅಲ್ಲಿ ಪುಟಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸುವ ಅನುಮತಿ ಇಲ್ಲ.",
        "newtitle": "ಈ ಹೊಸ ಶೀರ್ಷಿಕೆಗೆ:",
index a909979..91e24e1 100644 (file)
@@ -52,7 +52,8 @@
                        "Lefion",
                        "Leeheonjin",
                        "Hwangjy9",
-                       "Kurousagi"
+                       "Kurousagi",
+                       "Macofe"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "nstab-template": "틀",
        "nstab-help": "도움말",
        "nstab-category": "분류",
+       "mainpage-nstab": "대문",
        "nosuchaction": "이러한 명령이 없습니다",
        "nosuchactiontext": "URL에 지정한 명령이 올바르지 않습니다.\nURL을 잘못 입력했거나, 올바르지 않은 링크를 따라갔을 수 있습니다.\n{{SITENAME}}에 사용하는 소프트웨어의 버그가 있을 수 있습니다.",
        "nosuchspecialpage": "해당하는 특수 문서가 없습니다.",
        "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|문서}}",
        "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": "ë¹\84ë°\80ë²\88í\98¸ ì\9e¬ì\84¤ì \95 ì\9d´ë©\94ì\9d¼ì\9d\84 ë³´ë\83\88ì\8aµ니다.",
+       "passwordreset-emailsent": "ë\8b¹ì\8b ì\9d\98 ê³\84ì \95ì\97\90 ë\93±ë¡\9dë\90\9c ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8cê°\80 ì\9e\88ë\8b¤ë©´, ë¹\84ë°\80ë²\88í\98¸ ì\9e¬ì\84¤ì \95 ë©\94ì\9d¼ì\9d´ ì \84í\95´ì§\88 ê²\83ì\9e\85니다.",
        "passwordreset-emailsent-capture": "비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.",
        "passwordreset-emailerror-capture": "비밀번호 재설정 이메일이 생성되어 아래에 보여져 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1",
-       "changeemail": "이메일 주소 바꾸기",
-       "changeemail-text": "이메일 주소를 바꾸려면 이 양식을 채우세요. 이 바뀜을 확인하기 위해 비밀번호를 입력해야 합니다.",
+       "changeemail": "이메일 주소를 바꾸거나 제거하기",
+       "changeemail-text": "이메일 주소를 바꾸려면 이 양식을 채우세요. 이 바뀜을 확인하기 위해 비밀번호를 입력해야 합니다. 계정에서 이메일 연동을 취소하고 싶다면 양식을 제출할 때 새 이메일 주소를 공란으로 두세요.",
        "changeemail-no-info": "이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.",
        "changeemail-oldemail": "현재 이메일 주소:",
        "changeemail-newemail": "새 이메일 주소:",
        "changeemail-password": "{{SITENAME}} 비밀번호:",
        "changeemail-submit": "이메일 주소 바꾸기",
        "changeemail-throttled": "로그인에 연속으로 너무 많이 실패하였습니다.\n$1 기다렸다가 다시 시도하세요.",
+       "changeemail-nochange": "다른 이메일 주소를 입력해 주세요.",
        "resettokens": "토큰 재설정",
        "resettokens-text": "여기에 당신의 계정과 관련된 특정 개인 데이터에 접근을 허용하는 토큰을 재설정합니다.\n\n토큰이 다른 사람에게 알려졌거나 계정이 침해되었을 때는 재설정해야 합니다.",
        "resettokens-no-tokens": "재설정할 토큰이 없습니다.",
        "mergehistory-go": "합칠 수 있는 편집 보기",
        "mergehistory-submit": "판 합치기",
        "mergehistory-empty": "합칠 수 있는 판이 없습니다.",
-       "mergehistory-success": "[[:$1]] 문서의 {{PLURAL:$3|판}} $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.",
+       "mergehistory-done": "$1 문서의 {{PLURAL:$3|판}} $3개{{PLURAL:$3|가}} [[:$2]]에 성공적으로 합쳐졌습니다.",
        "mergehistory-fail": "역사 합치기를 수행할 수 없습니다, 문서와 시간 변수를 다시 확인하세요.",
        "mergehistory-fail-toobig": "옮기려는 {{PLURAL:$1|판}} $1개 제한보다 많이 역사 병합을 수행할 수 없습니다.",
        "mergehistory-no-source": "원본인 $1 문서가 존재하지 않습니다.",
        "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": "최근 바뀜에 보여줄 날짜 수:",
        "recentchangesdays-max": "최대 $1{{PLURAL:$1|일}}",
        "recentchangeslinked-summary": "지정된 문서를 가리키는 문서(또는 지정된 분류에 들어 있는 문서)에 대한 최근에 바뀐 목록입니다.\n[[Special:Watchlist|주시문서 목록]]에 있는 문서는 <strong>굵게</strong> 나타납니다.",
        "recentchangeslinked-page": "문서 이름:",
        "recentchangeslinked-to": "해당 문서를 가리키는 문서의 바뀜 보기",
+       "recentchanges-page-added-to-category": "[[:$1]]이(가) 분류에 추가되었습니다",
+       "recentchanges-page-removed-from-category": "[[:$1]]이(가) 분류에서 제거되었습니다",
        "upload": "파일 올리기",
        "uploadbtn": "파일 올리기",
        "reuploaddesc": "올리기를 취소하고 올리기 양식으로 돌아가기",
        "upload-http-error": "HTTP 오류 발생: $1",
        "upload-copy-upload-invalid-domain": "이 도메인에 속하지 않는 웹사이트의 파일을 올릴 수 없습니다.",
        "upload-dialog-title": "파일 올리기",
-       "upload-dialog-error": "오류가 발생했습니다",
-       "upload-dialog-warning": "경고가 일어났습니다",
        "upload-dialog-button-cancel": "취소",
        "upload-dialog-button-done": "완료",
        "upload-dialog-button-save": "저장",
        "upload-dialog-button-upload": "올리기",
-       "upload-dialog-label-select-file": "파일을 선택해주세요.",
-       "upload-dialog-label-infoform-title": "자세한 사항",
-       "upload-dialog-label-infoform-name": "이름",
-       "upload-dialog-label-infoform-description": "설명",
-       "upload-dialog-label-usage-title": "사용",
-       "upload-dialog-label-usage-filename": "파일 이름",
+       "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": "날짜",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "이 파일의 저작권을 소유하지 않거나 다른 라이선스로 배포하고 싶다면 [https://commons.wikimedia.org/wiki/Special:UploadWizard 공용 파일 올리기 마법사]를 이용해 보세요.",
        "backend-fail-stream": "\"$1\" 파일을 스트림할 수 없습니다.",
        "backend-fail-backup": "\"$1\" 파일을 백업할 수 없습니다.",
        "backend-fail-notexists": "$1 파일이 존재하지 않습니다.",
        "filerevert-legend": "파일 되돌리기",
        "filerevert-intro": "'''[[Media:$1|$1]]''' 파일을 [$4 $2 $3 버전]으로 되돌립니다.",
        "filerevert-comment": "이유:",
-       "filerevert-defaultcomment": "$1 $2 판으로 되돌림",
+       "filerevert-defaultcomment": "$1 $2 ($3) 판으로 되돌림",
        "filerevert-submit": "되돌리기",
        "filerevert-success": "'''[[Media:$1|$1]]''' 파일을 [$4 $2 $3 버전]으로 되돌렸습니다.",
        "filerevert-badversion": "입력된 시간 기록을 가진 파일의 로컬 버전이 없습니다.",
        "booksources-text": "아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다.",
        "booksources-invalid-isbn": "입력한 ISBN이 올바르지 않은 것으로 보입니다. 원본과 대조해 문제가 있는지 확인해보세요.",
        "specialloguserlabel": "작업 수행자:",
-       "speciallogtitlelabel": "대상 (제목 또는 사용자):",
+       "speciallogtitlelabel": "대상 (제목 또는 {{ns:user}}:사용자_이름 으로사용자):",
        "log": "기록 목록",
        "all-logs-page": "모든 공개 기록",
        "alllogstext": "{{SITENAME}}에서의 기록이 모두 나와 있습니다.\n기록 종류, 사용자 이름, 문서 이름을 선택해서 볼 수 있습니다. (대소문자를 구별합니다.)",
        "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-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": "$1 사용자가 $3 의 콘텐츠 모델을 \"$4\"에서 \"$5\"로 {{GENDER:$2|변경하였습니다}}.",
        "logentry-contentmodel-change-revertlink": "되돌리기",
        "logentry-contentmodel-change-revert": "되돌리기",
        "protectlogpage": "문서 보호 기록",
        "lockedbyandtime": "({{GENDER:$1|$1}} 사용자가 $2 $3에 잠금)",
        "move-page": "$1 옮기기",
        "move-page-legend": "문서 옮기기",
-       "movepagetext": "ì\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®ê¸¸ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9b\90ë\9e\98ì\9d\98 ë¬¸ì\84\9cë\8a\94 ì\83\88 ë¬¸ì\84\9cë¡\9c ë\84\98겨주ë\8a\94 ë§\81í\81¬ë¡\9cë§\8c ë\82¨ê²\8c ë\90\98ê³ ,\nì\9b\90ë\9e\98 ì\9d´ë¦\84ì\9d\84 ê°\80리í\82¤ë\8a\94 ë\84\98겨주기ë\8a\94 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ê°±ì\8b ë\90©ë\8b\88ë\8b¤.\në§\8cì\95½ ì\9d´ ì\84¤ì \95ì\9d\84 ì\84 í\83\9dí\95\98ì§\80 ì\95\8aì\95\98ë\8b¤ë©´ [[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ì\99\80 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]를 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\në\8b¹ì\8b ì\9d\80 ë§\81í\81¬ì\99\80 ê°\80리í\82¤ë\8a\94 ë\8c\80ì\83\81ì\9d´ ì\84\9cë¡\9c ì\9d¼ì¹\98í\95\98ë\8f\84ë¡\9d í\95´ì\95¼ í\95\98ë\8a\94 ì±\85ì\9e\84ì\9d\84 ì§\91니다.\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®ê¸¸ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9b\90ë\9e\98ì\9d\98 ë¬¸ì\84\9cë\8a\94 ì\83\88 ë¬¸ì\84\9cë¡\9c ë\84\98겨주ë\8a\94 ë§\81í\81¬ë¡\9cë§\8c ë\82¨ê²\8c ë\90©ë\8b\88ë\8b¤.\n[[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ì\99\80 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]를 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\në\8b¹ì\8b ì\9d\80 ë§\81í\81¬ì\99\80 ê°\80리í\82¤ë\8a\94 ë\8c\80ì\83\81ì\9d´ ì\84\9cë¡\9c ì\9d¼ì¹\98í\95\98ë\8f\84ë¡\9d í\95´ì\95¼ í\95\98ë\8a\94 ì±\85ì\9e\84ì\9d\84 ì§\91니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 옮긴 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
+       "movepagetext": "ì\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®ê¸¸ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9b\90ë\9e\98ì\9d\98 ë¬¸ì\84\9cë\8a\94 ì\83\88 ë¬¸ì\84\9cë¡\9c ë\84\98겨주ë\8a\94 ë§\81í\81¬ë¡\9cë§\8c ë\82¨ê²\8c ë\90\98ê³ ,\nì\9b\90ë\9e\98 ì\9d´ë¦\84ì\9d\84 ê°\80리í\82¤ë\8a\94 ë\84\98겨주기ë\8a\94 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ê°±ì\8b ë\90©ë\8b\88ë\8b¤.\në§\8cì\95½ ì\9d´ ì\84¤ì \95ì\9d\84 ì\84 í\83\9dí\95\98ì§\80 ì\95\8aì\95\98ë\8b¤ë©´ [[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ì\99\80 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]를 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\në\8b¹ì\8b ì\9d\80 ë§\81í\81¬ì\99\80 ê°\80리í\82¤ë\8a\94 ë\8c\80ì\83\81ì\9d´ ì\84\9cë¡\9c ì\9d¼ì¹\98í\95\98ë\8f\84ë¡\9d í\95´ì\95¼ í\95  ì±\85ì\9e\84ì\9d´ ì\9e\88ì\8aµ니다.\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®ê¸¸ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9b\90ë\9e\98ì\9d\98 ë¬¸ì\84\9cë\8a\94 ì\83\88 ë¬¸ì\84\9cë¡\9c ë\84\98겨주ë\8a\94 ë§\81í\81¬ë¡\9cë§\8c ë\82¨ê²\8c ë\90©ë\8b\88ë\8b¤.\n[[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ì\99\80 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]를 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\në\8b¹ì\8b ì\9d\80 ë§\81í\81¬ì\99\80 ê°\80리í\82¤ë\8a\94 ë\8c\80ì\83\81ì\9d´ ì\84\9cë¡\9c ì\9d¼ì¹\98í\95\98ë\8f\84ë¡\9d í\95´ì\95¼ í\95  ì±\85ì\9e\84ì\9d´ ì\9e\88ì\8aµ니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 옮긴 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
        "movepagetalktext": "딸린 토론 문서도 자동으로 이동합니다. 하지만 다음의 경우는 '''이동하지 않습니다''':\n* 이동할 이름으로 된 문서가 이미 있는 경우\n* 아래의 선택을 해제하는 경우\n\n이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
-       "movearticle": "문서 옮기기:",
        "moveuserpage-warning": "<strong>경고:</strong> 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 <strong>않는다</strong>는 점을 참고하세요.",
        "movecategorypage-warning": "<strong>경고:</strong> 분류 문서를 옮기려고 합니다. 해당 문서만 옮겨지고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
        "movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
        "imageinvalidfilename": "새 파일 이름이 잘못되었습니다.",
        "fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
        "move-leave-redirect": "옮긴 뒤 넘겨주기를 남기기",
-       "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만이 이동할 수 있도록 잠겨 있습니다.\n최근의 기록을 참조를 위해 아래에 제공합니다:",
+       "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만 이동할 수 있도록 잠겨 있습니다.\n최근 기록을 참조를 위해 아래에 제공합니다:",
        "semiprotectedpagemovewarning": "<strong>참고:</strong> 이 문서는 등록된 사용자만이 이동할 수 있도록 잠겨 있습니다.\n최근 기록 내용을 참조를 위해 아래에 제공합니다:",
        "move-over-sharedrepo": "== 파일이 존재함 ==\n[[:$1]] 파일이 공용 저장소에 있습니다. 이 이름으로 파일을 옮기면 공용의 파일을 덮어쓰게 될 것입니다.",
        "file-exists-sharedrepo": "선택한 파일 이름은 공용 저장소에서 사용 중입니다.\n다른 이름을 선택하세요.",
        "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그리고 당신의 컴퓨터에 저장해 둔 후 여기에 올려주세요.",
        "pageinfo-protect-cascading-yes": "예",
        "pageinfo-protect-cascading-from": "연쇄적 보호한 기점",
        "pageinfo-category-info": "분류 정보",
+       "pageinfo-category-total": "사용자 수",
        "pageinfo-category-pages": "문서 수",
        "pageinfo-category-subcats": "하위 분류 수",
        "pageinfo-category-files": "파일 수",
        "tags-deactivate-reason": "이유:",
        "tags-deactivate-not-allowed": "\"$1\" 태그를 비활성화할 수 없습니다.",
        "tags-deactivate-submit": "비활성화",
+       "tags-update-add-not-allowed-one": "\"$1\" 태그를 수동으로 추가하는 것은 허용되지 않습니다.",
+       "tags-update-add-not-allowed-multi": "다음 {{PLURAL:$2|태그는}} 수동으로 추가하는 것이 허용되지 않습니다: $1",
        "tags-update-remove-not-allowed-one": "\"$1\" 태그를 제거하는 것은 허용되지 않습니다.",
        "tags-edit-title": "태그 편집",
        "tags-edit-manage-link": "태그 관리",
        "api-error-badaccess-groups": "이 위키에 파일을 올릴 권한이 없습니다.",
        "api-error-badtoken": "내부 오류: 토큰이 잘못되었습니다.",
        "api-error-copyuploaddisabled": "이 서버에서 URL을 통해 파일 올리기가 비활성화되어 있습니다.",
-       "api-error-duplicate": "이 위키에 내용이 똑같은 {{PLURAL:$1|[$2 다른 파일]}}이 있습니다.",
-       "api-error-duplicate-archive": "같은 내용을 담고 있던 {{PLURAL:$1|[$2 다른 파일]}}이 있었지만 이 {{PLURAL:$1|파일}}은 삭제되었습니다.",
-       "api-error-duplicate-archive-popup-title": "중복된 {{PLURAL:$1|파일}}이 이미 삭제되었습니다.",
-       "api-error-duplicate-popup-title": "중복된 {{PLURAL:$1|파일}}입니다.",
+       "api-error-duplicate": "이 위키에 내용이 똑같은 {{PLURAL:$1|다른 파일}}이 있습니다.",
+       "api-error-duplicate-archive": "같은 내용을 담고 있던 {{PLURAL:$1|다른 파일}}이 있었지만 이 {{PLURAL:$1|파일}}은 삭제되었습니다.",
        "api-error-empty-file": "올리려는 파일이 비어 있습니다.",
        "api-error-emptypage": "새 문서로 빈 문서를 만들 수 없습니다.",
        "api-error-fetchfileerror": "내부 오류: 파일을 불러오는 중 문제가 발생했습니다.",
index a8e026d..682f51d 100644 (file)
        "mergehistory-go": "Бирлешиннген тюрлендириулени кёргюз",
        "mergehistory-submit": "Тюрлениулени бирлештир",
        "mergehistory-empty": "Бирлешдирир ючюн тюрлениуле табылмагъандыла",
-       "mergehistory-success": "[[:$1]] бетни $3 {{PLURAL:$3|тюрлендириую}} тыйыншлы [[:$2]] ичинде бирлешдирилди.",
+       "mergehistory-done": "$1 бетни $3 {{PLURAL:$3|тюрлендириую}} тыйыншлы [[:$2]] ичинде бирлешдирилди.",
        "mergehistory-fail": "Бетлине тарихлери бирлешемеди, тилейбиз бетни эмда заманны параметрлерин джангыдан сынагъыз.",
        "mergehistory-no-source": "$1 тамал бет джокъду",
        "mergehistory-no-destination": "$1 нюзюр бет джокъду",
        "movepagetext": "Тюбюндеги форма бла хайырланыб, сиз бетни атын тюрлендирликсиз, аны бла бирге аны тюрлениулерини журналын джангы оруннга кёчюрлюксюз.\nЭски аты джангы атына джибериу боллукъду.\nЭски атына баргъан джибериулени автоматик халда джангыртыргъа боллукъсуз.\nАлай этмей эсегиз [[Special:DoubleRedirects|экили]] бла [[Special:BrokenRedirects|юзюлген джибериуле]] бармыдыла деб къарагъыз.\nДжибериулени мындан арыда керекли джерни кёргюзюулерине сиз джууаблысыз.\nБет джангыдан джибериу болгъанны, неда тюрлендириулени тарихи болмай бош болгъанны тышында, джангы аты бла бет бар эсе, бетни атын тюрлдендиреллик '''тюлсюз''' .\nАны магъанасы, сиз бетни атын , мындан алгъа болгъан атына къайтарыргъа боллукъсуз, халат бла атын тюрлендирген эсегиз, болгъан бет билмей кетерилиб къаллыкъ тюлдю.\n\n'''ЭСГЕРТИУ!'''\nАтын тюрлендириу, \"айырма бетлени\" уллу ёлчемде , эмда сакъланмагъан тюрлениулеге келтирирге боллукъду.\nТилейбиз, мындан ары бардырлыгъыгъызны аллы бла, ахырында чыгъарыкъ эсеблени ангылагъаныгъызгъа ишексиз болугъуз.",
        "movepagetext-noredirectfixer": "Сиз, тюбюндеги форманы хайырландырыб, бетни атын тюрлендирликсиз, аны бла бирге аны тюрлениулерини журналын джангы оруннга кёчюрлюксюз.\nЭски аты джангы атына джибериу боллукъду.\n[[Special:DoubleRedirects|Экили]] эм [[Special:BrokenRedirects|юзюлген джибериуле]] бар эселе къарагъыз.\nДжибериулени мындан арыда керекли джерни кёргюзюулерине сиз джууаблысыз.\n\nБет джангыдан джибериу болгъанны, неда тюрлендириулени тарихи болмай бош болгъанны тышында, джангы аты бла бет бар эсе, бетни атын тюрлендиреллик '''тюлсюз''' .\nАны магъанасы: сиз бетни атын, мындан алгъа болгъан атына къайтарыргъа боллукъсуз, халат бла атын тюрлендирген эсегиз, болгъан бет билмей кетерилиб къаллыкъ тюлдю.\n\n'''ЭСГЕРТИУ!'''\nАтын тюрлендириу, \"популяр бетлени\" уллу ёлчемде эмда сакъланмагъан тюрлениулеге келтирирге боллукъду.\nМындан ары бардырлыгъыгъызны аллы бла, ахырында чыгъарыкъ эсеблени ангылагъаныгъызгъа ишексиз болугъуз.",
        "movepagetalktext": "Къошулгъан сюзюу бет да автомат халда кёчюрюлюннюкдю, '''быллай ситуация болмаса''':\n\n*Бош болмагъан сюзюу бет бу аты бла барды;\n*Тюбюндеги тизгинде белги салмагъансыз.\n\nАллай ситуация болса, сиз бетлени къол бла кёчюрюрге неда къошаргъа керек боллукъсуз.",
-       "movearticle": "Бетни атын тюрлендир:",
        "moveuserpage-warning": "'''Эс бёлюгюз.''' Къошлуучуну бетини атын тюрлендирирге башлагъансыз. Къуру бетни аты тюрленникди, къошулуучуну аты тюрленник '''тюйюлдю'''.",
        "movenologintext": "Бетни атын тюрлендирир ючюн регистрациялы эмда [[Special:UserLogin|системада]] болургъа керексиз.",
        "movenotallowed": "Бетни атын тюрлендирирге эркинлигигиз джокъду.",
        "searchsuggest-search": "Излеу",
        "searchsuggest-containing": "ичиндегиси…",
        "api-error-badtoken": "Ич халат: терс токен.",
-       "api-error-duplicate-popup-title": "Дубликат {{PLURAL:$1|файл|файлла}}",
        "api-error-empty-file": "Сиз ийген файлны ичи бошду.",
        "api-error-emptypage": "Ичи бош болгъан джангы бетле къураргъа болмайды.",
        "api-error-file-too-large": "Сиз ийген файл асыры уллуду.",
index 83e1fd4..3c575b5 100644 (file)
@@ -8,7 +8,8 @@
                        "Rentenirer",
                        "לערי ריינהארט",
                        "아라",
-                       "TTO"
+                       "TTO",
+                       "Macofe"
                ]
        },
        "tog-underline": "Dun de Lengks ongerschtriische:",
        "disclaimerpage": "Project:Impressum",
        "edithelp": "Hölp för et Beärbeijde",
        "helppage-top-gethelp": "Hölp",
-       "mainpage": "Haupsigg",
-       "mainpage-description": "Haupsigg",
+       "mainpage": "Houpsigg",
+       "mainpage-description": "Houpsigg",
        "policy-url": "Project:Rejelle",
        "portal": "Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}} för Metmaacher",
        "portal-url": "Project:Metmaacher Pooz",
        "nstab-template": "Schablohn",
        "nstab-help": "Hölp",
        "nstab-category": "Saachjropp",
+       "mainpage-nstab": "Houpsigg",
        "nosuchaction": "Di Aufgab („<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">action</code>“) känne mer nit",
        "nosuchactiontext": "<strong>Na su jet:</strong> De Aufgab us däm <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i>, di do hinger „<code>action=</code>“ dren steiht, joh, di kennt heh dat Wiki jar nit.\nDo künns Desch vertipp han, udder ene verkeehte Lengk hät Desch noh heh jebraat.\nEt künnt sesch och öm ene Fäähler en dä Sofware fum Wiki handelle.",
        "nosuchspecialpage": "Esu en {{int:nstab-special}} ha'mer nit",
        "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": "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.",
+       "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-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 Ding Address för de <i lang=\"en\">e-mail</i> ändere",
-       "changeemail-text": "Föll dat Fommulaa uß, öm Ding Adräß för de <i lang=\"en\">e-mail</i> ze ändere.\nDo moß Ding Paßwoot enjävve, öm Ding Änderong ze bschtäätejje.",
+       "changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
+       "changeemail-text": "Föll dat Fommulaa uß, öm Ding Adräß för de <i lang=\"en\">e-mail</i> ze ändere.\nDo moß Ding Paßwoot enjävve, öm Ding Änderong ze bschtäätejje. Wann De dä Bezoch zwesche Dingem Zohjang un en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß loßß wähde wells, drahch för de neuje \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß nix en.",
        "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:",
        "mergehistory-go": "Don Versione zeije, di mer zosamme läje künne",
        "mergehistory-submit": "Versione zosamme läje",
        "mergehistory-empty": "Mer han kei Versione för zesammezeläje",
-       "mergehistory-success": "{{PLURAL:$3|Ein Version es|$3 Versione sen|Kei Version wood}} fun „[[:$1]]“ noh „[[:$2]]“ övverdraare un domet zosamme jelaat.",
+       "mergehistory-done": "{{PLURAL:$3|Ein Väsjohn es|$3 Väsjohn sen|Kei Väsjohn wood}} fun „$1“ noh „[[:$2]]“ övverdraare un domet zosamme jelaat.",
        "mergehistory-fail": "Dat Versione zesamme läje is nit müjjelisch. Don ens di Sigge un de Zigge pröfe!",
        "mergehistory-fail-toobig": "Mih wi {{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein Väsjohne}} wöödte zesamme jelaat. Esu vill künne mer nit, un maache mer nit.",
        "mergehistory-no-source": "En Ursprungssigg „$1“ jidd_et nit.",
        "prefs-watchlist-token": "Oppaßleß_Kännzeijsche:",
        "prefs-misc": "Söns",
        "prefs-resetpass": "Dat Passwood ändere",
-       "prefs-changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere",
+       "prefs-changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
        "prefs-setemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> faßlääje",
        "prefs-email": "<i lang=\"en\">e-mail</i>",
        "prefs-rendering": "Et Sigge-Aanzeije",
        "upload-options": "Ennschtällonge för et Laade",
        "watchthisupload": "Op di Dattei oppaßße",
        "filewasdeleted": "Onger däm Nahme wohd ald ens en Dattei huhjelahde. Di es enzwesche ävver widder fottjeschmeße woode. Luhr leever eets ens en et $1 ih dat De se dann avschpeischere deihs.",
+       "filename-thumb-name": "Dä Nahme süht wi en Övverschreff för e Minnibelldsche uß. Donn kein Minnibelldscher retuhr en et sällve Wikki huhlahde. Söns kam_mer och dä Nahme för di Datteij änndere, datt_e mih Senn hät un keijne tüppesche Aanfang vun enem Minnibelldsche.",
        "filename-bad-prefix": "Dä Datei ier Name fängk met '''„$1“''' aan. dat eß fä jewöhnlesch ene Name, dä en dijjitaale Kammerra iere Belder jitt. Esu en Name donn uns esu winnisch verzälle, dat mer se nit jän em Wiki han wulle.\nBes esu joot un jiff dä enne Name, wo mer mieh met aanfange, öm ze wesse, wat en dä Datei dren es.",
        "filename-prefix-blacklist": " #<!-- Lohß di Reih jenou esu wie se es! --> <pre>\n#  Syntax:\n#   * Alles zwesche em #-Zeiche bes nohm Engk vun de Reih es ene Kommäntaa\n#   * Jede Reih met jet dren es ene typpesche Aanfang för ene Datteiname,\n#   * dä automattesch vun ene Dijjitahlkammera kütt\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # - et ein udder andere mobile Tellefohn -\nIMG # - alljemein üplesch -\nJD # Jenoptik\nMGP # Pentax\nPICT # - diverse -\n #</pre> <!-- Lohß di Reih jenou esu wie se es! -->",
        "upload-success-subj": "Et Huhlade hät jeflupp",
        "upload-http-error": "Ene <i lang=\"en\">HTTP</i>-Fäähler es opjetrodde: $1",
        "upload-copy-upload-invalid-domain": "Fun dä Domain künne mer nix noh heh huh laade. Di es nit zohjelohße.",
        "upload-dialog-title": "Dateij huhlahde",
-       "upload-dialog-error": "Ene Fähler es opjetrodde",
-       "upload-dialog-warning": "En Warnong wood ußjejovve.",
        "upload-dialog-button-cancel": "Ophühre!",
        "upload-dialog-button-done": "Jedonn",
        "upload-dialog-button-save": "Faßhalde",
        "upload-dialog-button-upload": "Lohß Jonn!",
-       "upload-dialog-label-select-file": "De ußjesöhk Dattei",
-       "upload-dialog-label-infoform-title": "Eijnzelheijte",
-       "upload-dialog-label-infoform-name": "Nahme",
-       "upload-dialog-label-infoform-description": "Äkliehrong",
-       "upload-dialog-label-usage-title": "Der Jebruch",
-       "upload-dialog-label-usage-filename": "Dä Dattei iehre Nahme",
+       "upload-process-error": "Ene Fähler es opjetrodde",
+       "upload-process-warning": "En Warnong wood ußjejovve.",
+       "upload-form-label-select-file": "De ußjesöhk Dattei",
+       "upload-form-label-infoform-title": "Eijnzelheijte",
+       "upload-form-label-infoform-name": "Nahme",
+       "upload-form-label-infoform-description": "Äkliehrong",
+       "upload-form-label-usage-title": "Der Jebruch",
+       "upload-form-label-usage-filename": "Dä Dattei iehre Nahme",
+       "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-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.",
        "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.",
        "filerevert-legend": "Dattei zerök holle",
        "filerevert-intro": "<span class=\"plainlinks\">Do bes di Datei '''[[Media:$1|$1]]''' op di [$4 Version fum $2 öm $3 Uhr] zeröck aam sätze.</span>",
        "filerevert-comment": "Jrond:",
-       "filerevert-defaultcomment": "Zerök jesaz op di Version fum $1 öm $2 Uhr",
+       "filerevert-defaultcomment": "Zerök jesaz op di Version fum $1 öm $2 Uhr ($3)",
        "filerevert-submit": "Zeröcknämme",
        "filerevert-success": "<span class=\"plainlinks\">Di Dattei '''[[Media:$1|$1]]''' es jäz op di [$4 Version fum $2 öm $3 Uhr] zerök jesatz.</span>",
        "filerevert-badversion": "Mer han kei Version fun dä Datei för dä aanjejovve Zickpunk.",
        "deletepage": "Schmiiß di Sigg jäz fott",
        "confirm": "Dä Schoz för di Sigg änndere",
        "excontent": "drop stundt: „$1“",
-       "excontentauthor": "drop stundt: „$1“ un dä einzije Schriever woh: „$2“",
+       "excontentauthor": "drop stundt: „$1“ un dä einzije Schriever woh: „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|{{ns:talk}}]])",
        "exbeforeblank": "drop stundt vörher: „$1“",
        "delete-confirm": "„$1“ fottschmieße",
        "delete-legend": "Fottschmieße",
        "movepagetext": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.\nUnger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.\n\nDo kannß dat Höksche säze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.\nLinks op dä ahle Tittel blieve ävver wi se wore, wann De dat Höksche nit säz.\nDat heiß, dann moß De selver nohluure, of do jäz [[Special:DoubleRedirects|dubbelde Ömleidonge]] udder [[Special:BrokenRedirects|kapodde Ömleiduoge]] bei eruskumme.\nWann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffene Links do henjonn, wo se hen jonn solle.\nAlsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDe Sigg weed '''nit''' ömjenannt, wann et met däm neue Name ald en Sigg jitt, '''ußer''' et es en Ömleidong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder zeröck ömbenänne, wam_mer sich bem Ömbenänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n'''Oppjepass!'''\nWat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änderong aam Wiki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
        "movepagetext-noredirectfixer": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Nahme, un all vörherije Väsjohne vun dä Sigg och.\nOnger däm ahle Tittel weed automattesch en Ömleidong op dä neue Tittel enjedrare.\n\nLenks op dä ahle Tittel bliive ävver, wie se wohre.\nDat heiß, Do moß selver nohloore, ov doh jetz [[Special:DoubleRedirects|dubbelde]] oder [[Special:BrokenRedirects|kapodde Ömleidonge]] bei eruskumme.\nWann De en Sigg ömnenne deiß, häs Do och doför ze sorje, dat de betroffe Links doh henjonn, wo se hen jonn solle.\nAlsu holl Der di Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDi Sigg weed '''nit''' ömjenannt, wann et met däm neue Tittel ald en Sigg jitt, '''ußer''' doh es nix drop, oder et es en Ömleijdong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder retuur ömnänne, wam_mer sich mem Ömnänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n<strong>Oppjepaß!</strong>\nWat beim Ömnänne erus kütt, künnt en opfällije un velleijsch stührende Änderong aam Wikki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
        "movepagetalktext": "Dä Sigg ehr Klaafsigg, wann se ein hät, weed automatisch met  ömjenannt, '''usser''' wann:\n* de Sigg en en ander Appachtemeng kütt,\n* en Klaafsigg met däm neue Name ald do es, un et steiht och jet drop,\n* De unge en däm Kääsje '''kei''' Hökche aan häs.\nEn dänne Fäll, muss De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un eröm kopeere watte bruchs.",
-       "movearticle": "Sigg zem Ömnenne:",
        "moveuserpage-warning": "'''Opjepaß:''' Do wells en Metmaachersigg ömnänne, domet weed ävver dä Metmaacher sellver ''nit'' met ömjenannt.",
        "movecategorypage-warning": "<strong>Opjepaß:</strong> Do kanns bloß di Sigg vun dä Saachjropp ömbenänne. Sigge, di en dä ahle Saachjropp sin, blieve doh. Se kumme nit met en di neue Saachjropp.",
        "movenologintext": "Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, öm en Sigg ömzenenne.",
        "version-entrypoints": "<i lang=\"en\" xml:lang=\"en\">URL</i>s för enzeschteije",
        "version-entrypoints-header-entrypoint": "Enschteesch",
        "version-entrypoints-header-url": "<i lang=\"en\">URL</i>",
-       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Der Pad noh de Atikele]",
-       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Der Pad noh de Skrepte]",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Der Pahd noh de Atikele]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Der Pahd noh de Skrepte]",
        "version-libraries": "Enschtallehrte Projrammsammlonge",
        "version-libraries-library": "Projrammsammlong",
        "version-libraries-version": "Väsjohn",
        "logentry-newusers-byemail": "{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $1 wood {{GENDER:$4|als Metmaacher|als Metmaacher||als Metmaacher|als Metmaacher}} aanjelaat un {{GENDER:$4|sing|em sing|däm sing|dä iehr|däm sing}} Paßwoot met der <i lang=\"en>e-mail</i> verscheck.",
        "logentry-newusers-autocreate": "{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $1 wood automattesch {{GENDER:$4|als Metmaacher|als Metmaacher||als Metmaacher|als Metmaacher}} {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} $1 aanjelaat.",
        "logentry-protect-move_prot": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Enschtällong vum schoz vun dä Sigg „$4“ noh dä Sigg „$3“ övvenumme",
+       "logentry-protect-unprotect": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Schoz vun dä Sigg „$3“ opjehovve",
+       "logentry-protect-protect": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ jeschöz: $4",
+       "logentry-protect-protect-cascade": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ jeschöz: $4 met wiggerjävve",
+       "logentry-protect-modify": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Schoz vun dä Sigg „$3“ verändert: $4",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Schoz vun dä Sigg „$3“ verändert: $4 met wiggerjävve",
        "logentry-rights-rights": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät däm Metmaacher „$3“ sing Jroppe-Räächde vun „$4“ op „$5“ ömjestallt.",
        "logentry-rights-rights-legacy": "{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 hät däm Metmaacher $3 sing Räääschte-Jroppe verändert.",
        "logentry-rights-autopromote": "{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 wood automattesch vum $4 zom $5 jemaat.",
        "api-error-badaccess-groups": "Do häs nit et Rääsch, Datteije en heh dat Wiki huhzelaade.",
        "api-error-badtoken": "Fähler: et Kännzeijsche (<i lang=\"en\">token</i>) es kappott.",
        "api-error-copyuploaddisabled": "Et Huhlaade vun enem <i lang=\"en\">URL</i> es op däm ẞööver heh nit zohjelohße.",
-       "api-error-duplicate": "Mer han em Wiki ald {{PLURAL:$1|[$2 en Dattei]|[$2 $1 andere Datteije]|[$2 kein Dattei]}} mem akeraat sellve Enhalldt.",
-       "api-error-duplicate-archive": "Mer hatte {{PLURAL:$1|[$2 en ander Dattei]|[$2 ander Datteije]|[$2 kein ander Dattei]}} heh em Wiki mem sellve Enhalt, ävver se {{PLURAL:$1|es|sen|es}} ald fottjeschmeße woode.",
-       "api-error-duplicate-archive-popup-title": "Ald fottjeschmeße {{PLURAL:$1|es de dubbelte Datei:|sen de dubbelte Dateije:|es kein dubbelte Datteije woode.}}",
-       "api-error-duplicate-popup-title": "Di {{PLURAL:$1|Dattei es|Datteie sen|Dattei es}} ald doh.",
+       "api-error-duplicate": "Mer han em Wiki ald {{PLURAL:$1|[en Dattei]|[$1 andere Datteije]|[kein Dattei]}} mem akeraat sellve Enhalldt.",
+       "api-error-duplicate-archive": "Mer hatte {{PLURAL:$1|[en ander Dattei]|[ander Datteije]|[kein ander Dattei]}} heh em Wiki mem sellve Enhalt, ävver se {{PLURAL:$1|es|sen|es}} ald fottjeschmeße woode.",
        "api-error-empty-file": "En dä huhjelaade Dattei wohr jaa_nix dren.",
        "api-error-emptypage": "Neu läddijje Sigge aanzelääje es verbodde.",
        "api-error-fetchfileerror": "Fähler: Beim eronger Lahde hät jät nit jeflupp.",
index b877a61..ed1dac4 100644 (file)
        "nstab-template": "Şablon",
        "nstab-help": "Alîkarî",
        "nstab-category": "Kategorî",
+       "mainpage-nstab": "Destpêk",
        "nosuchaction": "Çalakiyeke bi vî rengî nîne",
        "nosuchactiontext": "Ew tişta di wê URL'ê de tê gotin ji MediaWiki netê tê çêkirin.",
        "nosuchspecialpage": "Rûpeleke bi vî rengî nîne",
        "createacct-captcha": "Kontrola asayîşê",
        "createacct-imgcaptcha-ph": "Nivîsa ku tu li jor dibînî binivîse",
        "createacct-submit": "Hesabê xwe biafirîne",
-       "createacct-another-submit": "Hesabek din çêke",
+       "createacct-another-submit": "Hesabek çêke",
        "createacct-benefit-heading": "{{SITENAME}} ji alî mirovên wek te tê çêkirin.",
        "createacct-benefit-body1": "{{PLURAL:$1|guhertin}}",
        "createacct-benefit-body2": "{{PLURAL:$1|rûpel}}",
        "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.",
-       "changeemail": "E-nameyê biguherîne",
+       "changeemail": "Navnîşana enameya xwe biguherîne an rabike",
        "changeemail-oldemail": "Navnîşana E-nameya niha:",
        "changeemail-newemail": "Navnîşana e-nameya nû:",
        "changeemail-none": "(nîne)",
        "preview": "Pêşdîtin",
        "showpreview": "Pêşdîtinê nîşan bide",
        "showdiff": "Guherandinan nîşan bide",
-       "anoneditwarning": "'''Hişyarî:''' Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin.",
+       "anoneditwarning": "<strong>Hişyarî:<strong> Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin. Heke tu <strong>[$1 têkevî]</strong>, li gel sûdên te yên din guhertinên ku tu bikî jî wê ji nasnavê te re bê atfkirin.",
        "anonpreviewwarning": "''Tu ne têketî yî. Tomarkirin wê navnîşana IP'ya te di dîroka guhertinan de nîşan bide.''",
        "missingsummary": "<span style=\"color:#990000;\">'''Zanibe:'''</span> Te nivîsekî kurt ji bo guherandinê ra nenivîsand. Eger tu niha carekî din li Tomar xê, guherandinê te vê nivîsekî kurt yê were tomarkirin.",
        "missingcommenttext": "Ji kerema xwe kurteya naverokê li jêr binivisîne.",
        "newarticletext": "Ev rûpel hîn tune. Eger tu bixwazî vê rûpelê çêkî, dest bi nivîsandinê bike û piştre qeyd bike. '''Wêrek be''', biceribîne!<br />\nJi bo alîkariyê binêre: [$1 Alîkarî].<br />\nHeke tu bi şaşîtî hatî, bizîvire rûpela berê.",
        "anontalkpagetext": "----''Ev rûpela gotûbêjê ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin/signup|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
        "noarticletext": "Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li \"{{PAGENAME}}\" bigerî]] an jî [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].",
-       "noarticletext-nopermission": "Ev rûpel niha vala ye. \nTu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li \"{{PAGENAME}}\" bigere]] \nan <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vê rûpelê biguherînî]</span>.",
+       "noarticletext-nopermission": "Ev rûpel niha vala ye. \nTu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li \"{{PAGENAME}}\" bigere]] \nan <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vê rûpelê biguherînî]</span>, lê ji bo çêkirina vê rûpelê desthilatdariya te tine ye.",
        "userpage-userdoesnotexist": "Hesabê bikarhêneran \"<nowiki>$1</nowiki>\" nehatiye qeydkirin. Heke tu bixwazî vê rûpelê çêkî/biguherînî ji kerema xwe lê binêre.",
        "userpage-userdoesnotexist-view": "Hesabê bikarhêner  \"$1\"  nehatiye qeyd kirin.",
        "blocked-notice-logextract": "Ev bikarhêner hatiye astengkirin.\nAstengkirina dawî bi referansa li jêr hatiye piştrastkirin:",
        "currentrev": "Guhertoya niha",
        "currentrev-asof": "Guhertoya herî kevn a $1",
        "revisionasof": "Guhertoya $1",
-       "revision-info": "Guhertoya $1 ya ji aliyê $2 ve",
+       "revision-info": "Guhertoya $1 ya ji aliyê {{GENDER:$6|$2}}$7 ve",
        "previousrevision": "←Guhertoya kevintir",
        "nextrevision": "Guhertoya nûtir →",
        "currentrevisionlink": "Guhertoya niha nîşan bide",
        "shown-title": "Li her rûpelê $1 {{PLURAL:$1|encam|encaman}} nîşan bide",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) nîşan bide",
        "searchmenu-exists": "'''Rûpeleke bi navê \"[[:$1]]\" li ser vê wîkiyê heye.'''",
-       "searchmenu-new": "Rûpela \"[[:$1]]\" çêke!",
+       "searchmenu-new": "<strong>Rûpela \"[[:$1]]\" çêke!</strong>{{PLURAL:$2|0=|See also the page found with your search.|Herwiha li encamên hatiye dîtin jî binêre.}}",
        "searchprofile-articles": "Rûpelên naverokê",
        "searchprofile-images": "Multîmedya",
        "searchprofile-everything": "Her tişt",
        "recentchangeslinked-title": "Guherandinên têkildarî \"$1\"",
        "recentchangeslinked-summary": "Ev lîste, ji rûpela destnîşankirî (an jî endamên destnîşankirî) re rûpelê lîsteya guherandinên dawî ji rûpelên lînkkirî nîşandide. Ew rûpel yê di [[Special:Watchlist|lîsteya te ya şopandinê]] da bi nivîsa <strong>estûr<strong> tên nîşandan.",
        "recentchangeslinked-page": "Navê rûpelê:",
+       "autochange-username": "otomatîk guherandin a MediaWikiyê",
        "upload": "Wêneyekî bar bike",
        "uploadbtn": "Dosyeyek bar bike",
        "reuploaddesc": "Barkirinê biskîne û dîsa here rûpela barkirinê.",
        "upload-failure-subj": "Pirsgirêka barkirinê",
        "upload-warning-subj": "Hişyariya barkirinê",
        "upload-file-error": "Çewtiya navxweyî",
+       "foreign-structured-upload-form-label-own-work": "Min ev xebat bi xwe çêkiriye",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorî",
        "backend-fail-notexists": "Dosye $1 tune ye.",
        "backend-fail-delete": "Dosyeya \"$1\" nikaribû bê jêbirin.",
        "backend-fail-store": "Dosyeya \"$1\" di bin \"$2\" nikaribû bê tomarkirin.",
        "move-page": "$1 bigerîne",
        "move-page-legend": "Vê rûpelê bigerîne",
        "movepagetalktext": "Rûpela '''gotûbêjê''' vê rûpelê wê were, eger hebe, gerandin. Lê ev tişta nameşe, eger\n\n*berê gotûbêjek bi wî navî hebe ya\n*tu tiştekî jêr hilbijêrê.\n\nEger ev mişkla çêbû, tu gireke vê rûpelê bi xwe bigerînê.\n\nXêra xwe navê nû û sedemê navgerandinê binivisîne.",
-       "movearticle": "Rûpelê bigerîne",
        "movenologintext": "Tu dive bikarhênereke qeydkirî bî û [[Special:UserLogin|werî nav sîstemê]]\nda bikarî navê wê rûpelê biguherînî.",
        "movenotallowed": "Mafên te bo guherandina navên gotaran tune ye.",
        "movenotallowedfile": "Mafê te bo guherandina navên data'yan tune ye.",
        "cant-move-user-page": "Mafê te bo guherandina navên rûpelên bikarhêneran tune ye.",
        "cant-move-to-user-page": "Mafê te bo guherandina navên rûpelan berve rûpelên bikarhêneran da tune ye.",
-       "newtitle": "Sernivîsa nû",
+       "newtitle": "Sernivîsa nûː",
        "move-watch": "Vê rûpelê bişopîne",
        "movepagebtn": "Vê rûpelê bigerîne",
        "pagemovedsub": "Gerandin serkeftî",
        "tooltip-t-print": "Versiyona çapkirinê ya vê rûpelê",
        "tooltip-ca-nstab-main": "Li rûpela naverokê binêre",
        "tooltip-ca-nstab-user": "Rûpela bikarhêner bibîne",
-       "tooltip-ca-nstab-special": "This is a special page, you can",
+       "tooltip-ca-nstab-special": "Ev rûpelek taybet e, û ev nikare bê guherandin",
        "tooltip-ca-nstab-project": "Li rûpelê projektê seke",
        "tooltip-ca-nstab-image": "Rûpela dosyeyê bibîne",
        "tooltip-ca-nstab-mediawiki": "Peyama sîstemê bibîne",
        "logentry-delete-delete": "$1 rûpela $3 {{GENDER:$2|jê bir}}",
        "revdelete-content-hid": "naverok veşartî ye",
        "revdelete-uname-hid": "navê bikarhêneriyê yê veşartî",
-       "logentry-move-move": "$1 navê $3 weke $4 guherand",
+       "logentry-move-move": "$1 navê $3 weke $4 {{GENDER:$2|guherand}}",
        "logentry-move-move-noredirect": "$1 navê $3 guherand û kir $4",
        "logentry-move-move_redir": "$1 navê $3 guherand û kir $4",
        "logentry-newusers-newusers": "$1 wek hesabê bikarhêneriyê hate {{GENDER:$2|çêkirin}}",
index 63bb0b3..c322162 100644 (file)
@@ -23,7 +23,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Lesgles",
-                       "StevenJ81"
+                       "StevenJ81",
+                       "Macofe"
                ]
        },
        "tog-underline": "Versores linea denotandi:",
        "filerevert-legend": "Reverti fasciculum",
        "filerevert-intro": "Reverteris '''[[Media:$1|$1]]''' ad [emendationem $4 ex $3, $2].",
        "filerevert-comment": "Causa:",
-       "filerevert-defaultcomment": "Reverti ad emendationem ex $2, $1",
+       "filerevert-defaultcomment": "Reverti ad emendationem ex $2, $1 ($3)",
        "filerevert-submit": "Revertere",
        "filerevert-success": "'''[[Media:$1|$1]]''' reversum est ad [emendationem $4 ex $3, $2].",
        "filedelete": "Delere $1",
        "move-page-legend": "Paginam movere",
        "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.",
-       "movearticle": "Paginam movere:",
        "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.",
        "movenotallowed": "Tibi non licet paginas movere.",
index a65b64a..f7583af 100644 (file)
        "nstab-template": "Schabloun",
        "nstab-help": "Hëllef-Säit",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Haaptsäit",
        "nosuchaction": "Dës Aktioun gëtt et net",
        "nosuchactiontext": "Déi Aktioun, déi an der URL ugi war, ass net valabel.\nMéiglecherweis hutt dir Iech bei der URL vertippt, oder Dir hutt op en net korrekte Link geklickt.\nEt kann awer och sinn datt et e Bug a(n) der Software op {{SITENAME}} gëtt.",
        "nosuchspecialpage": "Spezialsäit gëtt et net",
        "viewsource": "Quelltext kucken",
        "viewsource-title": "Quelltext vun der Säit $1 weisen",
        "actionthrottled": "Dës Aktioun gouf gebremst",
-       "actionthrottledtext": "Fir géint de Spam virzegoen, ass dës Aktioun sou programméiert datt Dir se an enger kuerzer Zäit nëmme limitéiert dacks maache kënnt. Dir hutt dës Limite iwwerschratt. Versicht et w.e.g. an e puer Minutten nach eng Kéier.",
+       "actionthrottledtext": "Fir géint Mëssbrauch virzegoen, ass dës Aktioun sou programméiert datt Dir se an enger kuerzer Zäit nëmme limitéiert dacks maache kënnt. Dir hutt dës Limite iwwerschratt. Versicht et w.e.g. an e puer Minutten nach eng Kéier.",
        "protectedpagetext": "Dës Säit ass fir Ännerungen an aner Aktioune gespaart.",
        "viewsourcetext": "Dir kënnt de Quelltext vun dëser Säit kucken a kopéieren.",
        "viewyourtext": "Dir kënnt de Quelltext vun <strong>Ären Ännerungen</strong> op dëser Säit kucken a kopéieren.",
        "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": "Maacht een anere Benotzerkonnt op",
+       "createacct-another-submit": "Benotzerkont uleeën",
        "createacct-benefit-heading": "{{SITENAME}} gëtt vu Leit wéi Iech gemaach.",
        "createacct-benefit-body1": "{{PLURAL:$1|Ännerung|Ännerungen}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Säit|Säiten}}",
        "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": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt.",
+       "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-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": "Mailadress änneren",
-       "changeemail-text": "Fëllt dëse Formulaire aus fir Är Mailadress z'änneren. Dir musst Äert Passwuert aginn fir dës Ännerung ze confirméieren.",
+       "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
+       "changeemail-text": "Fëllt dëse Formulaire aus fir Är E-Mailadress z'änneren. Dir musst Äert Passwuert aginn fir dës Ännerung ze confirméieren. Wann Dir d'Verbindung mat Ärer E-Mailadress vun Ärem Benotzerkont erofhuele wëllt, da loosst d'Feld e-Mailadress eidel wann Dir de Formulaire späichert.",
        "changeemail-no-info": "Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.",
        "changeemail-oldemail": "Aktuell Mailadress:",
        "changeemail-newemail": "Nei Mailadress:",
        "mergehistory-go": "Weis déi Versiounen, déi zesummegeluecht kënne ginn",
        "mergehistory-submit": "Versioune verschmelzen",
        "mergehistory-empty": "Et kënne keng Versioune zesummegeluecht ginn.",
-       "mergehistory-success": "{{PLURAL:$3|1 Versioun gouf|$3 Versioune goufe}} vu(n) [[:$1]] op [[:$2]] zesummegeluecht.",
+       "mergehistory-done": "{{PLURAL:$3|1 Versioun gouf|$3 Versioune goufe}} vu(n) $1 op [[:$2]] zesummegeluecht.",
        "mergehistory-fail": "Versiounszesummeleeung war net méiglech, kuckt w.e.g. d'Säiten an d'Zäit-Parameter no.",
        "mergehistory-fail-toobig": "D'zesummeleeë vun der Lëscht vun de Versioune konnt net gemaach ginn well méi wéi d'Limite vun $1 {{PLURAL:$1|Versioun|Versioune}} geréckelt géife ginn",
        "mergehistory-no-source": "Originalsäit \"$1\" gëtt et net.",
        "prefs-watchlist-token": "Iwwerwaachungslëscht-Token:",
        "prefs-misc": "Verschiddenes",
        "prefs-resetpass": "Passwuert änneren",
-       "prefs-changeemail": "Mailadress änneren",
+       "prefs-changeemail": "E-Mailadress änneren oder ewechhuelen",
        "prefs-setemail": "Eng Mailadress festleeën",
        "prefs-email": "E-Mail-Optiounen",
        "prefs-rendering": "Ausgesinn",
        "group-bot": "Botten",
        "group-sysop": "Administrateuren",
        "group-bureaucrat": "Bürokraten",
-       "group-suppress": "Iwwersiicht",
+       "group-suppress": "Ënnerdrécker",
        "group-all": "(all)",
        "group-user-member": "{{GENDER:$1|Benotzer}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatesch confirméiert Benotzer}}",
        "group-bot-member": "{{GENDER:$1|Bot}}",
        "group-sysop-member": "{{GENDER:$1|Administrateur|Administratrice}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokrat|Bürokratin}}",
-       "group-suppress-member": "{{GENDER:$1|Iwwersiicht}}",
+       "group-suppress-member": "{{GENDER:$1|Ënnerdrécker}}",
        "grouppage-user": "{{ns:project}}:Benotzer",
        "grouppage-autoconfirmed": "{{ns:project}}:Registréiert Benotzer",
        "grouppage-bot": "{{ns:project}}:Botten",
        "grouppage-sysop": "{{ns:project}}:Administrateuren",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokraten",
-       "grouppage-suppress": "{{ns:project}}:Iwwersiicht",
+       "grouppage-suppress": "{{ns:project}}:Ënnerdrécken",
        "right-read": "Säite liesen",
        "right-edit": "Säiten änneren",
        "right-createpage": "Säiten uleeën (déi keng Diskussiounssäite sinn)",
        "recentchangeslinked-summary": "Dëst ass eng Lëscht mat Ännerunge vu verlinkte Säiten op eng bestëmmte Säit (oder vu Membersäite vun der spezifizéierter Kategorie).\nSäite vun [[Special:Watchlist|Ärer Iwwerwaachungslëscht]] si '''fett''' geschriwwen.",
        "recentchangeslinked-page": "Säitennumm:",
        "recentchangeslinked-to": "Weis Ännerungen zu de verlinkte Säiten aplaz vun der gefroter Säit",
+       "recentchanges-page-added-to-category": "[[:$1]] an d'Kategorie derbäigesat",
+       "recentchanges-page-added-to-category-bundled": "{{PLURAL:$2|}}[[:$1]] a(n) {{PLURAL:$2|eng Säit|$2 Säiten}} an d'Kategorie derbäigesat",
+       "recentchanges-page-removed-from-category": "[[:$1]] erausgeholl aus der Kategorie",
+       "recentchanges-page-removed-from-category-bundled": "{{PLURAL:$2|}}[[:$1]] a(n) {{PLURAL:$2|eng Säit|$2 Säiten}} aus der Kategorie erausgeholl",
+       "autochange-username": "Automatesch MediaWiki-Ännerung",
        "upload": "Eroplueden",
        "uploadbtn": "Fichier eroplueden",
        "reuploaddesc": "Eroplueden ofbriechen an zréck op de Formulaire fir Eropzelueden",
        "upload-http-error": "Et ass en HTTP-Feeler geschitt: $1",
        "upload-copy-upload-invalid-domain": "Vun dësem Domain ass d'Eropluede vu Kopien net méiglech.",
        "upload-dialog-title": "Fichier eroplueden",
-       "upload-dialog-error": "Et ass e Feeler geschitt",
-       "upload-dialog-warning": "Eng Warnung gouf ausgeschwat",
        "upload-dialog-button-cancel": "Ofbriechen",
        "upload-dialog-button-done": "Fäerdeg",
        "upload-dialog-button-save": "Späicheren",
        "upload-dialog-button-upload": "Eroplueden",
-       "upload-dialog-label-select-file": "Fichier eraussichen",
-       "upload-dialog-label-infoform-title": "Detailer",
-       "upload-dialog-label-infoform-name": "Numm",
-       "upload-dialog-label-infoform-description": "Beschreiwung",
-       "upload-dialog-label-usage-title": "Benotzung",
-       "upload-dialog-label-usage-filename": "Numm vum Fichier",
+       "upload-process-error": "Et ass e Feeler geschitt",
+       "upload-process-warning": "Eng Warnung gouf ausgeschwat",
+       "upload-form-label-select-file": "Fichier eraussichen",
+       "upload-form-label-infoform-title": "Detailer",
+       "upload-form-label-infoform-name": "Numm",
+       "upload-form-label-infoform-description": "Beschreiwung",
+       "upload-form-label-usage-title": "Benotzung",
+       "upload-form-label-usage-filename": "Numm vum Fichier",
+       "foreign-structured-upload-form-label-own-work": "Dëst ass mäin eegent Wierk",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorien",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
        "backend-fail-stream": "De Fichier $1 konnt net iwwerdroe ginn.",
        "backend-fail-backup": "De Fichier $1 konnt net geséchert ginn.",
        "backend-fail-notexists": "De Fichier $1 gëtt et net.",
        "filerevert-legend": "De Fichier zrécksetzen.",
        "filerevert-intro": "Dir setzt de Fichier '''[[Media:$1|$1]]''' op d'[$4 Versioun vum $2, $3 Auer] zréck.",
        "filerevert-comment": "Bemierkung:",
-       "filerevert-defaultcomment": "zréckgesat op d'Versioun vum $1, $2 Auer",
+       "filerevert-defaultcomment": "Zréckgesat op d'Versioun vum $1, $2 Auer ($3)",
        "filerevert-submit": "Zrécksetzen",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> gouf op d'[$4 Versioun vum $2, $3 Auer] zréckgesat.",
        "filerevert-badversion": "Et gëtt keng vireg lokal Versioun vun deem Fichier mat der Zäitinformatioun déi Dir uginn hutt.",
        "nopagetext": "Déi Zilsäit déi dir uginn hutt gëtt et net.",
        "pager-newer-n": "{{PLURAL:$1|nächsten|nächst $1}}",
        "pager-older-n": "{{PLURAL:$1|vireg|vireg $1}}",
-       "suppress": "Iwwersiicht",
+       "suppress": "Ënnerdrécken",
        "querypage-disabled": "Dës Spezialsäit ass aus Performance-Grënn ausgeschalt.",
        "apihelp": "API-Hëllef",
        "apihelp-no-such-module": "Modul \"$1\" net fonnt.",
        "emailccsubject": "Kopie vun denger Noriicht un $1: $2",
        "emailsent": "E-Mail geschéckt",
        "emailsenttext": "Är E-Mail gouf fortgeschéckt.",
-       "emailuserfooter": "Dës E-Mail gouf vum $1 dem $2 geschéckt dobäi gouf d'Funktioun \"{{int:emailuser}}\" op {{SITENAME}} benotzt.",
+       "emailuserfooter": "Dës E-Mail gouf  {{GENDER:$1|vum}} $1  {{GENDER:$2|dem}} $2 geschéckt dobäi gouf d'Funktioun \"{{int:emailuser}}\" op {{SITENAME}} benotzt.",
        "usermessage-summary": "Benoriichtegung hannerloossen.",
        "usermessage-editor": "Benoriichtegungs-System",
        "watchlist": "Iwwerwaachungslëscht",
        "deletepage": "Säit läschen",
        "confirm": "Confirméieren",
        "excontent": "Inhalt war: '$1'",
-       "excontentauthor": "Op der Säit stoung: '$1' (An als eenzegen dru geschriwwen hat de Benotzer '[[Special:Contributions/$2|$2]]').",
+       "excontentauthor": "Op der Säit stoung: '$1' an als eenzegen dru geschriwwen hat de Benotzer '[[Special:Contributions/$2|$2]]' ([[User talk:$2|Diskussioun]])",
        "exbeforeblank": "Den Inhalt virum Läsche war: '$1'",
        "delete-confirm": "Läsche vu(n) \"$1\"",
        "delete-legend": "Läschen",
        "move-page-legend": "Säit réckelen",
        "movepagetext": "Wann Dir dëse Formulaire benotzt gitt Dir enger Säit en aneren Numm a réckelt se mat hirem Historique op den neien Numm.\nDen alen Titel gëtt eng Viruleedung op déi nei Säit.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nWann Dir dat net maacht, da vergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weiderhin dohinner pointéieren, wou se hi sollen.\n\nBeuecht w.e.g. datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt Dir eng Säit zréck op hiren ursprénglechen Numm ëmbenenne kënnt wann Dir Iech geiert hat an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit bedeiten;\nverstitt w.e.g. d'Konsequenze vun Ärer Handlung ier Dir dëst maacht.",
        "movepagetext-noredirectfixer": "Wann Dir dëse Formulaire benotzt, réckelt Dir eng komplett Säit mat hirem Historique op en neien Numm.\nDen alen Titel gëtt eng Viruleedung op den neien Titel.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nVergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weider dohi pointéieren, wou se hi sollen.\n\nDenkt w.e.g. drun datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenne kënnt wann Dir e Feeler maacht an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit sinn;\nverstitt w.e.g. d'Konsequenze vun ärer Handlung ier Dir dëst maacht.",
-       "movepagetalktext": "D'associéiert Diskussiounssäit, am Fall wou  eng do ass, gëtt automatesch matgeréckelt, '''ausser:'''\n*D'Säit gëtt an een aneren Nummraum geréckelt.\n*Et gëtt schonn eng Diskussiounssäit mat dësem Numm, oder\n*Dir klickt d'Këschtchen ënnendrënner net un.\n\nAn deene Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéieren.",
-       "movearticle": "Säit réckelen:",
+       "movepagetalktext": "Wann Dir dës Këscht uklickt da gëtt déi associéiert Diskussiounssäit, am Fall wou  eng do ass, automatesch op deen neien Numm matgeréckelt, '''ausser:''' Et gëtt schonn eng Diskussiounssäit mat dësem Numm déi net eidel ass.\n\nAn deem Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéieren.",
        "moveuserpage-warning": "'''Opgepasst:''' Dir sidd am gaang eng Benotzersäit ze réckelen. Denkt w.e.g. dorunn datt just d'Säit geréckelt gëtt an datt de Benotzer ''net'' ëmbenannt gëtt.",
        "movecategorypage-warning": "<strong>Opgepasst:</strong> Dir sidd am Gaang eng Kategorie-Säit ze réckelen. Denkt drun datt nëmmen déi Säit geréckelt gëtt an all Säiten an der aler Kategorie ginn <em>net</em> an déi nei ëmkategoriséiert.",
        "movenologintext": "Dir musst e registréierte Benotzer an [[Special:UserLogin|ageloggt]] sinn, fir eng Säit ze réckelen.",
        "cant-move-to-user-page": "Dir hutt net d'Recht fir eng Säit op eng Benotzersäit (ausser op eng Ënnersäit vun enger Benotzersäit) ze réckelen.",
        "cant-move-category-page": "Dir hutt net déi néideg Rechter fir Kategorie-Säiten ze réckelen.",
        "cant-move-to-category-page": "Dir hutt net déi néideg Rechter fir eng Säit op eng Kategoriesäit ze réckelen.",
-       "newtitle": "Op den neien Titel:",
+       "newtitle": "Neien Titel:",
        "move-watch": "Dës Säit iwwerwaachen",
        "movepagebtn": "Säit réckelen",
        "pagemovedsub": "Gouf geréckelt",
        "api-error-badaccess-groups": "Et ass Iech net erlaabt fir Fichieren op dës Wiki eropzelueden.",
        "api-error-badtoken": "Interne Feeler: falschen Token.",
        "api-error-copyuploaddisabled": "D'Eroplueden iwwer eng URL ass op dësem Server desaktivéiert.",
-       "api-error-duplicate": "Et gëtt schonn {{PLURAL:$1|[$2 en anere Fichier]|[$2 aner Fichiere]}} mat dem selwechten Inhalt op dem Site",
-       "api-error-duplicate-archive": "Et gouf schonn {{PLURAL:$1| [een anere Fichier]|[$2 aner Fichieren]}} op dem Site mat deemselwechten Inhalt, {{PLURAL:$1|e gouf was|se goufen}} awer geläscht.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duebele Fichier, dee scho geläscht gouf|Duebel Fichieren, déi scho geläscht goufen}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duebele Fichier|Duebel Fichieren}}",
+       "api-error-duplicate": "Et gëtt schonn {{PLURAL:$1|en anere Fichier|e puer aner Fichiere}} mat dem selwechten Inhalt op dem Site",
+       "api-error-duplicate-archive": "Et gouf schonn {{PLURAL:$1| een anere Fichier|e puer aner Fichieren}} op dem Site mat deemselwechten Inhalt, {{PLURAL:$1|e gouf|se goufen}} awer geläscht.",
        "api-error-empty-file": "De Fichier deen Dir geschéckt hutt war eidel.",
        "api-error-emptypage": "Et ass net erlaabt nei, eidel Säiten unzeleeën.",
        "api-error-fetchfileerror": "Interne Feeler: beim Opruffe vum Fichier huet eppes net funktionéiert.",
index 5350ef2..d1e9966 100644 (file)
@@ -16,7 +16,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Robin0van0der0vliet",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Links óngersjtriepe",
        "mergehistory-go": "Samevoegbare bewerkinge toeane",
        "mergehistory-submit": "Versies samevoege",
        "mergehistory-empty": "Gein inkele versies kinne samegevoeg waere.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] zeen succesvol samegevoeg nao [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 zeen succesvol samegevoeg nao [[:$2]].",
        "mergehistory-fail": "Kan gein gesjiedenis samevoege, lèvver opnuuj de pagina- en tiedparamaeters te controlere.",
        "mergehistory-no-source": "Bronpagina $1 besteit neet.",
        "mergehistory-no-destination": "Bestömmingspagina $1 besteit neet.",
        "filerevert-legend": "Bestandj trökdrejje",
        "filerevert-intro": "Doe bös '''[[Media:$1|$1]]''' aan 't trökdrèjje tot de [$4 versie op $2, $3]",
        "filerevert-comment": "Raeje:",
-       "filerevert-defaultcomment": "Trökgedrèjt tot de versie op $1, $2",
+       "filerevert-defaultcomment": "Trökgedrèjt tot de versie op $1, $2 ($3)",
        "filerevert-submit": "Trökdrèjje",
        "filerevert-success": "'''[[Media:$1|$1]]''' is trökgedrèjt tot de [$4 versie op $2, $3]",
        "filerevert-badversion": "d'r is geine vörge lokale versie van dit bestand mit 't opgegaeve tiejdstip.",
        "movepagetext": "Mit 't óngersjtaond formuleer kans te 'n pagina verplaatse. \nDe historie van de auw pagina zal nao de nuuj mitgoon. \nDe auwe titel zal automatisch 'ne redirect nao de nuuj pagina waere. \nVerwiezinge nao de auw pagina waere neet aangepas.\nDe pagina's die doorverwieze  nao de oersjprunkelike paginanaom weurt otomatisch biegewirk.\nEs dat neet gewunsj is, controleer dan of d'r gein [[Special:DoubleRedirects|dobbel]] of [[Special:BrokenRedirects|gebraoke redirects]] ontsjtange zien.\n\nDoe kans 'n pagina allein verplaatse, es gein pagina besjteit mit de nuje naam, of es op die pagina allein 'ne redirect zónger historie sjteit.\n\n'''Waarsjoewing!'''\nVeur väöl bekeke pagina's ken 't verplaatse drastische en onveurzene gevolge höbbe.\nZörg deveur dets te die gevolge euverzuus ierdets te dees hanjeling oetvoers.",
        "movepagetext-noredirectfixer": "Mit 't óngersjtaond formuleer kans te 'n pagina verplaatse. De historie van de auw pagina zal nao de nuuj mitgoon. \nDe auwe titel zal automatisch 'ne redirect nao de nuuj pagina waere. \nControleer den of d'r gein [[Special:DoubleRedirects|dobbel]] of [[Special:BrokenRedirects|gebraoke redirects]] ontsjtange zien.\n\nDoe kans 'n pagina '''allein''' verplaatse, es gein pagina besjteit mit de nuje naam, of es op die pagina allein 'ne redirect zónger historie sjteit. Doe kins dus 's pagina die abusievelik verplaats is, trökverplaatse en 'n bestaondje pagina neet euversjrieve.\n\n'''Waarsjoewing!'''\nVeur väöl bekeke pagina's ken 't verplaatse drastische en onveurzene gevolge höbbe.\nZörg deveur dets te die gevolge euverzuus ierdets te dees hanjeling oetvoers.",
        "movepagetalktext": "De biebehurende euverlèkpagina weurt ouch verplaats, mer '''neet''' in de volgende gevalle:\n* es al 'n euverlèkpagina besjteit ónger de angere naam\n* es doe 't óngersjtaond vekske neet aanvinks",
-       "movearticle": "Verplaats pagina:",
        "moveuserpage-warning": "'''Waorsjoewing:''' doe geis 'ne gebroekerspagina hernömme.\nHaaj d'r raekening mit det allein de pagina wuuertj hernömp, ''neet'' de gebroeker.",
        "movenologintext": "Veur 't verplaatse van 'n pagina mos te zien [[Special:UserLogin|aangemèld]].",
        "movenotallowed": "De kèns gein pazjena's verplaatse.",
        "api-error-badaccess-groups": "Doe moogs gein bestenj uploade óp deze wiki.",
        "api-error-badtoken": "Intern fout: toke is slech.",
        "api-error-copyuploaddisabled": "Uploade via URL steit óp deze server oet.",
-       "api-error-duplicate": "d'r {{PLURAL:$1|steit al [$2 e bestandj]|staon al [$2 bestenj]}} mit dezelfden inhawd oppe wiki.",
-       "api-error-duplicate-archive": "d'r {{PLURAL:$1|Waar al [$2 'n anger bestandj]|woren al [$2 $1 anger bestenj]}} óppe site mitte zelfdjen inhawd, meh {{PLURAL:$1|det is|die zeen}} gewösj.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplicaatbestandj det al gewösj is|Duplicaatbestenj die al gewösj zeen}}",
-       "api-error-duplicate-popup-title": "Zelfde {{PLURAL:$1|bestandj|bestenj}}",
+       "api-error-duplicate": "d'r {{PLURAL:$1|steit al e bestandj|staon al bestenj}} mit dezelfden inhawd oppe wiki.",
+       "api-error-duplicate-archive": "d'r {{PLURAL:$1|Waar al 'n anger bestandj|woren al $1 anger bestenj}} óppe site mitte zelfdjen inhawd, meh {{PLURAL:$1|det is|die zeen}} gewösj.",
        "api-error-empty-file": "t Bestandj det se perbeers te uploade had gein inhald.",
        "api-error-emptypage": "Doe maags gein nuuj, laeg pagina's aanmake.",
        "api-error-fetchfileerror": "Intern fout: d'r is get fout gegange bie 't óphaole van 't bestandj.",
index 100aaaf..64258c9 100644 (file)
@@ -17,7 +17,8 @@
                        "Snowdog",
                        "Sprüngli",
                        "아라",
-                       "Ninonino"
+                       "Ninonino",
+                       "Macofe"
                ]
        },
        "tog-underline": "Sutulinia i ligam",
        "uploadnewversion-linktext": "Carga una versión növa de quel file chì",
        "filerevert-intro": "Te seet adree a bütà turna el file '''[[Media:$1|$1]]''' a la [$4 version del $2, $3].",
        "filerevert-comment": "Mutif:",
-       "filerevert-defaultcomment": "Ripristinàt la versiù del $2, $1",
+       "filerevert-defaultcomment": "Ripristinàt la versiù del $2, $1 ($3)",
        "filerevert-submit": "Riprìstina 'mè che l'era",
        "filerevert-success": "'''L'archivi [[Media:$1|$1]]''' l'è stat ripristinat a la [$4 versiù del $2, $3].",
        "filedelete": "Scancela $1",
        "block-log-flags-nocreate": "blucada la creazión de cünt növ",
        "movepagetext": "Duvraant la büeta chí-da-sota al re-numinerà una pàgina, muveent tüta la suva stòria al nomm nööf. Ul vecc títul al deventarà una pàgina da redirezziun al nööf títul. I liamm a la vegja pàgina i sarà mia cambiaa: assürévas da cuntrulá par redirezziun dopi u rumpüüt.\nA sii respunsàbil da assüráss che i liamm i sigüta a puntá intúe i è süpunüü da ná.\nNutii che la pàgina la sarà '''mia''' muvüda se a gh'è gjamò una pàgina al nööf títul, a maanch che la sía vöja, una redirezziun cun nissüna stòtia d'esizziun passada. Cheest-chí al signífega ch'a pudii renuminá indrée\nuna pàgina intúe l'évuf renuminada via par eruur, e che vüü pudii mia surascriif una pàgina esisteent.\n\n\n<b>ATENZIUN!</b>\nCheest-chí al pöö vess un canbi dràstegh e inaspetaa par una pàgina pupülara: par piasée assürévas ch'a ii capii i cunsegueenz da cheest-chí prima da ná inaanz.",
        "movepagetalktext": "La pagina de discüssión tacada a quel articul chì, la sarà spustada in manera utumatega insema a l'articul, '''asca in quij cas chì:'''\n* quand che la pagina a l'è spustada intra namespace diferent\n* se in del növ titul al gh'è giamò una pagina de discüssiun (minga vöja)\n* el quadret de cunferma chì de sota a l'è staa deseleziónaa.\nIn quij cas chì, se'l var la pena, ghe sarà de spustà a man i infurmazión de la pagina de discüssión.",
-       "movearticle": "Spòsta la pàgina:",
        "newtitle": "Titul növ:",
        "move-watch": "Gionta chela pagina chí ai pàgin à tegní d'œucc.",
        "movepagebtn": "Sposta quela pagina chì",
index 3251a49..6e264c1 100644 (file)
@@ -5,7 +5,8 @@
                        "Mogoeilor",
                        "아라",
                        "Macofe",
-                       "Mjbmr"
+                       "Mjbmr",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "هوم پئیڤأند زیرخأط دار:",
        "mergehistory-go": "ویرایشتیایی که سریک سازی بوئن نشو بیئه",
        "mergehistory-submit": "سر یک سازی دوواره دیئنیا",
        "mergehistory-empty": "هیپ دوواره دیئنی نبوئه یکی سازی بوئه.",
-       "mergehistory-success": "$3 {{PLURAL:$3|وانیری|وانیریا}} د [[:$1]] وه خوئی د [[:$2]] سریک سازی بی.",
+       "mergehistory-done": "$3 {{PLURAL:$3|وانیری|وانیریا}} د $1 وه خوئی د [[:$2]] سریک سازی بی.",
        "mergehistory-fail": "سریک سازی ویرگار انجوم نبوئه، لطفن پینیاریا گات و بلگه نه د نو وارسی بکید.",
        "mergehistory-fail-toobig": "نبوئه وه یک شیوسن ویرگا انجوم دئه سی یکه وه بیشتر د محدودیت $1 {{PLURAL:$1|نسقه}}جا وه جا موئه.",
        "mergehistory-no-source": "سرچشمه بلگه $1 وجود ناره.",
        "filerevert-legend": "د سرگرتن جانیا",
        "filerevert-intro": "شما د حال و بار لرسن'''[[Media:$1|$1]]''' وه [$4 نسقه ای که ها د ویرگار$2 ساعت $3] هیئت.",
        "filerevert-comment": "دليل:",
-       "filerevert-defaultcomment": "لرسن وه نسقه $1 ساعت $2",
+       "filerevert-defaultcomment": "لرسن وه نسقه $1 ساعت $2 ($3)",
        "filerevert-submit": "ورگنین",
        "filerevert-success": "''[[Media:$1|$1]]''' وه[$4 نسقه ای که ها د ویرگار$2 ساعت $3] لرسه بی.",
        "filerevert-badversion": "نسقه دماتری د ای نسقه وجود ناشت.",
        "movepagetext": "وا وه کار گرتن نوم بلگه های نوم بلگه آلشت موئه، و همه ویرگارچه وه روئه وه نوم تازه ش.\nشما می تونیت آلشتکاری مسیریایی که وه داسون اصلی خوشو اشاره می کن نه وه هنگوم سازی بکیت.\nهوم پیوندیایی که چی بلگه دماترین، آلشتکاری نموئن؛ حتمن آلشت کاری مسیریا [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خروا]] نه وارسی بکیت.\n'''شما''' مسئول یه دل بیین ده یه نیت که هوم پیوندیا هنی هان د هموچه که قراره روئن.\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'''هشدار!'''\nجاوه جا کاری بلگه د نوم تازه شایت یه گل آلشتکاری پایه یی و ناحاستنی سی بلگه یا حاستنی با؛\nلطف بکیت یه دل بوئیت که دما د جا وه جا کاری بلگه، عاقوت ای کار نه دونیت.",
        "movepagetalktext": "بلگه چک چنه مربوطه، ار با، وه حال و بار خودانجوم واگرد گوتار اصلی جا وه جا کاری بوئه<strong>مر یه که:</strong>\n* شما د حال و بار جا وه جاکاری بلگه د ای نوم جا وه یه گل نوم جا هنی بوئیت.\n* یه گل بلگه چک چنه حال نبیه نه وا ای نوم با، یا \n* جعوه هاری نه نشودار نکردیته.\n\nد ای حال و باریا، واس بلگه نه دسی جا وه جاکاری بکیت یا مینونه یا دو بلگه نه وا ویرایشت یکی بکیت.",
-       "movearticle": "جا وه جا کردن بلگه:",
        "moveuserpage-warning": "'''هشدار:''' شما د حال و بار جا وه جا کاری یه گل بلگه کاریاریت.د ویر داشتوئیت که تینا بلگه جا وه جاکاری بوئه و نوم کاریار آلشت '''نموئه'''.",
        "movecategorypage-warning": "<strong>هشدار:</strong> شما د حال و بار جا وه جاکاری بلگه رده هئیت. لطف بکیت د ویر داشتوئیت که فقط بلگه جا وه جاکاری نموئه و بلگه یایی که هان د رده دماتری می مونن و وه یه گل رده تازه <em>نمی روئن</em>.",
        "movenologintext": "سی جا وه جاکاری بلگه یا واس نوم کاریاریتو ثبت بیه با و اوسه [[Special:UserLogin|روئیت د سامونه]].",
        "api-error-badaccess-groups": "شما سی سوار کرد جانیایا د ای ویکی اجازه ناریت.",
        "api-error-badtoken": "خطا مینجا:رازینه امنیتی اشتوا",
        "api-error-copyuploaddisabled": "سوار کردن وا یو آر ال دی ای سرور غیرفعال بیه.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 یه گل جانیا هنی]|[$2 چن گل جانیا هنی]}} د دیارگه وا مینونه هومبراور بی.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 یه گل جانیا هنی]|[$2 چن گل جانیا هنی]}} د دیارگه وا مینونه هومبراور بی.ولی پاکسا {{PLURAL:$1|بیه|بینه}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|جانیا|جانیایا}} تکراری یی که ایسه پاکسا بیینه",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|جانیا|جانیایا}} تکراری",
+       "api-error-duplicate": "{{PLURAL:$1|یه گل جانیا هنی|چن گل جانیا هنی}} د دیارگه وا مینونه هومبراور بی.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|یه گل جانیا هنی|چن گل جانیا هنی}} د دیارگه وا مینونه هومبراور بی.ولی پاکسا {{PLURAL:$1|بیه|بینه}}.",
        "api-error-empty-file": "جانیایی که دئی ته حالی بی.",
        "api-error-emptypage": "یه گل بلگه تازه راس بکیت،بلگه یا حالی صلادار کاری نیئن.",
        "api-error-fetchfileerror": "خطا مین کار: د گات گرتن جانیا، یه چی یی خو پیش نرت.",
index cda64a9..0631cea 100644 (file)
                        "아라",
                        "Aswanas",
                        "Pofka",
-                       "Albertas"
+                       "Albertas",
+                       "Macofe",
+                       "Zygimantus",
+                       "Matma Rex"
                ]
        },
-       "tog-underline": "Pabraukti nuorodas:",
+       "tog-underline": "Nuorodos pabraukimas:",
        "tog-hideminor": "Slėpti smulkius pakeitimus naujausių keitimų sąraše",
        "tog-hidepatrolled": "Slėpti patikrintus keitimus paskutinių keitimų sąraše",
        "tog-newpageshidepatrolled": "Slėpti patikrintus puslapius iš naujausių straipsnių sąrašo",
        "thu": "Ket",
        "fri": "Pen",
        "sat": "Šeš",
-       "january": "sausio",
+       "january": "Sausis",
        "february": "vasario",
-       "march": "Kovo",
-       "april": "balandžio",
-       "may_long": "gegužės",
-       "june": "birželio",
-       "july": "liepos",
-       "august": "rugpjūčio",
-       "september": "Rugsėjo",
-       "october": "spalio",
-       "november": "lapkričio",
+       "march": "kovo",
+       "april": "Balandis",
+       "may_long": "Gegužė",
+       "june": "Birželis",
+       "july": "Liepa",
+       "august": "Rugpjūtis",
+       "september": "rugsėjo",
+       "october": "Spalis",
+       "november": "Lapkritis",
        "december": "gruodžio",
        "january-gen": "Sausio",
        "february-gen": "Vasario",
        "feb": "Vas",
        "mar": "Kov",
        "apr": "Bal",
-       "may": "gegužės",
-       "jun": "Birželis",
+       "may": "Geg",
+       "jun": "Bir",
        "jul": "Lie",
        "aug": "Rgp",
        "sep": "Rgs",
        "cancel": "Atšaukti",
        "moredotdotdot": "Daugiau...",
        "morenotlisted": "Šis sąrašas nėra išsamus.",
-       "mypage": "Naudotojo puslapis",
-       "mytalk": "Mano aptarimas",
+       "mypage": "Puslapis",
+       "mytalk": "Aptarimas",
        "anontalk": "Šio IP aptarimas",
        "navigation": "Naršymas",
        "and": "&#32;ir",
        "create-this-page": "Sukurti šį puslapį",
        "delete": "Trinti",
        "deletethispage": "Ištrinti šį puslapį",
-       "undeletethispage": "Attrinti šį puslapį",
+       "undeletethispage": "Atkurti šį puslapį",
        "undelete_short": "Atkurti $1 {{PLURAL:$1:redagavimą|redagavimus|redagavimų}}",
        "viewdeleted_short": "Peržiūrėti $1 {{PLURAL:$1|ištrintą keitimą|ištrintus keitimus|ištrintų keitimų}}",
        "protect": "Užrakinti",
        "viewcount": "Šis puslapis buvo atvertas $1 {{PLURAL:$1|kartą|kartus|kartų}}.",
        "protectedpage": "Užrakintas puslapis",
        "jumpto": "Peršokti į:",
-       "jumptonavigation": "navigaciją",
+       "jumptonavigation": "navigacija",
        "jumptosearch": "paiešką",
        "view-pool-error": "Atsiprašome, šiuo metu serveriai yra perkrauti.\nPernelyg daug naudotojų skaito šį puslapį.\nPrašome palaukti ir bandyti į šį puslapį patekti dar kartą.\n\n$1",
        "generic-pool-error": "Atsiprašome, šiuo metu serveriai yra perkrauti.\nPernelyg daug naudotojų skaito šį išteklį.\nPrašome palaukti ir bandyti prieiti prie šio išteklio dar kartą.",
        "pool-servererror": "Saugyklos skaitiklio paslauga negalima ($1).",
        "poolcounter-usage-error": "Naudojimo klaida: $1",
        "aboutsite": "Apie {{SITENAME}}",
-       "aboutpage": "Project:About",
+       "aboutpage": "Project:Apie",
        "copyright": "Turinys pateikiamas pagal  $1  jei nenurodyta kitaip.",
        "copyrightpage": "{{ns:project}}:Autorinės teisės",
        "currentevents": "Naujienos",
-       "currentevents-url": "Project:Current events",
+       "currentevents-url": "Project:Dabartiniai įvykiai",
        "disclaimers": "Atsakomybės apribojimas",
        "disclaimerpage": "Project:General disclaimer",
        "edithelp": "Kaip redaguoti",
        "nstab-template": "Šablonas",
        "nstab-help": "Pagalbos puslapis",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Pagrindinis puslapis",
        "nosuchaction": "Nėra tokio veiksmo",
        "nosuchactiontext": "Veiksmas, nurodytas adrese, neatpažintas.\nGalbūt Jūs padarėte klaidą adrese ar paspaudėte ant neteisingos nuorodos.\nŠios problemos priežastis taip pat gali būti klaida programinėje įrangoje, kurią naudoja {{SITENAME}}.",
        "nosuchspecialpage": "Nėra tokio specialiojo puslapio",
        "databaseerror": "Duomenų bazės klaida",
        "databaseerror-text": "Įvyko duomenų bazės klaida.\nTai gali rodyti programinės įrangos sutrikimą.",
        "databaseerror-textcl": "Įvyko duomenų bazės klaida.",
-       "databaseerror-query": "Užklausa:$1",
+       "databaseerror-query": "Užklausa: $1",
        "databaseerror-function": "Paskirtis: $1",
        "databaseerror-error": "Klaida: $1",
        "laggedslavemode": "Dėmesio: Puslapyje gali nesimatyti naujausių pakeitimų.",
        "createacct-captcha": "Saugumo patikrinimas",
        "createacct-imgcaptcha-ph": "Įveskite tekstą, kurį matote aukščiau",
        "createacct-submit": "Sukurkite savo paskyrą",
-       "createacct-another-submit": "Sukurti kitą paskyrą",
+       "createacct-another-submit": "Sukurti paskyrą",
        "createacct-benefit-heading": "{{SITENAME}} sukurtas žmonių kaip jūs.",
        "createacct-benefit-body1": "{{PLURAL:$1|keitimas|keitimai|keitimų}}",
        "createacct-benefit-body2": "{{PLURAL:$1|puslapis|puslapiai}}",
        "passwordreset-emailsent": "Slaptažodžio priminimo laiškas buvo 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 el. pašto adresą",
+       "changeemail": "Pakeisti ar pašalinti el. pašto adresą",
        "changeemail-text": "Užpildykite šią formą, jei norite pakeisti savo el. pašto adresą. Jums reikės įvesti savo slaptažodį, siekiant patvirtinti šį pakeitimą.",
        "changeemail-no-info": "Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.",
        "changeemail-oldemail": "Dabartinis el. pašto adresas:",
        "changeemail-password": "Jūsų {{SITENAME}} slaptažodis:",
        "changeemail-submit": "Keisti el. pašto adresą",
        "changeemail-throttled": "Jūs atlikote pernelyg daug bandymų prisijungti.\nLuktelėkite $1 prieš bandant vėl.",
+       "changeemail-nochange": "Prašome įvesti kitą naują el. pašto adresą.",
        "resettokens": "Atnaujinti žetonus",
        "resettokens-text": "Jūs galite atnaujinti žetonus, kurie suteikia prieigą prie tam tikros privačios informacijos susijusios su jūsų paskyra čia.\n\nJūs turėtumėte tai padaryti jei netyčia jais pasidalinote su kuo nors arba jei jūsų paskyra buvo pavojuje.",
        "resettokens-no-tokens": "Nėra žetonų, kuriuos galima atnaujinti.",
        "permissionserrorstext-withaction": "Jūs neturite leidimo $2 dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
        "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.",
        "log-fulllog": "Rodyti visą istoriją",
        "edit-hook-aborted": "Keitimas nutrauktas užlūžimo.\nTam nėra paaiškinimo.",
        "edit-gone-missing": "Negalima atnaujinti puslapio.\nGreičiausiai jis yra ištrintas.",
        "mergehistory-go": "Rodyti sujungiamus keitimus",
        "mergehistory-submit": "Sujungti versijas",
        "mergehistory-empty": "Versijos negali būti sujungtos",
-       "mergehistory-success": "$3 [[:$1]] {{PLURAL:$3|versija|versijos|versijų}} sėkmingai {{PLURAL:$3|sujungta|sujungtos|sujungta}} su [[:$2]].",
+       "mergehistory-done": "$3 $1 {{PLURAL:$3|versija|versijos|versijų}} sėkmingai {{PLURAL:$3|sujungta|sujungtos|sujungta}} su [[:$2]].",
        "mergehistory-fail": "Nepavyksta atlikti istorijų sujungimo, prašome patikrinti puslapio ir laiko parametrus.",
        "mergehistory-fail-toobig": "Nepavyksta sulieti istorijos, nes būtina pernešti daugiau, nei leidžia $1 riba, {{PLURAL:$1|versijos|versijų}}.",
        "mergehistory-no-source": "Šaltinio puslapis $1 neegzistuoja.",
        "grouppage-bot": "{{ns:project}}:Robotai",
        "grouppage-sysop": "{{ns:project}}:Administratoriai",
        "grouppage-bureaucrat": "{{ns:project}}:Biurokratai",
-       "grouppage-suppress": "{{ns:project}}:Peržiūra",
+       "grouppage-suppress": "{{ns:project}}:Slopinti",
        "right-read": "Skaityti puslapius",
        "right-edit": "Redaguoti puslapius",
        "right-createpage": "Kurti puslapius (kurie nėra aptarimų puslapiai)",
        "recentchangeslinked-summary": "Tai paskutinių keitimų, atliktų puslapiuose, į kuriuos yra nuoroda iš nurodyto puslapio (arba į nurodytos kategorijos narius), sąrašas.\nPuslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškinti'''.",
        "recentchangeslinked-page": "Puslapio pavadinimas:",
        "recentchangeslinked-to": "Rodyti su duotuoju puslapiu susijusių puslapių pakeitimus",
+       "recentchanges-page-added-to-category": "[[:$1]] pridėta prie kategorijos",
+       "recentchanges-page-removed-from-category": "[[:$1]] pašalinta iš kategorijos",
+       "autochange-username": "MediaWiki automatinis pakeitimas",
        "upload": "Įkelti rinkmeną",
        "uploadbtn": "Įkelti rinkmeną",
        "reuploaddesc": "Atšaukti įkėlimą ir grįžti į įkėlimo formą.",
        "upload-http-error": "Įvyko HTTP klaida: $1",
        "upload-copy-upload-invalid-domain": "Pakrovimų kopijos yra neleidžiamos iš šio domeno.",
        "upload-dialog-title": "Įkelti failą",
-       "upload-dialog-error": "Įvyko klaida",
-       "upload-dialog-warning": "Įvyko įspėjimas",
        "upload-dialog-button-cancel": "Atšaukti",
        "upload-dialog-button-done": "Atlikta",
        "upload-dialog-button-save": "Išsaugoti",
        "upload-dialog-button-upload": "Įkelti",
-       "upload-dialog-label-select-file": "Pasirinkti failą",
-       "upload-dialog-label-infoform-title": "Detalės",
-       "upload-dialog-label-infoform-name": "Pavadinimas",
-       "upload-dialog-label-infoform-description": "Aprašymas",
-       "upload-dialog-label-usage-title": "Naudojimas",
-       "upload-dialog-label-usage-filename": "Failo pavadinimas",
+       "upload-process-error": "Įvyko klaida",
+       "upload-process-warning": "Įvyko įspėjimas",
+       "upload-form-label-select-file": "Pasirinkti failą",
+       "upload-form-label-infoform-title": "Detalės",
+       "upload-form-label-infoform-name": "Pavadinimas",
+       "upload-form-label-infoform-description": "Aprašymas",
+       "upload-form-label-usage-title": "Naudojimas",
+       "upload-form-label-usage-filename": "Failo pavadinimas",
+       "foreign-structured-upload-form-label-own-work": "Tai yra mano darbas",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorijos",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
        "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.",
        "nopagetext": "Adresas, kurį nurodėte, neegzistuoja.",
        "pager-newer-n": "$1 {{PLURAL:$1|naujesnis|naujesni|naujesnių}}",
        "pager-older-n": "$1 {{PLURAL:$1|senesnis|senesni|senesnių}}",
-       "suppress": "Peržiūra",
+       "suppress": "Slopinti",
        "querypage-disabled": "Šiame specialiajame puslapyje yra išjungta dėl neefektyvumo.",
        "apihelp": "API pagalba",
        "apihelp-no-such-module": "Nerasta modulio $1.",
        "booksources-text": "Žemiau yra nuorodų sąrašas į kitas svetaines, kurios parduoda naujas ar naudotas knygas, bei galbūt turinčias daugiau informacijos apie knygas, kurių ieškote:",
        "booksources-invalid-isbn": "Duotas ISBN atrodo neteisingas; patikrinkite, ar nepadarėte kopijavimo klaidų.",
        "specialloguserlabel": "Naudotojas:",
-       "speciallogtitlelabel": "Pavadinimas:",
+       "speciallogtitlelabel": "Tikslas (pavadinimas arba {{ns:user}}:naudotojo vardas naudotojui):",
        "log": "Specialiųjų veiksmų sąrašas",
        "all-logs-page": "Visi viešieji sąrašai",
        "alllogstext": "Bendrai pateikiamas visų galimų „{{SITENAME}}“ specialiųjų veiksmų sąrašas.\nGalima sumažinti rezultatų skaičių, patikslinant veiksmo rūšį, naudotoją ar susijusį puslapį.",
        "tooltip-whatlinkshere-invert": "Pažymėkite šį langelį jei norite slėpti nuorodas iš puslapių pasirinkto pavadinimo tarpe.",
        "namespace_association": "Susijusi vardų sritis",
        "tooltip-namespace_association": "Įjunkite šią parinktį, kad taip pat įtrauktumėte aptarimų arba temos sritį, susijusią su pasirinkta sritimi",
-       "blanknamespace": "(Pagrindinė)",
+       "blanknamespace": "(Pagrindinis)",
        "contributions": "{{GENDER:$1|Naudotojo}} indėlis",
        "contributions-title": "{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis",
        "mycontris": "Įnašai",
        "blocklink": "blokuoti",
        "unblocklink": "atblokuoti",
        "change-blocklink": "keisti blokavimo nustatymus",
-       "contribslink": "įnašas",
+       "contribslink": "įnašai",
        "emaillink": "siųsti el. laišką",
        "autoblocker": "Jūs buvote automatiškai užblokuotas, nes jūsų IP adresą neseniai naudojo „[[User:$1|$1]]“. Nurodyta naudotojo $1 blokavimo priežastis: „$2“.",
        "blocklogpage": "Blokavimų sąrašas",
        "movepagetext": "Naudodamiesi žemiau pateikta forma, pervadinsite puslapį\nneprarasdami jo istorijos.\nSenasis pavadinimas taps nukreipiamuoju - rodys į naująjį.\nNuorodos į senąjį puslapį nebus automatiškai pakeistos, todėl būtinai\npatikrinkite ar nesukūrėte [[Special:DoubleRedirects|dvigubų]] ar\n[[Special:BrokenRedirects|neveikiančių]] nukreipimų.\nJūs esate atsakingas už tai, kad nuorodos rodytų į ten, kur ir norėta.\n\nPrimename, kad puslapis '''nebus''' pervadintas, jei jau yra puslapis\nnauju pavadinimu, nebent tas puslapis tuščias arba nukreipiamasis ir\nneturi redagavimo istorijos. Taigi, jūs galite pervadinti puslapį\nseniau naudotu vardu, jei prieš tai jis buvo per klaidą pervadintas,\no egzistuojančių puslapių sugadinti negalite.\n\n'''DĖMESIO!'''\nJei pervadinate populiarų puslapį, tai gali sukelti nepageidaujamų\nšalutinių efektų, dėl to šį veiksmą vykdykite tik įsitikinę,\nkad suprantate visas pasekmes.",
        "movepagetext-noredirectfixer": "Naudodamiesi žemiau pateikta forma, pervadinsite puslapį perkeldami visą jo istoriją į naująjį pavadinimą.\nSenasis pavadinimas taps nukreipiamuoju puslapiu į naująjį.\nNuorodos į senąjį puslapį nebus automatiškai pakeistos, todėl būtinai\npatikrinkite, ar nesukūrėte [[Special:DoubleRedirects|dvigubų]] ar [[Special:BrokenRedirects|neveikiančių]] nukreipimų.\nJūs esate atsakingas už tai, kad nuorodos rodytų į ten, kur ir norėta.\n\nPrimename, kad puslapis '''nebus''' pervadintas, jei jau yra puslapis nauju pavadinimu, nebent tas puslapis yra tuščias arba nukreipiamasis ir neturi redagavimo istorijos.\nTaigi, jūs galite pervadinti puslapį seniau naudotu vardu, jei prieš tai jis buvo per klaidą pervadintas, o egzistuojančių puslapių sugadinti negalite.\n\n'''Dėmesio!'''\nJei pervadinate populiarų puslapį, tai gali sukelti nepageidaujamų šalutinių efektų,\ndėl to šį veiksmą vykdykite tik įsitikinę, kad suprantate visas pasekmes.",
        "movepagetalktext": "Susietas aptarimo puslapis bus automatiškai perkeltas kartu su juo, '''išskyrus:''':\n*Puslapis nauju pavadinimu jau turi netuščią aptarimo puslapį, arba\n*Paliksite žemiau esančia varnelę nepažymėtą.\n\nŠiais atvejais jūs savo nuožiūra turite perkelti arba apjungti aptarimo puslapį.",
-       "movearticle": "Pervardinti puslapį:",
        "moveuserpage-warning": "'''Dėmesio:''' Jūs ruošiatės perkelti naudotojo puslapį. Atkreipkite dėmesį, kad bus perkeltas tik puslapis, naudotojas ''nebus'' pervadintas.",
        "movecategorypage-warning": "<strong>Dėmesio:</strong> Jūs ketinate pervadinti kategorijos puslapį. Atminkite, kad tik pats puslapis bus pervadintas, tačiau kategorijai priskirti puslapiai <em>nebus</em> perkelti naujon kategorijon.",
        "movenologintext": "Norėdami pervadinti puslapį, turite būti užsiregistravęs naudotojas ir būti  [[Special:UserLogin|prisijungęs]].",
        "logentry-newusers-byemail": "Vartotojo paskyra $3 buvo {{GENDER:$2|sukurta}} $1 ir slaptažodis išsiųstas el. paštu",
        "logentry-newusers-autocreate": "Vartotojo paskyra $1 buvo {{GENDER:$2|sukurta}} automatiškai",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|perkėlė}} apsaugos nustatymus iš $4 į $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|pašalino}} apsaugą nuo $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|apsaugojo}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|apsaugojo}} $3 $4 [pakopinė]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|pakeitė}} apsaugos lygį $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|pakeitė}} apsaugos lygį $3 $4 [pakopinė]",
        "logentry-rights-rights": "$1 {{GENDER:$2|pakeitė}} grupės narystę $3 iš $4 į $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|pakeista}} narystė grupėje $3",
        "logentry-rights-autopromote": "$1 buvo automatiškai {{GENDER:$2|pervestas}} iš $4 į $5",
        "api-error-badaccess-groups": "Jums neleidžiama įkelti failus į šią wiki.",
        "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 [$2 kitas failas]|yra [$2 kiti failai]}} puslapyje su tuo pačiu turiniu..",
-       "api-error-duplicate-archive": "Jau {{PLURAL:$1|buvo [$2 kitas failas]|buvo [$2 kitų failų]}} puslapyje su tuo pačiu turiniu, bet {{PLURAL:$1|buvo|buvo}} ištrinti.",
-       "api-error-duplicate-archive-popup-title": "Dubliuoti {{PLURAL:$1|failą kuris buvo|failus kurie buvo}} jau buvo ištrinti.",
-       "api-error-duplicate-popup-title": "Dubliuoti  {{PLURAL:$1|failą|failus}}",
+       "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-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 1d8f185..db475e2 100644 (file)
        "sort-descending": "Kārtot dilstošā secībā",
        "sort-ascending": "Kārtot augošā secībā",
        "nstab-main": "Raksts",
-       "nstab-user": "Dalībnieka lapa",
+       "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Dalībnieka lapa|Dalībnieces lapa}}",
        "nstab-media": "Multivides lapa",
        "nstab-special": "Īpašā lapa",
        "nstab-project": "Projekta lapa",
        "upload-dialog-button-done": "Gatavs",
        "upload-dialog-button-save": "Saglabāt",
        "upload-dialog-button-upload": "Augšupielādēt",
-       "upload-dialog-label-select-file": "Izvēlieties file",
-       "upload-dialog-label-infoform-title": "Papildinformācija",
-       "upload-dialog-label-infoform-description": "Apraksts",
-       "upload-dialog-label-usage-title": "Pielietojums",
-       "upload-dialog-label-usage-filename": "Faila nosaukums",
+       "upload-form-label-select-file": "Izvēlieties file",
+       "upload-form-label-infoform-title": "Papildinformācija",
+       "upload-form-label-infoform-description": "Apraksts",
+       "upload-form-label-usage-title": "Pielietojums",
+       "upload-form-label-usage-filename": "Faila nosaukums",
        "backend-fail-stream": "Nevar straumēt failu $1.",
        "backend-fail-backup": "Nevar dublēt failu $1.",
        "backend-fail-notexists": "Fails $1 nepastāv.",
        "move-page-legend": "Pārvietot lapu",
        "movepagetext": "Šajā lapā tu vari pārdēvēt vai pārvietot lapu, kopā tās izmaiņu hronoloģiju pārvietojot to uz citu nosaukumu.\nIepriekšējā lapa kļūs par lapu, kas pāradresēs uz jauno lapu.\nŠeit var automātiski izmainīt visas pāradresācijas (redirektus) uz šo lapu (2. ķeksis apakšā).\nSaites pārējās lapās uz iepriekšējo lapu netiks mainītas. Ja izvēlies neizmainīt pāradresācijas automātiski, noteikti pārbaudi un izlabo, izskaužot [[Special:DoubleRedirects|dubultu pāradresāciju]] vai [[Special:BrokenRedirects|pāradresāciju uz neesošu lapu]].\nTev ir jāpārliecinās, vai saites vēl aizvien ved tur, kur tās ir paredzētas.\n\nŅem vērā, ka lapa '''netiks''' pārvietota, ja jau eksistē kāda cita lapa ar vēlamo nosaukumu (izņemot gadījumus, kad tā ir tukša vai kad tā ir pāradresācijas lapa, kā arī tad, ja tai nav izmaiņu hronoloģijas).\nTas nozīmē, ka tu vari pārvietot lapu atpakaļ, no kurienes tu jau reiz to esi pārvietojis, ja būsi kļūdījies, bet tu nevari pārrakstīt jau esošu lapu.\n\n'''BRĪDINĀJUMS!'''\nPopulārām lapām tā var būt krasa un negaidīta pārmaiņa;\npirms turpināšanas vēlreiz pārdomā, vai tu izproti visas iespējamās sekas.",
        "movepagetalktext": "Saistītā diskusiju lapa, ja tāda eksistē, tiks automātiski pārvietota, '''izņemot gadījumus, kad''':\n*tu pārvieto lapu uz citu palīglapu,\n*ar jauno nosaukumu jau eksistē diskusiju lapa, vai arī\n*atzīmēsi zemāk atrodamo lauciņu.\n\nJa tomēr vēlēsies, tad tev šī diskusiju lapa būs jāpārvieto vai jāapvieno pašam.",
-       "movearticle": "Pārvietot lapu",
        "movecategorypage-warning": "<strong>Brīdinājums:</strong> Tu grasies pārvietot kategoriju. Lūgums ievērot, ka pārvietota tiks tikai šī lapa, kategorijas saturs <em>netiks</em> pārvietots.",
        "movenologintext": "Tev ir jābūt reģistrētam lietotājam un jābūt [[Special:UserLogin|iegājušam]] {{grammar:lokatīvs|{{SITENAME}}}}, lai pārvietotu lapu.",
        "movenotallowed": "Tev nav atļaujas pārvietot lapas.",
        "tooltip-t-print": "Drukājama lapas versija",
        "tooltip-t-permalink": "Paliekoša saite uz šo lapas versiju",
        "tooltip-ca-nstab-main": "Apskatīt rakstu",
-       "tooltip-ca-nstab-user": "Apskatīt lietotāja lapu",
+       "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-project": "Apskatīt projekta lapu",
index 9f85bf7..d1e3010 100644 (file)
        "mergehistory-go": "示可併之誌",
        "mergehistory-submit": "併誌",
        "mergehistory-empty": "無誌可併",
-       "mergehistory-success": "[[:$1]]之$3誌已併至[[:$2]]。",
+       "mergehistory-done": "$1之$3誌已併至[[:$2]]。",
        "mergehistory-fail": "併誌無進也,該頁及時間參數請重檢也。",
        "mergehistory-no-source": "源頁$1無存也。",
        "mergehistory-no-destination": "到頁$1無存也。",
        "move-page-legend": "遷頁",
        "movepagetext": "函下遷頁,誌隨新往、舊題作渡、取佐欲移。保佐正,[[Special:DoubleRedirects|防窮]]、[[Special:BrokenRedirects|斷渡]]。\n\n囑之者,新題若非空、渡、缺誌,則舊'''不遷'''焉。存頁勿覆,而誤遷可悔也。\n\n'''警示!'''\n膾炙遷焉,禍生不測;戒慎行之。",
        "movepagetext-noredirectfixer": "函下遷頁,誌隨新往、舊題作渡、取佐欲移。欲查[[Special:DoubleRedirects|防窮]]、[[Special:BrokenRedirects|斷渡]]之。\n\n囑之者,新題若非空、渡、缺誌,則舊'''不遷'''焉。存頁勿覆,而誤遷可悔也。\n\n'''警示!'''\n膾炙遷焉,禍生不測;戒慎行之。",
-       "movearticle": "遷文:",
        "moveuserpage-warning": "'''警:'''爾將遷頁齋。注之遷齋後之簿名乃為''無''變也。",
        "movenologintext": "遷文須[[Special:UserLogin|登簿]]。",
        "movenotallowed": "無准遷檔也。",
index 784fb94..9e1c5cb 100644 (file)
        "mergehistory-go": "मिज्झर होइ योग्य सम्पादन सभकेँ देखाउ",
        "mergehistory-submit": "संशोधन सभकेँ मिज्झर करू",
        "mergehistory-empty": "कोनो संशोधन मिज्झर नै कएल जा सकैए।",
-       "mergehistory-success": "$3 {{PLURAL:$3|संशोधन|संशोधन सभ}} एकर [[:$1]] सफलता पूर्वक मिज्झर कएल गेल [[:$2]] मे।",
+       "mergehistory-done": "$3 {{PLURAL:$3|संशोधन|संशोधन सभ}} एकर $1 सफलता पूर्वक मिज्झर कएल गेल [[:$2]] मे।",
        "mergehistory-fail": "इतिहासक मिश्रणकेँ नै कऽ सकल, कृपा कऽ पन्ना आ समए परिमितिकेँ फेरसँ जाँचू।",
        "mergehistory-no-source": "स्रोत पन्ना $1 नै अछि।",
        "mergehistory-no-destination": "लक्ष्य पन्ना $1 नै अछि।",
        "movepagetext": "नीचाँक फॉर्मक प्रयोग पन्नाक नाम बदलि देत, एकर सभटा इतिहासकेँ नव नामक अन्तर्गत राखि देत।\nपुरान शीर्षक नव पन्ना लेल एकटा घुरबैबला पन्ना बनि जाएत।\nअहाँ घुरबैबला पन्नाकेँ अद्यतन कऽ सकै छी जे मूल शीर्षकपर स्वचालित रूपेँ जाइत अछि।\nजौं अहाँ ई नै करबाक निर्णय करै छी, निश्चय करू तकबा लेल [[Special:DoubleRedirects|double]] वा\n[[Special:BrokenRedirects|broken redirects]]\nअहाँ ऐ लेल जिम्मीदार छी जे सम्बन्धित लिंक ओतै जाए जतए ओकरा जेबाक चाही।\n\nमोन राखू कि पन्ना '''नै''' घसकाउ जौं नव शीर्षकपर पहिनहियेसँ पन्ना अछि, आ तखने ई करू जखन ओ खाली हुअए वा ओ एकटा घुमबैबला पन्ना हुअए वा ओइ पन्नाक कोनो भूतकालक सम्पादन इतिहास नै हुअए।\nएकर माने भेल जे अहाँ कोनो पन्नाक नाम परिवर्तन कऽ पाछाँ लऽ जा सकै छी जतए एकर नाममे परिवर्तन कएल गेल रहए जौं अहाँसँ गलती भेल अछि, आ अहाँ ओइ पन्नाकेँ फेरसँ दोबारा नै लिख सकै छी।\n\n\n'''चेतौनी!'''\nई एकटा लोकप्रिय पन्नाक लेल एकटा भयंकर आ बिना आशाक कएल परिवर्तन भऽ सकैए।\nआगाँ बढ़ैसँ पहिने अहाँ ई सुनिश्चित करू जे अहाँ एकर परिणाम बुझै छी।",
        "movepagetext-noredirectfixer": "नीचाँक फॉर्मक प्रयोग पन्नाक नाम बदलि देत, एकर सभटा इतिहासकेँ नव नामक अन्तर्गत राखि देत।\nपुरान शीर्षक नव पन्ना लेल एकटा घुरबैबला पन्ना बनि जाएत।\nनिश्चय करू तकबा लेल [[Special:DoubleRedirects|double]] वा[[Special:BrokenRedirects|broken redirects]]।\nअहाँ ऐ लेल जिम्मीदार छी जे सम्बन्धित लिंक ओतै जाए जतए ओकरा जेबाक चाही।\n\nमोन राखू कि पन्ना '''नै''' घसकत जौं नव शीर्षकपर पहिनहियेसँ पन्ना अछि, आ तखने ई करू जखन ओ खाली हुअए वा ओ एकटा घुमबैबला पन्ना हुअए वा ओइ पन्नाक कोनो भूतकालक सम्पादन इतिहास नै हुअए।\nएकर माने भेल जे अहाँ कोनो पन्नाक नाम परिवर्तन कऽ पाछाँ लऽ जा सकै छी जतए एकर नाममे परिवर्तन कएल गेल रहए जौं अहाँसँ गलती भेल अछि, आ अहाँ ओइ पन्नाकेँ फेरसँ दोबारा नै लिख सकै छी।\n\n\n'''चेतौनी!'''\nई एकटा लोकप्रिय पन्नाक लेल एकटा भयंकर आ बिना आशाक कएल परिवर्तन भऽ सकैए।\nआगाँ बढ़ैसँ पहिने अहाँ ई सुनिश्चित करू जे अहाँ एकर परिणाम बुझै छी।",
        "movepagetalktext": "सम्बन्धित चौबटिया पन्ना स्वचालित रूपेँ घसकत एकर संग '''जौं:'''\n*एकटा खाली-नै चौबटिया पन्ना पहिनहियेसँ नव नामक संग अछि, वा\n*अहाँ नीचाँक बॉक्स टिक हटा दी।\n\nताइ परिस्थितिमे, अहाँकेँ अपनेसँ पन्नाकेँ, आवश्यकतानुसार, घसकाबऽ वा मिज्झर करऽ पड़त।",
-       "movearticle": "पन्ना घसकाउ:",
        "moveuserpage-warning": "'''चेतौनी!'''अहाँ एकटा प्रयोक्ता पन्ना घसका रहल छी | मोन राखू कि खाली पन्ना घसकत आ प्रयोक्ताक नाम ''नै'' बदलत ।",
        "movenologintext": "अहाँकेँ पंजीकृत प्रयोक्ता हेबाक चाही आ [[Special:UserLogin|logged in]] पन्ना घसकेबा लेल।",
        "movenotallowed": "अहाँकेँ पन्ना घसकेबाक अधिकार नै अछि।",
index ac5cb5b..9607de3 100644 (file)
        "mergehistory-go": "Tidokna suntingan-suntingan sing teyeng digabung",
        "mergehistory-submit": "Gabung revisi",
        "mergehistory-empty": "Ora ana revisi sing teyeng digabung.",
-       "mergehistory-success": "$3 {{PLURAL:$1|révisi|révisi}} sekang [[:$1]] bisa suksès digabung maring [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$1|révisi|révisi}} sekang $1 bisa suksès digabung maring [[:$2]].",
        "mergehistory-fail": "Ora teyeng nggabung sajarah, jajal dipriksa maning kacane lan parameter wektune.",
        "mergehistory-no-source": "Kaca sumber $1 ora ana.",
        "mergehistory-no-destination": "Kaca tujuan $1 ora ana.",
index c7740ce..a9a83bc 100644 (file)
@@ -6,7 +6,8 @@
                        "Khazar II",
                        "Kranch",
                        "Numulunj pilgae",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Сюлмафкснень алга китькстамс:",
        "mergehistory-go": "Няфтемс шовореви петнематнень",
        "mergehistory-submit": "Шоворемс петнематнень",
        "mergehistory-empty": "Шовореви верзиет ашет.",
-       "mergehistory-success": "$3 [[:$1]]-нь {{PLURAL:$3|верзиец|верзиенза}} лац шоворьфтезь [[:$2]]-с.",
+       "mergehistory-done": "$3 $1-нь {{PLURAL:$3|верзиец|верзиенза}} лац шоворьфтезь [[:$2]]-с.",
        "mergehistory-fail": "Историясна аф шоворевихть, ванк лац эли аф кочкафольхть лопась ди пингсь.",
        "mergehistory-no-source": "Лисьма лопа $1 аш.",
        "mergehistory-no-destination": "Сувафтома лопа $1 аш.",
        "filerevert-legend": "Мърдафтомс файл",
        "filerevert-intro": "Тон мърдафнесак '''[[Media:$1|$1]]''' [$4 верзиенза $3, $2-с].",
        "filerevert-comment": "Мяльполаткс:",
-       "filerevert-defaultcomment": "Мърдаф верзиес $2, $1",
+       "filerevert-defaultcomment": "Мърдаф верзиес $2, $1 ($3)",
        "filerevert-submit": "Мърдафтомс",
        "filerevert-success": "'''[[Media:$1|$1]]''' мърдаф [$4 верзиенза $3, $2].",
        "filerevert-badversion": "Тя файлть сядынгольдень верзинц вешф пингоняфкс мархта тяса аш.",
        "mailnologin": "Аш кучема адрес",
        "mailnologintext": "Тондейть эряви [[Special:UserLogin|сувамс]]\nди эряви кондясти электрононь адресце тонь [[Special:Preferences|арафнемасот]] иля тиихненди электрононь сёрмат кучемаснонды.",
        "emailuser": "Кучемс электрононь сёрма тя тиинди",
-       "emailpage": "Кучемс электрононь сёрма тиинди",
        "emailpagetext": "Тондейть ули кода нолдамс тевс формть ала тя тиинди пачфтема кучеманди.\nЭлектрононь адрессь тон путыть [[Special:Preferences|тонь тиинь латцемазонза]] кармай эвондама тонь сёрмасот \"Киста\" паксява, ди сёрмань кундаенди ули кода кучемс сонць сёрманц тя адресс.",
        "defemailsubject": "{{SITENAME}}-нь электрононь сёрма",
        "noemailtitle": "Аш электрононь адрес",
        "move-page-legend": "Шашафтомс лопать иля вастс",
        "movepagetext": "Форм ала тевс нолдамста тон лопать одс лемдесак, сембе сонь историяц ули шашфтф мархтонза од лем лопас.\nСире лемоц арай од лем лопас умборондафтфксокс.\nЛемть мархта умборондафтфксне улихть кода эслек одонзамс. Улефтяряй мяльце синь эслек одонзальхть, эряви нама варжамс[[Special:DoubleRedirects|кафонзаф]] эли [[Special:BrokenRedirects|синтьф умборондафтфксне]].\nТондейть сави лацкаста варжамс сюлмафксне илядсть арафнефокс виде ёну.\n\nШарфтк мяльце улендярясь ни тя од лемса иля сёрматфсь, лопась '''аф''' шашфтови мъзярс од вастсь арай шавакс эли умборондафтфксокс эди тоса аш ётай петнематнень историяц. Сякокс тондейть ули кода шашфтомс лопать меки коса сон инголе ульсь, эди тондейть аш кода тага весть тиемс лопать кона ули ни.\n\n'''ИНГОЛЕ МЯРЬГОМА!'''\nОдс лемдемась канни содаф лопанди апак учт эди вакска аф ётави полафтомась;\nэняльттяма арьсек тевда инголе мес тон шарьхкодят мезе лиси тонь тиемада меле.",
        "movepagetalktext": "Сотф корхнема лопась ули эслек шашфтф мархтонза '''кафта тевда башка:'''\n*Аф шава корхнема лопась ульсь ни иля лемса, эли\n*Тон изеть пута тяшкскя паксяс ала.\n\nСя тефнень сюнеда тондейть сави кядьвельде лопать шашфтомс эли шоворемс кода эряви.",
-       "movearticle": "Шашфтомс лопать иля вастс:",
        "movenologintext": "Эряви улемс сёрматфтф тиикс ди васенда [[Special:UserLogin|сувамс]] од вастс лопатнень шашфтоманди.",
        "movenotallowed": "Тон аф мярьговат шашфтомс лопат од вастс.",
        "movenotallowedfile": "Тон аф мярьговат шашфтомс файлхт.",
index a6c92b5..24d505b 100644 (file)
        "mergehistory-go": "Hijery ny fanovàna mety hatsonika",
        "mergehistory-submit": "atsonika ny version",
        "mergehistory-empty": "tsy misy version azo hatambarana",
-       "mergehistory-success": "{{PLURAL:$3|}}Versiona $3 an'i [[:$1]] no natsonika tamin'ny [[:$2]]",
+       "mergehistory-done": "{{PLURAL:$3|}}Versiona $3 an'i $1 no natsonika tamin'ny [[:$2]]",
        "mergehistory-fail": "Tsy afaka manatambatra ny tantara(n'asa). Avereno checheo ny pejy sy ny daty.",
        "mergehistory-no-source": "Tsy misy ny pejy avy amin'ny $1.",
        "mergehistory-no-destination": "Tsy misy ilay pejy tanjona $1.",
        "upload-http-error": "Nisy tsy fetezana HTTP nitranga : $1",
        "upload-copy-upload-invalid-domain": "Tsy misy eto amin'ity dômenina ity ny tahaky ny upload.",
        "upload-dialog-title": "Hanafatra rakitra",
-       "upload-dialog-error": "Nisy hadisoana nitranga",
-       "upload-dialog-warning": "Nisy fampitandremana nitranga",
        "upload-dialog-button-cancel": "Aoka",
        "upload-dialog-button-done": "Vita",
        "upload-dialog-button-save": "Tehirizina",
        "upload-dialog-button-upload": "Mampiditra",
-       "upload-dialog-label-select-file": "Hifidy rakitra",
-       "upload-dialog-label-infoform-title": "Antsipirihany",
-       "upload-dialog-label-infoform-name": "Anarana",
-       "upload-dialog-label-infoform-description": "Famisavisana",
-       "upload-dialog-label-usage-title": "Fampiasana",
-       "upload-dialog-label-usage-filename": "Anaran-drakitra",
+       "upload-process-error": "Nisy hadisoana nitranga",
+       "upload-process-warning": "Nisy fampitandremana nitranga",
+       "upload-form-label-select-file": "Hifidy rakitra",
+       "upload-form-label-infoform-title": "Antsipirihany",
+       "upload-form-label-infoform-name": "Anarana",
+       "upload-form-label-infoform-description": "Famisavisana",
+       "upload-form-label-usage-title": "Fampiasana",
+       "upload-form-label-usage-filename": "Anaran-drakitra",
        "backend-fail-stream": "Tsy afaka mamaky ilay rakitra $1.",
        "backend-fail-backup": "Tsy afaka mitahiry ilay rakitra $1.",
        "backend-fail-notexists": "Tsy misy ilay rakitra $1.",
        "filerevert-legend": "Hamerina ilay rakitra",
        "filerevert-intro": "Eo am-pamerenana ilay rakitra '''[[Media:$1|$1]]''' any amin'ny [$4 santiona tamin'ny $2 tamin'ny $3].",
        "filerevert-comment": "Antony :",
-       "filerevert-defaultcomment": "Voaverina ny santiônan'ny $1 tamin'ny $2",
+       "filerevert-defaultcomment": "Voaverina ny santiônan'ny $1 tamin'ny $2 ($3)",
        "filerevert-submit": "Hamerina",
        "filerevert-success": "Naverina tamin' [$4 ny santiôn'ny $2 tamin'ny $3] i '''[[Media:$1|$1]]'''",
        "filerevert-badversion": "An-toerana, tsy misy versiona nialoha io rakitra io miankina amin'ny daty voatoro.",
        "move-page-legend": "Afindrao toerana ny pejy",
        "movepagetext": "Ampiasao ilay fôrmiolera eo ambany eo mba hamindra azy toerana, voakisaka any amin'ny anarany ankehitriny ny tantarany. Lasa pejy fihodinana ilay pejy taloha, (manondro makany amin'ny anarany ankehitriny ilay pejy).\n\nAfaka manavao ho azy ny fihodinana mankany amin'ny lohateny taloha ianao. Raha tsy fidinao ny manao izany, marino tsara ny fisian'ireo [[Special:DoubleRedirects|fihodinana roa]] na [[Special:BrokenRedirects|fihodinana tapaka]]. Ianao no manana andrikitra amin'ny fanamarinana ny tsi-fitapahan'ireo rohy.\n\nJereo koa fa '''tsy afaka''' akisaka ilay pejy ra mitovy anarana amin'ny pejy efa misy ny anarana ny anarana vaovaon'ilay pejy tianao akisaka, fa mety atao ihany io asa io ra tsy misy nininona ilay pejy. Afaka manolo anarana pejy efa manondro ny fihisiny taloha ianao ra diso ianao, fa tsy afaka ataonao no manitsaka pejy efa misy.\n\n'''TANDREMO'''\n\nMety ho fiovana lehibe ary tsy ampoizina ny fanaovana izany ho an'ny pejy voatsidika mateetika ; fantaro tsara ny fiantraika alohan'ny manao izany.",
        "movepagetalktext": "Voasikaka koa ny pejin-dresak'ity pejy ity '''ra''' :\n\n* Efa misy pejin-dresaka efa misy votoatiny amin'ilay anarana vaovao, na\n* Ra ny ''décocher''-nao ilay kazy eo ambany.\n\nTokony ataonao rery io asa io (fusion)",
-       "movearticle": "Afindrao toerana ny pejy",
        "movenologintext": "Ny mpikambana nisoratra anarana sy [[Special:UserLogin|tafiditra]] ihany no afaka mamindra toerana takelaka.",
        "movenotallowed": "Tsy azo ovainao anarana ny pejy.",
        "movenotallowedfile": "Tsy mahazo ovainao anarana ny rakitra.",
        "tooltip-ca-nstab-main": "Jereo ny takelaka",
        "tooltip-ca-nstab-user": "Jereo ny pejin'ny mpikambana",
        "tooltip-ca-nstab-media": "Hijery ny pejin'ny Media",
-       "tooltip-ca-nstab-special": "Pejy manokana ity pejy ity, ny rindrankajy wiki no mitantana ity pejy ity",
+       "tooltip-ca-nstab-special": "Pejy manokana ity ka tsy azo ovaina",
        "tooltip-ca-nstab-project": "Hijery ny pejin-tetikasa",
        "tooltip-ca-nstab-image": "jereo ny pejy an'io rakitra io",
        "tooltip-ca-nstab-mediawiki": "Hijery ny hafatra ampiasain'ny rindrankajy",
        "spambot_username": "Fanadiovana ny spam amin'i MediaWiki.",
        "spam_reverting": "Famerenana an'ilay versiona farany tsy misy ny rohy mankany amin'ny $1",
        "spam_blanking": "Voafotsy ny versiona misy ny rohy mankany amin'ny $1",
-       "simpleantispam-label": "Fanamarinana anoherana ny spam.\n<strong>AZA</strong> fenoina ity!",
+       "simpleantispam-label": "Fanamarinana anoherana ny spam.\n<strong>Aza</strong> fenoina ity!",
        "pageinfo-title": "Fampahalalana ho an'i \"$1\"",
        "pageinfo-header-basic": "Fampahalalana fototra",
        "pageinfo-header-edits": "Tantaran'ny fanovana",
index fa670f5..f790341 100644 (file)
@@ -8,7 +8,8 @@
                        "Rahmatdenas",
                        "SpartacksCompatriot",
                        "VoteITP",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Garih bawahi tautan:",
        "filerevert-legend": "Baliakan berkas",
        "filerevert-intro": "Sanank ka mambaliakan berkas '''[[Media:$1|$1]]''' ka versi [$4 pado $3, $2].",
        "filerevert-comment": "Alasan:",
-       "filerevert-defaultcomment": "Baliakan ka versi pado $2, $1",
+       "filerevert-defaultcomment": "Baliakan ka versi pado $2, $1 ($3)",
        "filerevert-submit": "Baliakan",
        "filerevert-success": "'''[[Media:$1|$1]]''' lah dibaliakan ka versi [$4 pado $3, $2]",
        "filerevert-badversion": "Indak ado versi lokal tadahulu dari berkas ko pado wakatu nan dituju.",
        "movepagetext": "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan kasado data riwayaiknyo ka namo baru. \nJudua lamo tu ka manjadi laman pangaliahan manuju judua nan baru. \nSanak dapek mampabarui pangaliahan-pangaliahan nan manuju ka judua lamo sacaro otomatih.\nKok indak dipabarui sacaro otomatih, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|pangaliahan ganda]] atau [[Special:BrokenRedirects|pangaliahan rusak]]. Sanak batangguang jawek untuak mamastian baso pautan tu taruih manyambuang ka laman nan saharuihnyo.\n\nIngek baso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judua nan baru, kacuali bilo laman tu kosong atau marupoan laman pangaliahan dan indak adoi riwayaik suntiangan. Aratinyo Sanak dapek maubah baliak namo laman tu ka namo lamo apobilo ado kasalahan, dan baso awak indak dapek maimpok laman nan alah ado.\n\n'''Paringatan!''' \nIko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastian Sanak paham bana akibaik dari tindakan ko sabalun malanjuikannyo.",
        "movepagetext-noredirectfixer": "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan sado data riwayaiknyo ka namo baru. \nJudul lamo tu ka manjadi laman paraliahan manuju judul nan baru. \nSanak dapek mampabarui paraliahan-paraliahan nan manuju ka judul lamo sacaro otomatih.\nKok indak dipabarui sacaro otomatih, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|paraliahan ganda]] atau [[Special:BrokenRedirects|paralihan rusak]]. Sanak batangguang-jawek untuak mamastian pautan tu taruih manyambuang ka laman nan saaruihnyo.\n\nIngeklah bahaso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judul nan baru tu, kacuali bilo laman tu kosong atau marupoan laman paraliahan dan indak punyo riwayaik suntiangan. Aratinyo Sanak dapek maubah baliak namo laman ka namo samulo apobilo ado kasalahan, dan Sanak indak dapek manimpo laman nan lah ado.\n\n'''Paringatan!''' \nIko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastikan Sanak paham akibaik tindakan ko sabalun malanjuikannyo.",
        "movepagetalktext": "Laman rundiang nan takaik akan dipindahan sacaro otomatih '''kacuali bilo:'''\n\n*Laman rundiang nan indak kosong lah ado pado judul baru, atau\n*Sanak indak mangagiah tando pado kotak di bawah.\n\nDalam kasus tu, kok amuah Sanak dapek mamindahan ataupun manggabuangan laman sacaro manual.",
-       "movearticle": "Pindahkan laman",
        "moveuserpage-warning": "'''Paringatan:''' Sanak tangah mamindahan laman pangguno. Paralu dikatahui bahwa hanyo laman nan ka bapindah namun pangguno ''indak akan'' baganti namo.",
        "movenologintext": "Sanak musti pangguno tadaftar dan [[Special:UserLogin|masuak log]] untuak mamindahan laman.",
        "movenotallowed": "Sanak indak ado izin untuak mamindahan laman.",
index 4b13794..8a90b21 100644 (file)
@@ -25,7 +25,7 @@
        "tog-newpageshidepatrolled": "Скриј испатролирани страници од списокот на нови страници",
        "tog-extendwatchlist": "Прошири го список на набљудувања за приказ на сите промени, не само скорешните",
        "tog-usenewrc": "Промени во групи по страници во списокот на скорешни промени",
-       "tog-numberheadings": "Нумерирај ги заглавијата",
+       "tog-numberheadings": "Наброј ги заглавијата",
        "tog-showtoolbar": "Прикажи алатник за уредување",
        "tog-editondblclick": "Уредување на страници при двоен стисок",
        "tog-editsectiononrightclick": "Уредување на заглавија со десно копче од глушецот на нивниот наслов",
        "nstab-template": "Шаблон",
        "nstab-help": "Страница за помош",
        "nstab-category": "Категорија",
+       "mainpage-nstab": "Главна страница",
        "nosuchaction": "Нема такво дејство",
        "nosuchactiontext": "Дејството укажано во URL-адресата е погрешно.\nМожеби имате грешка во пишувањето на адресата, или пак имате проследено погрешна врска.\nОва може да се должи и на грешка во програмската опрема на {{SITENAME}}.",
        "nosuchspecialpage": "Не постои таква службена страница",
        "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|страница|страници}}",
        "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": "Ð\98Ñ\81пÑ\80аÑ\82ено Ðµ Ð¿Ð¸Ñ\81мо Ð·Ð° Ð¸Ð·Ð¼ÐµÐ½Ð° Ð½Ð° Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°Ñ\82а.",
+       "passwordreset-emailsent": "Ð\90ко Ð¾Ð²Ð° Ðµ Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80анаÑ\82а Ðµ-поÑ\88Ñ\82а Ð·Ð° Ð²Ð°Ñ\88аÑ\82а Ñ\81меÑ\82ка, Ñ\82огаÑ\88 Ñ\9cе Ð²Ð¸ Ð±Ð¸Ð´Ðµ Ð¸Ñ\81пÑ\80аÑ\82ено Ð¿Ð¸Ñ\81мо Ð·Ð° Ð·Ð°Ð´Ð°Ð²Ð°Ñ\9aе Ð½Ð° Ð½Ð¾Ð²Ð° Ð»Ð¾Ð·Ð¸Ð½Ðºа.",
        "passwordreset-emailsent-capture": "Испратено е писмо за измена на лозинката (прикажано подолу).",
        "passwordreset-emailerror-capture": "Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1",
-       "changeemail": "Смени е-пошта",
-       "changeemail-text": "Пополнете го образецов за да ја смените е-поштата. За да ја потврдите промената, ќе треба да ја внесете лозинката.",
+       "changeemail": "Смени Ð¸Ð»Ð¸ Ð¾Ñ\82Ñ\81Ñ\82Ñ\80ани Ðµ-поÑ\88Ñ\82а",
+       "changeemail-text": "Пополнете го образецов за да ја смените е-поштата. За да ја потврдите промената, ќе треба да ја внесете лозинката. Ако сакате вашата сметка да нема принадлежна е-пошта, оставете го тоа поле празно кога ќе го поднесувате образецот.",
        "changeemail-no-info": "Мора да бидете најавени ако сакате да имате директен пристап до оваа страница.",
        "changeemail-oldemail": "Тековна е-пошта:",
        "changeemail-newemail": "Нова е-пошта:",
+       "changeemail-newemail-help": "Ова поле треба да го оставите празно ако сакате да ја отстраните вашата е-пошта. Ако ја отстраните, нема да можете да ставите нова лозинка на корисничката сметка ако ја заборавите и нема да примате е-пошта од ова вики.",
        "changeemail-none": "(нема)",
        "changeemail-password": "Вашата лозинка на {{SITENAME}}:",
        "changeemail-submit": "Смени е-пошта",
        "permissionserrorstext-withaction": "Немате дозвола за $2, од {{PLURAL:$1|следнава причина|следниве причини}}:",
        "recreate-moveddeleted-warn": "Внимание: Повторно создавате страница што претходно била бришена.'''\n\nРазмислете дали е правилно да продолжите со уредување на оваа страница.\nПодолу е прикажан дневникот на бришења и преместувања на оваа страница:",
        "moveddeleted-notice": "Оваа страница била претходно бришена.\nДневникот на бришења и преместувања за оваа страница е прикажан подолу за ваше дополнително информирање.",
+       "moveddeleted-notice-recent": "За жал, страницава беше неодамна избришана (во последниве 24 часа).\nПодолу можете да го погледате дневникот на бришење и преместување.",
        "log-fulllog": "Преглед на целиот дневник",
        "edit-hook-aborted": "Уредувањето е прекинато со кука.\nНе е дадено никакво образложение.",
        "edit-gone-missing": "Не можев да ја подновам страницата.\nВеројатно е избришана.",
        "mergehistory-go": "Приказ на уредувања кои можат да се спојат",
        "mergehistory-submit": "Спојување на преработки",
        "mergehistory-empty": "Нема преработки кои можат да се спојат.",
-       "mergehistory-success": "$3 {{PLURAL:$3|преработка |преработки}} на [[:$1]] успешно {{PLURAL:$3|е споена|се споени}} во [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|преработка |преработки}} на $1 успешно {{PLURAL:$3|е споена|се споени}} во [[:$2]].",
        "mergehistory-fail": "Не е возможно да се направи спојување на историјата, проверете ја страницата и временските параметри.",
        "mergehistory-fail-toobig": "Не можам да извршам спојување на историјата бидејќи така ќе се надмине границата од {{PLURAL:$1|една преработка|$1 преработки}}.",
        "mergehistory-no-source": "Изворната страница $1 не постои.",
        "prefs-watchlist-token": "Шифра на набљудувањата:",
        "prefs-misc": "Други нагодувања",
        "prefs-resetpass": "Смени лозинка",
-       "prefs-changeemail": "Смени е-пошта",
+       "prefs-changeemail": "Смени Ð¸Ð»Ð¸ Ð¾Ñ\82Ñ\81Ñ\82Ñ\80ани Ðµ-поÑ\88Ñ\82а",
        "prefs-setemail": "Поставање на е-пошта",
        "prefs-email": "Нагодувања за е-пошта",
        "prefs-rendering": "Изглед",
        "prefs-help-signature": "Коментарите на страниците за разговор треба да се потпишуваат со „<nowiki>~~~~</nowiki>“ кое ќе се претвори во вашиот потпис и време.",
        "badsig": "Грешка во потписот.\nПроверете ги HTML ознаките.",
        "badsiglength": "Вашиот потпис е премногу долг.\nМора да биде со помалку од $1 {{PLURAL:$1|знак|знаци}}.",
-       "yourgender": "Ð\9aако Ð±Ð¸ Ñ\81акале Ð´Ð° Ð²Ðµ Ð¾Ð¿Ð¸Ñ\88Ñ\83ваме?",
-       "gender-unknown": "Ð\9aога Ñ\9cе Ð²Ðµ Ñ\81помнÑ\83ва, Ð¿Ñ\80огÑ\80амоÑ\82 Ñ\9cе ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ñ\80одово Ð½ÐµÑ\83Ñ\82Ñ\80ални Ð·Ð±Ð¾Ñ\80ови Ñ\81екаде ÐºÐ°Ñ\98Ñ\88Ñ\82о Ð¼Ð¾Ð¶Ðµ",
-       "gender-male": "ТоÑ\98 Ñ\83Ñ\80едÑ\83ва Ð²Ð¸ÐºÐ¸Ñ\81Ñ\82Ñ\80аниÑ\86и",
-       "gender-female": "Таа Ñ\83Ñ\80едÑ\83ва Ð²Ð¸ÐºÐ¸Ñ\81Ñ\82Ñ\80аниÑ\86и",
+       "yourgender": "Ð\9fол",
+       "gender-unknown": "непоÑ\81оÑ\87ено",
+       "gender-male": "маÑ\88ки",
+       "gender-female": "женÑ\81ки",
        "prefs-help-gender": "Оваа поставка е незадолжителна.\nПрограмот го користи посочениот род за да ве опишува согласно вашиот пол.\nИнформацијата ќе биде јавна.",
        "email": "Е-пошта",
        "prefs-help-realname": "Вистинското име е незадолжително.\nДоколку изберете да го внесете, тоа може да се искористи за оддавање на заслуги за Вашата работа.",
        "group-bot": "Ботови",
        "group-sysop": "Администратори",
        "group-bureaucrat": "Бирократи",
-       "group-suppress": "СкÑ\80ивачи",
+       "group-suppress": "Ð\9fÑ\80иÑ\82аÑ\98Ñ\83вачи",
        "group-all": "(сите)",
        "group-user-member": "корисник",
        "group-autoconfirmed-member": "автопотврден корисник",
        "group-bot-member": "бот",
        "group-sysop-member": "администратор",
        "group-bureaucrat-member": "бирократ",
-       "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}}:СкÑ\80ивање",
+       "grouppage-suppress": "{{ns:project}}:Ð\9fÑ\80иÑ\82аÑ\98Ñ\83вање",
        "right-read": "Читање страници",
        "right-edit": "Уредување страници",
        "right-createpage": "Создавање на страници (кои не се страници за разговор)",
        "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-options": "Нагодувања на подигањето",
        "watchthisupload": "Набљудувај ја податотекава",
        "filewasdeleted": "Податотека со ова име претходно била подигната и потоа избришана.\nПроверете во $1 пред да продолжите со повтроно подигање.",
+       "filename-thumb-name": "Изгледа дека ова е наслов на минијатура. Не подигајте минијатури од слики на истово вики. Ако ова не е така, исправете го името на податотеката за да биде поописно и да нема претставка на минијатура.",
        "filename-bad-prefix": "Името на податотеката која ја подигате започнува со '''„$1“''', типично за неописните називи кои дигиталните фотоапарати автоматски ги создаваат, што впрочем е недоволно описно.\nВе молиме одберете подобро описно име за вашата податотека.",
        "filename-prefix-blacklist": " #<!-- Не менувајте ја содржината на овој ред - оставете ја како што е --> <pre>\n# Опис на ситнаксата:\n#   * Било што по знакот „#“, па до крајот на редот претставува коментар\n#   * Секој ред означува претставка на типични имиња на податотеки што ги доделуваат дигиталните апарати\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # некои мобилни телефони\nIMG # општо\nJD # Jenoptik\nMGP # Pentax\nPICT # разни\n #</pre> <!-- Не менувајте ја содржината на овој ред - оставете ја како што е -->",
        "upload-success-subj": "Подигањето е успешно",
        "upload-file-error-text": "Се случи внатрешна грешка при обидот за создавање на помошна податотека на опслужувачот.\nМолиме контактирајте некој [[Special:ListUsers/sysop|администратор]].",
        "upload-misc-error": "Непозната грешка при подигањето",
        "upload-misc-error-text": "Се појави грешка при подигањето.\nПроверете дали URL-адресата е правилна и достапна, па обидете се повторно.\nАко пак се појави проблем, обратете се кај некој [[Special:ListUsers/sysop|администратор]].",
-       "upload-too-many-redirects": "Оваа URL адреса содржеше премногу пренасочувања",
+       "upload-too-many-redirects": "Оваа URL содржеше премногу пренасочувања",
        "upload-http-error": "Се појави грешка во HTTP: $1.",
        "upload-copy-upload-invalid-domain": "Примероци од подигањата не се достапни на овој домен.",
        "upload-dialog-title": "Подигни податотека",
-       "upload-dialog-error": "Се појави грешка",
-       "upload-dialog-warning": "Се јави предупредување",
        "upload-dialog-button-cancel": "Откажи",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Зачувај",
        "upload-dialog-button-upload": "Подигни",
-       "upload-dialog-label-select-file": "Одберете податотека",
-       "upload-dialog-label-infoform-title": "Подробно",
-       "upload-dialog-label-infoform-name": "Назив",
-       "upload-dialog-label-infoform-description": "Опис",
-       "upload-dialog-label-usage-title": "Употреба",
-       "upload-dialog-label-usage-filename": "Назив на податотеката",
+       "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": "Датум",
+       "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-wikimediacommons": "Сведочам дека јас сум имател на авторските права на оваа податотека, дека се согласувам дека неотповикливо ја објавувам на Ризницата под лиценцата [https://creativecommons.org/licenses/by-sa/4.0/deed.mk Криејтив комонс Наведи извор-Сподели под исти услови 4.0] и дека се согласувам да се придржувам до [https://wikimediafoundation.org/wiki/Terms_of_Use/mk Условите на употреба].",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Доколку вие не сте имател на авторските права на податотекава, или пак сакате да ја објавите под поинаква лиценца, веројатно ќе треба да се послужите со [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=mk Помошникот за подигање].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Можете да се обидете и на [[Special:Upload|страницата за подигање на {{SITENAME}}]], доколку податотеката може да се подигне под тамошните правила.",
        "backend-fail-stream": "Не можев да ја емитувам податотеката $1.",
        "backend-fail-backup": "Не можев да направам резерва на податотеката $1.",
        "backend-fail-notexists": "Податотеката $1 не постои.",
        "nolicense": "Нема",
        "licenses-edit": "Измени ги лиценцните можности",
        "license-nopreview": "(Прегледот не е достапен)",
-       "upload_source_url": "(податотеката што сте ја одбрале од важечка, јавно достапна URL-адреса)",
+       "upload_source_url": "(податотеката што сте ја одбрале од важечка, јавно достапна URL)",
        "upload_source_file": "(податотеката што ја одбирате од вашиот сметач)",
        "listfiles-delete": "избриши",
        "listfiles-summary": "Оваа службена страница ги прикажува сите подигнати податотеки.",
        "filerevert-legend": "Врати податотека",
        "filerevert-intro": "Ја враќате '''[[Media:$1|$1]]''' на [$4 верзијата од $3, $2].",
        "filerevert-comment": "Причина:",
-       "filerevert-defaultcomment": "Вратена на верзија од $2, $1",
+       "filerevert-defaultcomment": "Вратена на верзија од $2, $1 ($3)",
        "filerevert-submit": "Врати",
        "filerevert-success": "'''[[Media:$1|$1]]''' е вратен на [$4 верзијата од $3, $2].",
        "filerevert-badversion": "Нема претходна месна верзија на оваа податотека со даденото време.",
        "nopagetext": "Целната страница која ја наведовте не постои.",
        "pager-newer-n": "{{PLURAL:$1|понова 1|понови $1}}",
        "pager-older-n": "{{PLURAL:$1|постара 1|постари $1}}",
-       "suppress": "СкÑ\80иваÑ\9aе",
+       "suppress": "Ð\9fÑ\80иÑ\82аи",
        "querypage-disabled": "Оваа службена страница е оневозможена за да не попречува на делотворноста.",
        "apihelp": "Помош со извршникот",
        "apihelp-no-such-module": "Модулот „$1“ не е пронајден.",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
        "emailsenttext": "Писмото е испратено.",
-       "emailuserfooter": "$1 го испрати писмово на $2 со помош на функцијата „{{int:emailuser}}“ на {{SITENAME}}.",
+       "emailuserfooter": "$1 го испрати писмово на {{GENDER:$2|$2}} со помош на функцијата „{{int:emailuser}}“ на {{SITENAME}}.",
        "usermessage-summary": "Оставете системска порака.",
        "usermessage-editor": "Системски гласник",
        "usermessage-template": "MediaWiki:КорисникПорака",
        "deletepage": "Избриши страница",
        "confirm": "Потврди",
        "excontent": "содржината беше: '$1'",
-       "excontentauthor": "содржината беше: '$1' (и единствениот автор беше '$2')",
+       "excontentauthor": "содржината беше: „$1“ и единствениот автор беше [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])",
        "exbeforeblank": "содржината пред бришењето беше: '$1'",
        "delete-confirm": "Бришење на „$1“",
        "delete-legend": "Бришење",
        "move-page-legend": "Премести страница",
        "movepagetext": "Со користењето на овој образец можете да преименувате страница, преместувајќи ја целата нејзина историја под ново име.\nСтариот наслов ќе стане пренасочувачка страница кон новиот наслов.\nАвтоматски можете да ги подновите пренасочувањата кои покажуваат кон првобитниот наслов.\nАко не изберете автоматско подновување, проверете на [[Special:DoubleRedirects|двојни]] или [[Special:BrokenRedirects|прекинати пренасочувања]].\nНа вас е одговорноста да се осигурате дека врските ќе продолжат да насочуваат таму за каде се предвидени.\n\nИмајте предвид дека страницата '''нема''' да биде преместена ако веќе постои страница со новиот наслов, освен ако е не е пренасочување и нема историја на минати уредувања. Тоа значи дека можете да ја преименувате страницата како што била претходно доколку сте направиле грешка без да ја прекриете постоечката страница.\n\n'''Предупредување!'''\nОва може да биде драстична и неочекувана промена за популарна страница;\nосигурајте се дека сте ги разбрале последиците од ова пред да продолжите.",
        "movepagetext-noredirectfixer": "Со користењето на овој образец можете да преименувате страница, преместувајќи ја целата нејзина историја под ново име.\nСтариот наслов ќе стане пренасочувачка страница кон новиот наслов.\nАвтоматски можете да ги подновите пренасочувањата кои покажуваат кон првобитниот наслов.\nНе заборавајте да проверите [[Special:DoubleRedirects|двојни]] и [[Special:BrokenRedirects|прекинати пренасочувања]].\nНа вас е одговорноста да се осигурате дека врските ќе продолжат да насочуваат таму за каде се предвидени.\n\nИмајте предвид дека страницата '''НЕМА''' да биде преместена ако веќе постои страница со новиот наслов, освен ако е празна или ако е пренасочување и нема историја на минати уредувања. Тоа значи дека можете да ја преименувате страницата како што била претходно доколку сте направиле грешка без да ја прекриете постоечката страница.\n\n'''ПРЕДУПРЕДУВАЊЕ!'''\nОва може да биде драстична и неочекувана промена за популарна страница;\nосигурајте се дека сте ги разбрале последиците од ова пред да продолжите.",
-       "movepagetalktext": "Соодветната страница за разговор, доколку постои, ќе биде автоматски преместена заедно со неа, освен ако:\n*Веќе постои страница за разговор за новиот наслов, или\n*Долното поле е неозначено.\n\nВо овие случаи, ќе треба рачно да се премести или спои ако има потреба.",
-       "movearticle": "Премести страница:",
+       "movepagetalktext": "Ако го штиклирате кутивчево, соодветната страница за разговор ќе биде автоматски преместена на нов наслов, освен ако таму веќе постои страница за разговор што не е празна.\n\nВо тој случај, ќе треба да ја преместите или споите страницата рачно, доколку сакате.",
        "moveuserpage-warning": "'''Предупредување:''' На пат сте да преместите корисничка страница. Имајте предвид дека само страницата ќе биде преместена, а самиот корисник ''нема'' да биде преименуван.",
        "movecategorypage-warning": "<strong>Предупредување:</strong> Преместувате категориска страница. Имајте предвид дека ќе се премести само страницата, а страниците во старата категорија <em>нема</em> да се прекатегоризираат во новата.",
        "movenologintext": "Мора да бидете регистриран корисник и да сте [[Special:UserLogin|најавени]] за да можете да преместувате страници.",
        "cant-move-to-user-page": "Немате дозвола за преместување на страница во ваша корисничка страница (освен во корисничка потстраница)",
        "cant-move-category-page": "Немате дозвола да преместувате категориски страници.",
        "cant-move-to-category-page": "Немате дозвола да преместувате страници во категориски страници.",
-       "newtitle": "Ð\9aон Ð½Ð¾Ð²Ð¸Ð¾Ñ\82 наслов:",
+       "newtitle": "Ð\9dов наслов:",
        "move-watch": "Набљудувај ја страницава",
        "movepagebtn": "Премести страница",
        "pagemovedsub": "Успешно преместување",
        "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",
        "api-error-badaccess-groups": "Не ви е дозволено да подигате податотеки на ова вики.",
        "api-error-badtoken": "Внатрешна грешка: неисправна шифра.",
        "api-error-copyuploaddisabled": "Подигањата со URL се оневозможени на овој опслужувач.",
-       "api-error-duplicate": "Веќе {{PLURAL:$1|постои [$2 друга податотека]|постојат [$2 други податотеки]}} со истата содржина",
-       "api-error-duplicate-archive": "На мрежното место веќе {{PLURAL:$1|постоела [$2 друга податотека]|постоеле [$2 други податотеки]}} со истата содржина, но во меѓувреме {{PLURAL:$1|е избришана|се избришани}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Дуплирана податотека што е веќе избришана|Дуплирани податотеки што се веќе избришани}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Дуплирана податотека|Дуплирани податотеки}}",
+       "api-error-duplicate": "Веќе {{PLURAL:$1|постои друга податотека|постојат други податотеки}} со истата содржина.",
+       "api-error-duplicate-archive": "На мрежното место веќе {{PLURAL:$1|постоела друга податотека|постоеле други податотеки}} со истата содржина, но во меѓувреме {{PLURAL:$1|била избришана|биле избришани}}.",
        "api-error-empty-file": "Поднесената податотека е празна.",
        "api-error-emptypage": "Создавањето на нови празни страници не е дозволено.",
        "api-error-fetchfileerror": "Внатрешна грешка: нешто тргна наопаку при добивањето на податотеката.",
index 60f032c..974df4c 100644 (file)
@@ -29,7 +29,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Viswaprabha",
-                       "Nesi"
+                       "Nesi",
+                       "Macofe"
                ]
        },
        "tog-underline": "കണ്ണികൾക്ക് അടിവരയിടുക:",
        "nstab-template": "ഫലകം",
        "nstab-help": "സഹായ താൾ",
        "nstab-category": "വർഗ്ഗം",
+       "mainpage-nstab": "പ്രധാന താൾ",
        "nosuchaction": "ഈ പ്രവൃത്തി അസാധുവാണ്‌",
        "nosuchactiontext": "യു.ആർ.എൽ. വഴി നിർവചിച്ച പ്രവർത്തനം വിക്കി തിരിച്ചറിഞ്ഞില്ല. താങ്കൾ യു.ആർ.എൽ. തെറ്റായി നൽകിയിരിക്കാം അല്ലെങ്കിൽ ഒരു തെറ്റായ ലിങ്കുവഴി വന്നിരിക്കാം.\nഒരുപക്ഷേ, ഇത് {{SITENAME}} ഉപയോഗിക്കുന്ന സോഫ്റ്റ്‌വെയറിലെ ബഗ്ഗും ആകാം.",
        "nosuchspecialpage": "അത്തരമൊരു പ്രത്യേകതാൾ നിലവിലില്ല",
        "createacct-captcha": "സുരക്ഷാ പരിശോധന",
        "createacct-imgcaptcha-ph": "മുകളിൽ കാണുന്ന എഴുത്ത് ഇവിടെ നൽകുക",
        "createacct-submit": "താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കുക",
-       "createacct-another-submit": "മറàµ\8dà´±àµ\8aà´°àµ\81 à´\85à´\82à´\97à´¤àµ\8dവമàµ\86à´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´\95",
+       "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\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": "à´\92à´°àµ\81 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´\85à´¯à´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9f്.",
+       "passwordreset-emailsent": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\85à´\82à´\97à´¤àµ\8dവവàµ\81മായി à´¬à´¨àµ\8dധിപàµ\8dപിà´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fàµ\81à´³àµ\8dà´³ à´\87à´®àµ\86യിൽ à´µà´¿à´²à´¾à´¸à´\82 à´\87താണàµ\86à´\99àµ\8dà´\95ിൽ,  à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´\85à´¯à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതാണ്.",
        "passwordreset-emailsent-capture": "രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.",
        "passwordreset-emailerror-capture": "താഴെക്കൊടുത്തിരിക്കുന്ന, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ സൃഷ്ടിക്കാനായെങ്കിലും, അത് {{GENDER:$2|ഉപയോക്താവിന്}} അയയ്ക്കുന്നത് പരാജയപ്പെട്ടു: $1",
-       "changeemail": "à´\87à´®àµ\86യിൽ à´µà´¿à´²à´¾à´¸à´¤àµ\8dതിൽ à´®à´¾à´±àµ\8dà´±à´\82വരàµ\81à´¤àµ\8dà´¤ുക",
-       "changeemail-text": "താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക. മാറ്റം സ്ഥിരീകരിക്കാനായി താങ്കളുടെ രഹസ്യവാക്ക് കൂടെ നൽകേണ്ടതാണ്.",
+       "changeemail": "à´\87à´®àµ\86യിൽ à´µà´¿à´²à´¾à´¸à´\82 à´®à´¾à´±àµ\8dà´±àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¨àµ\80à´\95àµ\8dà´\95à´\82à´\9aàµ\86à´¯àµ\8dà´¯ുക",
+       "changeemail-text": "താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക. മാറ്റം സ്ഥിരീകരിക്കാനായി താങ്കളുടെ രഹസ്യവാക്ക് കൂടെ നൽകേണ്ടതാണ്. താങ്കളുടെ അംഗത്വവുമായി ഏതെങ്കിലുമൊരു ഇമെയിൽ വിലാസത്തിനുള്ള ബന്ധം ഒഴിവാക്കാൻ ഫോം പൂരിപ്പിക്കുമ്പോൾ പുതിയ ഇമെയിൽ വിലാസം ഒഴിച്ചിടുക.",
        "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": "ചീട്ടുകളൊന്നും പുനഃസജ്ജീകരിക്കാനില്ല.",
        "permissionserrorstext-withaction": "താങ്കൾക്ക് $2 എന്ന പ്രവൃത്തി ചെയ്യാൻ അനുമതി ഇല്ല, {{PLURAL:$1|കാരണം|കാരണങ്ങൾ}} താഴെ കൊടുത്തിരിക്കുന്നു:",
        "recreate-moveddeleted-warn": "'''മുന്നറിയിപ്പ്: മുമ്പ് മായ്ച്ചുകളഞ്ഞ താളാണ്‌ താങ്കൾ വീണ്ടും ചേർക്കാൻ ശ്രമിക്കുന്നത്'''\n\nതാങ്കൾ ചെയ്യുന്നത് ശരിയായ നടപടിയാണോ എന്നു പരിശോധിക്കുക. ഉറപ്പിനായി ഈ താളിന്റെ മായ്ക്കൽ രേഖയും മാറ്റൽ രേഖയും കൂടെ ചേർത്തിരിക്കുന്നു.",
        "moveddeleted-notice": "ഈ താൾ മായ്ക്കപ്പെട്ടിരിക്കുന്നു.\nഈ താളിന്റെ മായ്ക്കൽ രേഖ പരിശോധനയ്ക്കായി താഴെ കൊടുത്തിരിക്കുന്നു",
+       "moveddeleted-notice-recent": "ക്ഷമിക്കുക, ഈ താൾ ഈയടുത്ത് (കഴിഞ്ഞ 24 മണിക്കൂറിനുള്ളിൽ) മായ്ക്കപ്പെട്ടു.\nഅവലംബമായി മായ്ക്കലിന്റെയും താൾ നീക്കിയതിന്റെയും രേഖ താഴെ കൊടുത്തിരിക്കുന്നു.",
        "log-fulllog": "എല്ലാ രേഖകളും കാണുക",
        "edit-hook-aborted": "തിരുത്തൽ കൊളുത്തിനാൽ റദ്ദാക്കിയിരിക്കുന്നു.\nവിശദീകരണമൊന്നും നൽകിയിട്ടില്ല.",
        "edit-gone-missing": "ഈ താൾ പുതുക്കുവാൻ സാധിക്കുകയില്ല.\nഇത് മായ്ക്കപ്പെട്ടതായി കാണുന്നു.",
        "mergehistory-go": "സം‌യോജിപ്പിക്കാവുന്ന തിരുത്തുകൾ കാട്ടുക",
        "mergehistory-submit": "പതിപ്പുകൾ സം‌യോജിപ്പിക്കുക",
        "mergehistory-empty": "സം‌യോജിപ്പിക്കാവുന്ന പതിപ്പുകളൊന്നും ഇല്ല.",
-       "mergehistory-success": "[[:$1]]-ന്റെ {{PLURAL:$3|പതിപ്പ്|പതിപ്പുകൾ}} [[:$2]]-ലേക്കു വിജയകരമായി സം‌യോജിപ്പിച്ചിരിക്കുന്നു.",
+       "mergehistory-done": "$1-ന്റെ {{PLURAL:$3|പതിപ്പ്|പതിപ്പുകൾ}} [[:$2]]-ലേക്കു വിജയകരമായി സം‌യോജിപ്പിച്ചിരിക്കുന്നു.",
        "mergehistory-fail": "താളുകളുടെ നാൾവഴി സം‌യോജനം നടത്താൻ സാദ്ധ്യമല്ല. താളുകളും സമയവിവരങ്ങളും ഒന്നു കൂടി പരിശോധിക്കുക.",
        "mergehistory-fail-toobig": "{{PLURAL:$1|ഒരു നാൾപ്പതിപ്പിൽ|$1 നാൾപ്പതിപ്പുകൾ}} മാറ്റണമെന്നതിനാൽ നാൾവഴി ലയിപ്പിക്കാൽ നടത്താനാവില്ല.",
        "mergehistory-no-source": "സ്രോതസ്സ് താളായ $1 നിലവിലില്ല.",
        "prefs-watchlist-token": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയ്ക്കുള്ള അടയാളപദം:",
        "prefs-misc": "പലവക",
        "prefs-resetpass": "രഹസ്യവാക്ക് മാറ്റുക",
-       "prefs-changeemail": "à´\87à´®àµ\86യിലിൽ à´®à´¾à´±àµ\8dà´±à´\82വരàµ\81à´¤àµ\8dà´¤ുക",
+       "prefs-changeemail": "à´\87à´®àµ\86യിൽ à´µà´¿à´²à´¾à´¸à´\82 à´®à´¾à´±àµ\8dà´±àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¨àµ\80à´\95àµ\8dà´\95à´\82à´\9aàµ\86à´¯àµ\8dà´¯ുക",
        "prefs-setemail": "ഇമെയിൽ വിലാസം സജ്ജമാക്കുക",
        "prefs-email": "ഇമെയിൽ ക്രമീകരണങ്ങൾ",
        "prefs-rendering": "ദൃശ്യരൂപം",
        "group-bot": "യന്ത്രങ്ങൾ",
        "group-sysop": "കാര്യനിർവാഹകർ",
        "group-bureaucrat": "ബ്യൂറോക്രാറ്റുകൾ",
-       "group-suppress": "à´®àµ\87ൽനàµ\8bà´\9fàµ\8dà´\9fà´\99àµ\8dà´\99ൾ",
+       "group-suppress": "à´\85മർà´\9aàµ\8dà´\9aà´\95ർ",
        "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|à´®àµ\87ൽനàµ\8bà´\9fàµ\8dà´\9fà´\82}}",
+       "group-suppress-member": "{{GENDER:$1|à´\85മർà´\9aàµ\8dà´\9aà´\95|à´\85മർà´\9aàµ\8dà´\9aà´\95ൻ}}",
        "grouppage-user": "{{ns:project}}:ഉപയോക്താക്കൾ",
        "grouppage-autoconfirmed": "{{ns:project}}:യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾ",
        "grouppage-bot": "{{ns:project}}:യന്ത്രങ്ങൾ",
        "grouppage-sysop": "{{ns:project}}:കാര്യനിർവാഹകർ",
        "grouppage-bureaucrat": "{{ns:project}}:ബ്യൂറോക്രാറ്റ്",
-       "grouppage-suppress": "{{ns:project}}:à´®àµ\87ൽനàµ\8bà´\9fàµ\8dà´\9fà´\82",
+       "grouppage-suppress": "{{ns:project}}:à´\92à´¤àµ\81à´\95àµ\8dà´\95ൽ",
        "right-read": "\nതാളുകൾ വായിക്കുക",
        "right-edit": "താളുകൾ തിരുത്തുക",
        "right-createpage": "താളുകൾ സൃഷ്ടിക്കുക (സംവാദം താളുകൾ അല്ലാത്തവ)",
        "recentchangeslinked-summary": "ഒരു പ്രത്യേക താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ടിട്ടുള്ള താളുകളിൽ അവസാനമായി വരുത്തിയ മാറ്റങ്ങളുടെ പട്ടിക താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു. ഈ പട്ടികയിൽ പെടുന്ന [[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-http-error": "ഒരു എച്ച്.റ്റി.റ്റി.പി. പിഴവു സംഭവിച്ചിരിക്കുന്നു: $1",
        "upload-copy-upload-invalid-domain": "ഈ ഡൊമൈനിൽ നിന്നും പകർത്തി അപ്‌ലോഡ് ചെയ്യൽ ലഭ്യമല്ല.",
        "upload-dialog-title": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യുക",
-       "upload-dialog-error": "ഒരു പിഴവുണ്ടായി",
-       "upload-dialog-warning": "ഒരു മുന്നറിയിപ്പുണ്ടായി",
        "upload-dialog-button-cancel": "റദ്ദാക്കുക",
        "upload-dialog-button-done": "ചെയ്തു കഴിഞ്ഞു",
        "upload-dialog-button-save": "സേവ് ചെയ്യുക",
        "upload-dialog-button-upload": "അപ്‌‌ലോഡ്",
-       "upload-dialog-label-select-file": "പ്രമാണം തിരഞ്ഞെടുക്കുക",
-       "upload-dialog-label-infoform-title": "വിശദാംശങ്ങൾ",
-       "upload-dialog-label-infoform-name": "പേര്‌",
-       "upload-dialog-label-infoform-description": "വിവരണം",
-       "upload-dialog-label-usage-title": "ഉപയോഗം",
-       "upload-dialog-label-usage-filename": "പ്രമാണത്തിന്റെ പേര്",
+       "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": "തീയതി",
+       "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-wikimediacommons": "ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം എനിക്ക് സ്വന്തമാണെന്നും, ഈ പ്രമാണം വിക്കിമീഡിയ കോമൺസിൽ പിന്നീട് മാറ്റാനാവത്തവിധം [https://creativecommons.org/licenses/by-sa/4.0/ ക്രിയേറ്റീവ് കോമൺസ് ആട്രിബ്യൂഷൻ-ഷെയർഎലൈക് 4.0] ഉപയോഗാനുമതിയിൽ പ്രസിദ്ധീകരിക്കാമെന്നും [https://wikimediafoundation.org/wiki/Terms_of_Use/ml ഉപയോഗനിബന്ധനകൾ] അംഗീകരിക്കുന്നുവെന്നും സാക്ഷ്യപ്പെടുത്തുന്നു.",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം താങ്കളുടെ സ്വന്തമല്ലെങ്കിൽ അഥവാ മറ്റൊരു ഉപയോഗാനുമതിയിലാണ് പ്രമാണം പ്രസിദ്ധീകരിക്കാൻ ഉദ്ദേശിക്കുന്നതെങ്കിൽ [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=ml കോമൺസിലെ അപ്‌ലോഡ് സഹായി] ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക.",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "ഈ പ്രമാണം അവരുടെ നയങ്ങൾക്കനുസൃതമായി അപ്‌ലോഡ് ചെയ്യാൻ സൈറ്റ് അനുവദിക്കുമെങ്കിൽ [[Special:Upload|{{SITENAME}} സംരംഭത്തിലെ അപ്‌ലോഡ് താൾ]] പരീക്ഷിച്ചു നോക്കാവുന്നതാണ്.",
        "backend-fail-stream": "$1 എന്ന പ്രമാണം സ്ട്രീം ചെയ്യാൻ കഴിഞ്ഞില്ല.",
        "backend-fail-backup": "$1 എന്ന പ്രമാണത്തിന്റെ ബാക്ക്അപ് എടുക്കാൻ കഴിഞ്ഞില്ല.",
        "backend-fail-notexists": "$1 എന്ന പ്രമാണം നിലവിലില്ല.",
        "filerevert-legend": "പ്രമാണം തിരസ്ക്കരിക്കുക",
        "filerevert-intro": "താങ്കൾ '''[[Media:$1|$1]]''' എന്ന പ്രമാണത്തെ, [$4 $2, $3-ന് ഉണ്ടായിരുന്ന പതിപ്പിലേക്ക്] സേവ് ചെയ്യുകയാണ്‌.",
        "filerevert-comment": "കാരണം:",
-       "filerevert-defaultcomment": "$2 ൽ ഉണ്ടായിരുന്ന $1 പതിപ്പിലേക്കു സേവ് ചെയ്തിരിക്കുന്നു",
+       "filerevert-defaultcomment": "$1, $2 ($3)-നു ഉണ്ടായിരുന്ന പതിപ്പിലേക്കു സേവ് ചെയ്തിരിക്കുന്നു",
        "filerevert-submit": "പുനഃസ്ഥാപിക്കുക",
        "filerevert-success": "'''[[Media:$1|$1]]''' യെ,  [$3, $2 ഉണ്ടായിരുന്ന $4] പതിപ്പിലേക്കു സേവ് ചെയ്തിരിക്കുന്നു.",
        "filerevert-badversion": "താങ്കൾ തന്ന സമയവുമായി യോജിക്കുന്ന മുൻ പതിപ്പുകൾ ഒന്നും തന്നെ ഈ പ്രമാണത്തിനില്ല.",
        "nopagetext": "താങ്കൾ വ്യക്തമാക്കിയ ലക്ഷ്യതാൾ നിലവിലില്ല.",
        "pager-newer-n": "{{PLURAL:$1|പുതിയ 1|പുതിയ $1}}",
        "pager-older-n": "{{PLURAL:$1|പഴയ 1|പഴയ $1}}",
-       "suppress": "à´®àµ\87ൽനàµ\8bà´\9fàµ\8dà´\9fà´\82",
+       "suppress": "à´\92à´¤àµ\81à´\95àµ\8dà´\95àµ\81à´\95",
        "querypage-disabled": "പ്രവർത്തനമികവിനെ ബാധിക്കുന്ന കാരണങ്ങളാൽ ഈ പ്രത്യേക താൾ പ്രവർത്തന രഹിതമാക്കിയിരിക്കുന്നു.",
        "apihelp": "എ.പി.ഐ. സഹായം",
        "apihelp-no-such-module": "ഘടകം \"$1\" കണ്ടെത്താനായില്ല.",
        "emailccsubject": "$1 എന്ന ഉപയോക്താവിനയച്ച സന്ദേശത്തിന്റെ പകർപ്പ്: $2",
        "emailsent": "ഇമെയിൽ അയച്ചിരിക്കുന്നു",
        "emailsenttext": "താങ്കളുടെ ഇമെയിൽ അയച്ചു കഴിഞ്ഞിരിക്കുന്നു.",
-       "emailuserfooter": "ഈ ഇമെയിൽ, {{SITENAME}} സംരംഭത്തിലെ \"{{int:emailuser}}\" എന്ന സൗകര്യം ഉപയോഗിച്ച്, $1 എന്ന ഉപയോക്താവ് $2 എന്ന ഉപയോക്താവിന് അയച്ചതാണ്.",
+       "emailuserfooter": "ഈ ഇമെയിൽ, {{SITENAME}} സംരംഭത്തിലെ \"{{int:emailuser}}\" എന്ന സൗകര്യം ഉപയോഗിച്ച്, $1 എന്ന ഉപയോക്താവ് {{GENDER:$2|$2}} എന്ന ഉപയോക്താവിന് {{GENDER:$1|അയച്ചതാണ്}}.",
        "usermessage-summary": "വ്യവസ്ഥാസന്ദേശം ഉപേക്ഷിക്കുക.",
        "usermessage-editor": "വ്യവസ്ഥാസന്ദേശകൻ",
        "watchlist": "ശ്രദ്ധിക്കുന്നവ",
        "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": "മായ്ക്കുക",
        "move-page-legend": "താൾ മാറ്റുക",
        "movepagetext": "താഴെയുള്ള ഫോം ഒരു താളിനെ പുനർനാമകരണം ചെയ്യാനുള്ളതാണ്, താളിന്റെ നാൾവഴിയും അക്കൂടെ പുതിയ പേരിലേയ്ക്ക് മാറുന്നതാണ്.\nപഴയ തലക്കെട്ട്, പുതിയ തലക്കെട്ടുള്ള താളിലേക്കുള്ള ഒരു തിരിച്ചുവിടൽ താളായി മാറും.\nപഴയ തലക്കെട്ടിലേക്കുള്ള തിരിച്ചുവിടലുകൾ യന്ത്രങ്ങൾ ഉപയോഗിച്ച് താങ്കൾക്ക് ശരിയാക്കാവുന്നതാണ്.\nഅങ്ങനെ വേണ്ട എന്നാണ് താങ്കളാഗ്രഹിക്കുന്നതെങ്കിൽ [[Special:DoubleRedirects|ഇരട്ട തിരിച്ചുവിടലുകളോ]], [[Special:BrokenRedirects|ഫലപ്രദമല്ലാത്ത തിരിച്ചുവിടലുകളോ]] ഉണ്ടാകുന്നുണ്ടോയെന്ന് ദയവായി പരിശോധിക്കുക.\nലിങ്കുകൾ ശരിയായി പ്രവർത്തിക്കുന്നുണ്ടോ എന്ന് പരിശോധിച്ച് ഉറപ്പു വരുത്തേണ്ടത് താങ്കളുടെ ചുമതലയാണ്.\n\nതാങ്കൾ പുതിയതായി ഉദ്ദേശിക്കുന്ന തലക്കെട്ടിൽ ഒരു താൾ നേരത്തേ നിലവിലുണ്ടെങ്കിൽ '''പുനർനാമകരണം സാധിക്കില്ല'''.\nഅല്ലെങ്കിൽ അതൊരു തിരിച്ചുവിടൽ താളോ, ശൂന്യമായ താളോ അതിനു മറ്റു പഴയരൂപങ്ങൾ ഇല്ലാതിരിക്കുകയോ ചെയ്യണം.\nഅതായത് താങ്കൾ ഒരു താൾ തെറ്റായി പുനർനാമകരണം ചെയ്താൽ മാത്രമേ അതിനേ തിരിച്ചാക്കാൻ സാധിക്കുകയുള്ളു.\nനിലവിലുള്ള ഒരു താളിന്റെ മുകളിൽ അതേ തലക്കെട്ടിൽ മറ്റൊരു താളുണ്ടാക്കാൻ സാധിക്കില്ല.\n\n'''മുന്നറിയിപ്പ്!:'''\nഈ പ്രവൃത്തി ഒരു നല്ലതാളിൽ അപ്രതീക്ഷിതവും, ഉഗ്രവുമായ ഫലങ്ങൾ ഉണ്ടാക്കിയേക്കാം.\nമുന്നോട്ടു പോകുന്നതിനു മുമ്പ് താങ്കൾ ചെയ്യുന്നതെന്താണെന്ന് വ്യക്തമായി മനസ്സിലാക്കുക.",
        "movepagetext-noredirectfixer": "താഴെയുള്ള ഫോം ഒരു താളിനെ പുനർനാമകരണം ചെയ്യാനുള്ളതാണ്.\nതാളിന്റെ പഴയരൂപങ്ങളും ഈ മാറ്റത്തിന് വിധേയമാക്കപ്പെടും.\nപഴയ തലക്കെട്ട്, പുതിയ തലക്കെട്ടുള്ള താളിലേക്കുള്ള ഒരു തിരിച്ചുവിടൽ താളായി മാറും.\nപഴയതാളിലേക്കുള്ള ലിങ്കുകൾ ഈ മാറ്റത്തിൽ മാറുകയില്ല.\n[[Special:DoubleRedirects|ഇരട്ട തിരിച്ചുവിടലുകളോ]], [[Special:BrokenRedirects|ഫലപ്രദമല്ലാത്ത തിരിച്ചുവിടലുകളോ]] ഉണ്ടാകുന്നുണ്ടോയെന്ന് ദയവായി പരിശോധിക്കുക.\nലിങ്കുകൾ ശരിയായി പ്രവർത്തിക്കുന്നുണ്ടോ എന്ന് പരിശോധിച്ച് ഉറപ്പു വരുത്തേണ്ടത് താങ്കളുടെ ചുമതലയാണ്.\n\nതാങ്കൾ പുതിയതായി ഉദ്ദേശിക്കുന്ന തലക്കെട്ടിൽ ഒരു താൾ നേരത്തേ നിലവിലുണ്ടെങ്കിൽ '''പുനർനാമകരണം സാധിക്കില്ല'''.\nഅല്ലെങ്കിൽ അതൊരു തിരിച്ചുവിടൽ താളോ, ശൂന്യമായ താളോ അതിനു മറ്റു പഴയരൂപങ്ങൾ ഇല്ലാതിരിക്കുകയോ ചെയ്യണം.\nഅതായത് താങ്കൾ ഒരു താൾ തെറ്റായി പുനർനാമകരണം ചെയ്താൽ മാത്രമേ അതിനേ തിരിച്ചാക്കാൻ സാധിക്കുകയുള്ളു.\nനിലവിലുള്ള ഒരു താളിന്റെ മുകളിൽ അതേ തലക്കെട്ടിൽ മറ്റൊരു താളുണ്ടാക്കാൻ സാധിക്കില്ല.\n\n'''മുന്നറിയിപ്പ്!:'''\nഈ പ്രവൃത്തി ഒരു നല്ലതാളിൽ അപ്രതീക്ഷിതവും, ഉഗ്രവുമായ ഫലങ്ങൾ സൃഷ്ടിച്ചേക്കാം.\nമുന്നോട്ടു പോകുന്നതിനു മുമ്പ് താങ്കൾ ചെയ്യുന്നതെന്താണെന്ന് വ്യക്തമായി മനസ്സിലാക്കുക.",
-       "movepagetalktext": "'''ബന്ധപ്പെട്ട സം‌വാദത്താൾ സ്വയം മാറ്റപ്പെടാതിരിക്കാനുള്ള കാരണങ്ങൾ'''\n*അതേ പേരിൽ തന്നെ ശൂന്യമല്ലാത്ത ഒരു സം‌വാദത്താൾ നിലവിലുണ്ടെങ്കിൽ\n*താങ്കൾ താഴെയുള്ള ചെൿബോക്സ് ഉപയോഗിച്ചിട്ടില്ലെങ്കിൽ\n\nഅത്തരം സന്ദർഭങ്ങളിൽ സം‌വാദത്താളുകൾ താങ്കൾ സ്വയം കൂട്ടിച്ചേർക്കേണ്ടതാണ്.",
-       "movearticle": "മാറ്റേണ്ട താൾ",
+       "movepagetalktext": "ഇവിടെ ശരിയിട്ട് നൽകിയിട്ടുണ്ടെങ്കിൽ, അതേ പേരിൽ തന്നെ ശൂന്യമല്ലാത്ത ഒരു സം‌വാദത്താൾ നിലവിലില്ലാത്ത പക്ഷം ബന്ധപ്പെട്ട സം‌വാദത്താൾ പുതിയ തലക്കെട്ടിലേക്ക് സ്വയം മാറപ്പെടുന്നതാണ്.\n\nഅത്തരം സന്ദർഭങ്ങളിൽ സം‌വാദത്താളുകൾ താങ്കൾ സ്വയം ലയിപ്പിക്കേണ്ടതാണ്.",
        "moveuserpage-warning": "'''മുന്നറിയിപ്പ്:''' ഉപയോക്താവിനുള്ള താളാണ് താങ്കൾ മാറ്റാൻ പോകുന്നത്. താൾ മാത്രമേ മാറുകയുള്ളു എന്നും ഉപയോക്താവിന്റെ പേര് ''മാറുകയില്ലെന്നും'' ദയവായി ഓർക്കുക.",
        "movecategorypage-warning": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ ഒരു വർഗ്ഗതാൾ മാറ്റാൻ പോവുകയാണ്. ഈ താൾ മാത്രമേ മാറുകയുള്ളുവെന്നും പഴയ വർഗ്ഗത്തിൽ ഉണ്ടായിരുന്ന താളുകളൊന്നും പുനർവർഗ്ഗീകരണം ചെയ്യാത്ത പക്ഷം പുതിയതിലേക്ക് <em>മാറില്ലെന്നും</em> ഓർക്കുക.",
        "movenologintext": "തലക്കെട്ടു മാറ്റാനുള്ള അനുമതി കൈവരിക്കാൻ താങ്കൾ ഒരു രജിസ്റ്റേർഡ് ഉപയോക്താവായിരിക്കുകയും [[Special:UserLogin|ലോഗിൻ ചെയ്തിരിക്കുകയും]] ചെയ്യേണ്ടത് അത്യന്താപേക്ഷിതമാണ്‌.",
        "api-error-badaccess-groups": "ഈ വിക്കിയിൽ പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യാൻ താങ്കൾക്കനുവാദമില്ല.",
        "api-error-badtoken": "ആന്തരിക പിഴവ്: ഗുണകരമല്ലാത്ത ചീട്ട്.",
        "api-error-copyuploaddisabled": "യൂ.ആർ.എൽ. ഉപയോഗിച്ചുള്ള അപ്‌ലോഡ് ഈ സെർവറിൽ പ്രവർത്തനസജ്ജമാക്കിയിട്ടില്ല.",
-       "api-error-duplicate": "വിക്കിയിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|[$2 മറ്റൊരു പ്രമാണം]|[$2 മറ്റ് പ്രമാണങ്ങൾ]}} മുമ്പേയുണ്ട്.",
-       "api-error-duplicate-archive": "സൈറ്റിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|[$2 മറ്റൊരു പ്രമാണം]|[$2 മറ്റ് പ്രമാണങ്ങൾ]}} ഉണ്ടായിരുന്നു, പക്ഷേ {{PLURAL:$1|അത്|അവ}} മായ്ക്കപ്പെട്ടിട്ടുണ്ട്.",
-       "api-error-duplicate-archive-popup-title": "പകർപ്പ് {{PLURAL:$1|പ്രമാണം|പ്രമാണങ്ങൾ}} മുമ്പേതന്നെ മായ്ക്കപ്പെട്ടു",
-       "api-error-duplicate-popup-title": "പകർപ്പ് {{PLURAL:$1|പ്രമാണം|പ്രമാണങ്ങൾ}}",
+       "api-error-duplicate": "വിക്കിയിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|മറ്റൊരു പ്രമാണം|മറ്റ് പ്രമാണങ്ങൾ}} മുമ്പേയുണ്ട്.",
+       "api-error-duplicate-archive": "സൈറ്റിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|മറ്റൊരു പ്രമാണം|മറ്റ് പ്രമാണങ്ങൾ}} ഉണ്ടായിരുന്നു, പക്ഷേ {{PLURAL:$1|അത്|അവ}} മായ്ക്കപ്പെട്ടിട്ടുണ്ട്.",
        "api-error-empty-file": "താങ്കൾ സമർപ്പിച്ച പ്രമാണം ശൂന്യമാണ്.",
        "api-error-emptypage": "ശൂന്യമായ പുതിയ താളുകൾ സൃഷ്ടിക്കുന്നത് അനുവദിക്കുന്നില്ല.",
        "api-error-fetchfileerror": "ആന്തരിക പിഴവ്: പ്രമാണം ശേഖരിച്ചുകൊണ്ടിരുന്നപ്പോൾ എന്തോ പിഴവുണ്ടായി.",
index 3c380d9..4628e81 100644 (file)
        "mergehistory-go": "Нэгтгэж болох засваруудыг үзүүлэх",
        "mergehistory-submit": "Засваруудыг нэгтгэх",
        "mergehistory-empty": "Ямар ч засварыг нэгтгэх боломжгүй байна.",
-       "mergehistory-success": "[[:$1]]-н $3 засварыг [[:$2]] руу нэгтгэлээ.",
+       "mergehistory-done": "$1-н $3 засварыг [[:$2]] руу нэгтгэлээ.",
        "mergehistory-fail": "Түүхийг нэгтгэх боломжгүй байна. Хуудас болон огноогийн параметрийг дахин шалгаж үзнэ үү.",
        "mergehistory-no-source": "$1 эх үүсвэр хуудас байхгүй байна.",
        "mergehistory-no-destination": "$1 зорьсон хуудас байхгүй байна.",
        "move-page-legend": "Хуудсыг ондоогоор нэрлэх",
        "movepagetext": "Доорх маягтыг ашигласнаар хуудасны нэр солигдож, түүний бүх түүх шинэ нэр лүү зөөгдөх болно.\nХуучин гарчиг нь шинэ гарчиг руух чиглүүлэгч болно.\nТа чиглүүлэгчийг эх бичвэр лүү автоматаар заахаар шинэчлэх боломжтой.\nХэрэв та ингэхийг хүсэхгүй бол, [[Special:DoubleRedirects|давхардсан]] эсвэл [[Special:BrokenRedirects|тасарсан]] чиглүүлэгч байгаа эсэхийг шалгаж нягтлаарай.\nТа тухайн холбоосын нэрийг өөрчилж байгаа учир тэдгээр нь урьдын адил заагдсан газартаа очиж байхыг нягтлах нь таны хариуцах зүйл юм.\n\nТаны сонгосон шинэ нэртэй адил гарчигтэй хуудас байвал хуудас '''зөөгдөхгүй''' (тэр хуудас нь хоосон, чиглүүлэгч, түүхгүй үед л зөөгдөнө) гэдгийг анхаараарай. Энэ нь одоо байгаа хуудсыг дарж бичиж болохгүй ба саяхан зөөгдсөн хуудасны хуучин гарчгийг буцаан өгч алдаагаа засч болно гэсэн үг юм.\n\n<b>АНХААР!</b> Энэ үйлдэл нь нийтлэг хуудсуудад засч болшгүй өөрчлөлт оруулж магадгүй тул та хийх гэж байгаа үйлдлийнхээ үр дагаврыг сайн ойлгож байж гүйцэтгээрэй.",
        "movepagetalktext": "Харгалзах хэлэлцүүлгийн хуудас нь автоматаар үүнтэй хамт зөөгдөх болно. '''Зөөгдөхгүй байх тохиолдол нь:'''\n*Шинэ нэр дээр нь хоосон биш хэлэлцүүлгийн хуудас байгаа\n*Доорх дөрвөлжинг хоосон болгосон\n\nЭдгээр тохиолдлуудад уг хуудсыг гар аргаар зөөх эсвэл нэгтгэх шаардлагатай болно.",
-       "movearticle": "Хуудсын нэрийг солих:",
        "moveuserpage-warning": "'''Анхаар:''' Та хэрэглэгчийн хуудсыг зөөх гэж байна. Зөвхөн хуудас нь л зөөгдөнө, харин хэрэглэгчийн нэр ''солигдохгүй'' гэдгийг анхаарана уу.",
        "movenologintext": "Та хуудсыг зөөхийн тулд бүртгэлтэй бөгөөд [[Special:UserLogin|холбогдсон]] байх ёстой.",
        "movenotallowed": "Таньд хуудас зөөх зөвшөөрөл байхгүй байна.",
index ef5cbdf..d0fa15e 100644 (file)
@@ -48,7 +48,8 @@
                        "Steinsplitter",
                        "Macofe",
                        "Nemo bis",
-                       "Suyog"
+                       "Suyog",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "दुव्यांचे अधोरेखन:",
        "nstab-template": "साचा",
        "nstab-help": "साहाय्य पान",
        "nstab-category": "वर्ग",
+       "mainpage-nstab": "मुख्य पान",
        "nosuchaction": "अशी कृती अस्तित्वात नाही",
        "nosuchactiontext": "URL ने नमूद केलेली कृती चुकीची आहे.\nतुम्ही कदाचित URL चुकीची दिली असेल, किंवा चुकीच्या दुव्यावर टिचकी दिली असेल.\nकदाचित, ही कृती {{SITENAME}} वापरत असलेल्या सॉफ्टवेअर मधील गणकदोष \nसुद्धा दर्शवीत असेल.",
        "nosuchspecialpage": "असे कोणतेही विशेष पृष्ठ अस्तित्वात नाही",
        "viewsource": "स्रोत पहा",
        "viewsource-title": "$1 चा उगम बघा",
        "actionthrottled": "कृती नियामक(थ्रॉटल) केली",
-       "actionthrottledtext": "à¤\86à¤\82तरà¤\9cाल-à¤\9aिà¤\96लणà¥\80 à¤µà¤¿à¤°à¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(à¤\85à¤\81à¤\9fà¥\80 à¤¸à¥\8dपà¥\85म à¤®à¥\87à¤\9dर ), à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न, à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धित à¤\95रणà¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87, à¤\86णि à¤\86पण à¤¯à¤¾ à¤®à¤°à¥\8dयादà¥\87à¤\9aà¥\87 à¤\89लà¥\8dलà¤\82à¤\98न à¤\95à¥\87लà¥\87 à¤\86हà¥\87. à¤\95à¥\83पया à¤¥à¥\8bडà¥\8dया à¤µà¥\87ळानà¥\87 पुन्हा प्रयत्न करा.",
+       "actionthrottledtext": "à¤\85पशबà¥\8dद-विरà¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(à¤\85à¤\81à¤\9fà¥\80-à¤\85बà¥\8dयà¥\81à¤\9c à¤®à¥\87à¤\9dर ),हà¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न, à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धित à¤\95रणà¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87, à¤\86णि à¤\86पण à¤¯à¤¾ à¤®à¤°à¥\8dयादà¥\87à¤\9aà¥\87 à¤\89लà¥\8dलà¤\82à¤\98न à¤\95à¥\87लà¥\87 à¤\86हà¥\87. à¤\95à¥\83पया à¤\95ाहà¥\80 à¤®à¤¿à¤¨à¥\80à¤\9fाà¤\82नà¤\82तर पुन्हा प्रयत्न करा.",
        "protectedpagetext": "हे पान बदल अथवा इतर कृती होऊ नयेत म्हणून सुरक्षित केले आहे.",
        "viewsourcetext": "तुम्ही या पानाचा स्रोत पाहू शकता व प्रत करू शकता:",
        "viewyourtext": "तुम्ही या पानाची, '''तुमची संपादने''' पाहू शकता व त्याची प्रत करू शकता:",
        "createacct-captcha": "सुरक्षा तपासणी",
        "createacct-imgcaptcha-ph": "वर दिसत असलेला मजकूर येथे टाका",
        "createacct-submit": "आपले खाते निर्माण करा",
-       "createacct-another-submit": "दà¥\81सरà¥\87 à¤¨à¤µà¥\80न à¤\96ातà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रा",
+       "createacct-another-submit": "खाते तयार करा",
        "createacct-benefit-heading": "{{SITENAME}} हे आपल्यासारख्याच लोकांनी बनविलेले आहे.",
        "createacct-benefit-body1": "{{PLURAL:$1|edit|संपादने}}",
        "createacct-benefit-body2": "{{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-emailsent": "जर हा आपल्या खात्याचा नोंदणिकृत विपत्रपत्ता असेल तर, परवलीच्या शब्दाच्या पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात येईल.",
        "passwordreset-emailsent-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे जे खाली दर्शविण्यात आले आहे.",
        "passwordreset-emailerror-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र निर्माण करण्यात आले, जे खाली दर्शविण्यात आले आहे.परंतु,{{GENDER:$2|सदस्य}}ला पाठविणे असफल झाले: $1",
-       "changeemail": "à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dता à¤¬à¤¦à¤²ा",
-       "changeemail-text": "आपला ई-मेल पत्त बदलण्यासाठी हे आवेदनपत्र भरा. या बदलाची पुष्टी करण्यासाठी तुम्हाला तुमचा परवलीचा शब्द टाकावा लागेल.",
+       "changeemail": "विपतà¥\8dरपतà¥\8dता à¤¬à¤¦à¤²à¤¾ à¤\95िà¤\82वा à¤¹à¤\9fवा",
+       "changeemail-text": "आपला ई-मेल पत्त बदलण्यासाठी हे आवेदनपत्र भरा. या बदलाची पुष्टी करण्यासाठी तुम्हाला तुमचा परवलीचा शब्द टाकावा लागेल.जर आपणास आपल्या खात्याशी असलेली विपत्रपत्त्याची संलग्नता हटवायची असेल तर,हे आवेदन सादर करतेवेळी नविन विपत्रपत्त्याचा रकाना रिकामा ठेवा.",
        "changeemail-no-info": "हे पान थेट बघण्यासठी तुम्हाला सनोंद-प्रवेशित असावे लागेल.",
        "changeemail-oldemail": "सध्याचा ईमेल पत्ता :",
        "changeemail-newemail": "नवा ईमेल पत्ता:",
        "mergehistory-go": "गोळाबेरीज करण्याजोगी संपादने दाखवा",
        "mergehistory-submit": "आवर्तने एकत्रित करा.",
        "mergehistory-empty": "कोणतेही आवर्तन एकत्रित करता येत नाही.",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|चे|ची}} $3 {{PLURAL:$3|आवर्तन|आवर्तने}} [[:$2]] मध्ये यशस्वीरीत्या एकत्रित केली.",
+       "mergehistory-done": "$1 {{PLURAL:$3|चे|ची}} $3 {{PLURAL:$3|आवर्तन|आवर्तने}} [[:$2]] मध्ये यशस्वीरीत्या एकत्रित केली.",
        "mergehistory-fail": "इतिहासाचे एकत्रीकरण कार्य करू शकत नाही आहे, कृपया पान आणि वेळ प्राचलांची पुनर्तपासणी करा.",
        "mergehistory-no-source": "स्रोत पान $1 अस्तित्वात नाही.",
        "mergehistory-no-destination": "लक्ष्य पान $1  अस्तित्वात नाही.",
        "prefs-watchlist-token": "निरीक्षणसूचीचा बिल्ला:",
        "prefs-misc": "किरकोळ",
        "prefs-resetpass": "परवलीचा शब्द बदला.",
-       "prefs-changeemail": "विपत्रपत्ता बदला",
+       "prefs-changeemail": "विपत्रपत्ता बदला किंवा हटवा",
        "prefs-setemail": "तुमचा ई-मेल पत्ता लिहा.",
        "prefs-email": "विपत्र पर्याय",
        "prefs-rendering": "देखावा",
        "upload-too-many-redirects": "या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत",
        "upload-http-error": "एक एचटीटीपी चूक उद्भवली: $1",
        "upload-copy-upload-invalid-domain": "संक्रमित केलेली महिती अधिक्षेत्रात उपलब्ध नाही.",
+       "foreign-structured-upload-form-label-own-work": "हे माझे स्वत:चे काम आहे",
        "backend-fail-stream": "$1 या संचिकेचा स्त्रोत शोधता आला नाही.",
        "backend-fail-backup": "$1 या संचिकेची आधारप्रत बनविता आली नाही.",
        "backend-fail-notexists": "$1 ही संचिका अस्तित्वात नाही.",
        "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": "वगळा",
        "movepagetext": "खालील अर्ज हा एखाद्या लेखाचे शीर्षक बदलण्यासाठी वापरता येईल. खालील अर्ज भरल्यानंतर लेखाचे शीर्षक बदलले जाईल तसेच त्या लेखाचा सर्व इतिहास हा नवीन लेखामध्ये स्थानांतरित केला जाईल.\nजुने शीर्षक नवीन शीर्षकाला पुनर्निर्देशित करेल.\nजुन्या शीर्षकाला असलेले दुवे बदलले जाणार नाहीत, तरी तुम्हाला विनंती आहे की स्थानांतरण केल्यानंतर\n[[Special:DoubleRedirects|दुहेरी]] अथवा [[Special:BrokenRedirects|मोडकी]] पुनर्निर्देशने तपासावीत.\nचुकीचे दुवे टाळण्याची जबाबदारी सर्वस्वी तुमच्यावर राहील.\n\nजर नवीन शीर्षकाचा लेख अस्तित्वात असेल तर स्थानांतरण होणार '''नाही'''.\nपण जर नवीन शीर्षकाचा लेख हा रिकामा असेल अथवा पुनर्निर्देशन असेल (म्हणजेच त्या लेखाला जर संपादन इतिहास नसेल) तर स्थानांतरण होईल. याचा अर्थ असा की जर काही चूक झाली तर तुम्ही पुन्हा जुन्या शीर्षकाकडे स्थानांतरण करू शकता.\n\n'''सूचना!'''\nस्थानांतरण केल्यास एखाद्या महत्वाच्या लेखामध्ये अनपेक्षित बदल होऊ शकतात. तुम्हाला विनंती आहे की तुम्ही पूर्ण काळजी घ्या व होणारे परिणाम समजावून घ्या.\nजर तुम्हाला शंका असेल तर प्रबंधकांशी संपर्क करा.",
        "movepagetext-noredirectfixer": "खालील अर्ज हा एखाद्या लेखाचे शीर्षक बदलण्यासाठी वापरता येईल. खालील अर्ज भरल्यानंतर लेखाचे शीर्षक बदलले जाईल तसेच त्या लेखाचा सर्व इतिहास हा नवीन लेखामध्ये स्थानांतरित केला जाईल.\n\nजुने शीर्षक नवीन शीर्षकाकडे पुनर्निर्देशित करेल.\n\n[[Special:DoubleRedirects|दुहेरी]] अथवा [[Special:BrokenRedirects|मोडकी]] पुनर्निर्देशनांकरीता तपासण्याची काळजी घ्या.\nउपलब्ध दुवे  जिथे उघडणे अभिप्रेत होते तसेच उघडतील याची तुम्ही जबाबदारी घेत आहात\n\nजर नवीन शीर्षकाचा लेख अस्तित्वात असेल तर स्थानांतरण होणार '''नाही'''.\nपण जर नवीन शीर्षकाचा लेख हा रिकामा असेल अथवा पुनर्निर्देशन असेल (म्हणजेच त्या लेखाला जर संपादन इतिहास नसेल) तर स्थानांतरण होईल. याचा अर्थ असा की जर काही चूक झाली तर तुम्ही पुन्हा जुन्या शीर्षकाकडे स्थानांतरण करू शकता.\n<strong>ईशारा!</strong>\nअसे केल्याने एखाद्या महत्वाच्या/लोकप्रीय लेखामध्ये अनपेक्षित आणि महत्वाचे बदल होऊ शकतात. तुम्हाला विनंती आहे की तुम्ही पूर्ण काळजी घ्या व होणारे परिणाम समजावून घ्या.\nजर तुम्हाला शंका असेल तर प्रचालक/प्रबंधकांशी संपर्क करा.",
        "movepagetalktext": "संबंधित चर्चा पृष्ठ याबरोबर स्थानांतरीत होणार नाही '''जर:'''\n* तुम्ही पृष्ठ दुसऱ्या नामविश्वात स्थानांतरीत करत असाल\n* या नावाचे चर्चा पान अगोदरच अस्तित्वात असेल तर, किंवा\n* खालील चौकटपेटी (चेकबॉक्स) रिकामी ठेवली तर.\n\nया बाबतीत तुम्हाला स्वतःला ही पाने एकत्र करावी लागतील.",
-       "movearticle": "पृष्ठाचे स्थानांतरण",
        "moveuserpage-warning": "'''सावधान:''' आपण एक सदस्य पान स्थलांतरित करत आहात. कृपया लक्षात घ्या की, फक्त हे पान स्थलांतरित होइल, सदस्य नाम बदलले जाणार नाही.",
        "movenologintext": "पान स्थानांतरित करण्यासाठी तुम्ही नोंदीकृत सदस्य हवे व तुम्हाला [[Special:UserLogin|सनोंद-प्रवेश]] करावा लागेल.",
        "movenotallowed": "{{SITENAME}}वरील पाने स्थानांतरीत करण्याची आपल्यास परवानगी नाही.",
        "movenotallowedfile": "तुम्हाला संचिका स्थानांतरीत करण्याची परवानगी नाही.",
        "cant-move-user-page": "तुम्हाला सदस्यपान स्थानांतरीत करण्याची परवानगी नाही.(उपपानाव्यतिरिक्त)",
        "cant-move-to-user-page": "तुम्हाला एखाद्या पानास सदस्य पानांवर (सदस्य उप-पाने सोडून) घेऊन जाण्यास परवानगी नाही.",
-       "newtitle": "नवीन शीर्षकाकडे:",
+       "newtitle": "नवीन शीर्षक:",
        "move-watch": "स्रोत पान व लक्ष  पानांवर निगराणी ठेवा",
        "movepagebtn": "स्थानांतरण करा",
        "pagemovedsub": "स्थानांतरण यशस्वी",
        "api-error-badaccess-groups": "आपणास ह्या विकिवर संचिका चढवण्याची परवानगी नाही",
        "api-error-badtoken": "अंतर्गत चूक: अयोग्य टोकन",
        "api-error-copyuploaddisabled": "या विदागारावर 'संकेतस्थळावरील संचिका चढविणे' अक्षम करण्यात आले आहे.",
-       "api-error-duplicate": "या संकेतस्थळावर यासारखाच आशय असलेली {{PLURAL:$1|संचिका आहे [$2 दुसरी संचिका]| [$2 दुसऱ्या संचिका]}} आहेत.",
-       "api-error-duplicate-archive": "{{PLURAL:$1| [$2 another file]| [$2 some other files]}} हे याच नावाने साईट वर आहे आणि   पान {{PLURAL:$1|it was|they were}} वगळले गेले आहे",
-       "api-error-duplicate-archive-popup-title": "नक्कल {{PLURAL:$1|संचिका|संचिका}} ज्या पूर्वीच वगळल्या आहेत",
-       "api-error-duplicate-popup-title": "प्रतिरूपक {{PLURAL:$1|संचिका|संचिका}}",
+       "api-error-duplicate": "या संकेतस्थळावर यासारखाच आशय असलेली {{PLURAL:$1|संचिका आहे दुसरी संचिका| दुसऱ्या संचिका}} आहेत.",
+       "api-error-duplicate-archive": "{{PLURAL:$1| another file| some other files}} हे याच नावाने साईट वर आहे आणि   पान {{PLURAL:$1|it was|they were}} वगळले गेले आहे",
        "api-error-empty-file": "तुम्ही प्रस्तुत केलेली संचिका रिकामी होती.",
        "api-error-emptypage": "नवीन आणि मोकळी पाने बनवायला परवानगी नाही",
        "api-error-fetchfileerror": "अंतर्गत चूक: फाइल मिळवतांना काहीतरी चूक झाली आहे",
index 1a7d7d9..68dbf21 100644 (file)
@@ -19,7 +19,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Pizza1016",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Garis bawah pautan:",
        "mergehistory-go": "Tunjukkan suntingan yang boleh digabungkan",
        "mergehistory-submit": "Gabungkan semakan",
        "mergehistory-empty": "Tiada semakan yang boleh digabungkan",
-       "mergehistory-success": "$3 semakan bagi [[:$1]] telah digabungkan ke dalam [[:$2]].",
+       "mergehistory-done": "$3 semakan bagi $1 telah digabungkan ke dalam [[:$2]].",
        "mergehistory-fail": "Gagal melaksanakan penggabungan sejarah, sila semak semula laman tersebut dan parameter waktu.",
        "mergehistory-fail-toobig": "Tidak dapat melakukan gabungan sejarah sebab lebih daripada had $1 semakan perlu dipindahkan.",
        "mergehistory-no-source": "Laman sumber $1 tidak wujud.",
        "filerevert-legend": "Balikkan fail",
        "filerevert-intro": "<span class=\"plainlinks\">Anda sedang menmbalikkan '''[[Media:$1|$1]]''' kepada [$4 versi pada $3, $2].</span>",
        "filerevert-comment": "Sebab:",
-       "filerevert-defaultcomment": "Dibalikkan kepada versi pada $2, $1",
+       "filerevert-defaultcomment": "Dibalikkan kepada versi pada $2, $1 ($3)",
        "filerevert-submit": "Balikkan",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' telah dibalikkan kepada [$4 versi pada $3, $2].</span>",
        "filerevert-badversion": "Tiada versi tempatan bagi fail ini dengan cap waktu yang dinyatakan.",
        "movepagetext": "Menggunakan borang di bawah akan menukar nama halaman dan memindahkan segala sejarahnya kepada nama baru itu.\n\nTajuk yang lama akan menjadi halaman lencongan kepada tajuk baru.\nAnda boleh mengemaskinikan lencongan yang menghala ke tajuk asal secara automatik.\nJika anda memilih untuk tidak berbuat demikian, tolong semak untuk mencari lencongan [[Special:DoubleRedirects|berganda]] atau [[Special:BrokenRedirects|terputus]].\nAnda dipertanggungjawabkan untuk memastikan agar semua pautan tetap menghala ke tempat yang sepatutnya.\n\nSila ingat bahasa halaman '''tidak''' akan dipindahkan jika tajuk barunya sudah diambil oleh halaman yang sedia ada, melainkan halaman yang sedia ada tersebut merupakan lencongan tanpa sebarang sejarah suntingan.\nErtinya, anda boleh menukar kembali nama halaman ke nama yang sebelumnya jika anda terbuat silap, tetapi anda tidak boleh menulis ganti halaman yang sedia ada.\n\n'''Amaran!'''\nTindakan ini boleh mendatangkan perubahan yang drastik dan tidak dijangka untuk halaman yang popular; sila pasti bahawa anda memahami akibatnya sebelum meneruskan.",
        "movepagetext-noredirectfixer": "Borang di bawah akan menamakan semula sesebuah laman, memindahkan kesemua sejarahnya ke nama baru.\nNama lamanya akan menjadi sebuah laman lencongan ke laman baru tadi.\nPastikan [[Special:DoubleRedirects|lencongan berganda]] atau [[Special:BrokenRedirects|rosak]] sudah diperiksa.\nAnda bertanggungjawab memastikan pautan-pautan sampai ke tujuan yang sepatutnya.\n\nSila maklum bahawa laman tadi '''tidak''' akan dipindahkan sekiranya laman dengan tajuk yang baru tadi telah wujud, melainkan ia kosong atau sebuah pelencongan dan tiada sejarah suntingan lampau.\nIni bermakna anda boleh menamakan semula sesebuah laman balik kepada nama asalnya jika anda melakukan kesilapan, dan anda tidak boleh menulis ganti sebuah laman yang sudah wujud.\n\n'''AMARAN!'''\nTindakan ini boleh menjadi perubahan yang tidak dijangka dan drastik bagi laman popular;\nsila pastikan anda faham akibat yang mungkin timbul sebelum meneruskannya.",
        "movepagetalktext": "Laman perbincangan yang berkaitan, jika ada, akan dipindahkan bersama-sama laman ini secara automatik '''kecuali''':\n* Sebuah laman perbincangan dengan nama baru telah pun wujud, atau\n* Anda membuang tanda kotak di bawah.\n\nDalam kes tersebut, anda terpaksa melencongkan atau menggabungkan laman secara manual, jika perlu.",
-       "movearticle": "Pindahkan laman:",
        "moveuserpage-warning": "'''Amaran:''' Anda sudah hendak memindahkan suatu laman pengguna. Sila ambil perhatian bahawa hanya laman tersebut akan dipindahkan dan nama pengguna yang berkenaan ''tidak'' berubah.",
        "movecategorypage-warning": "<strong>Amaran:</strong> Anda hendak memindahkan sebuah laman kategori. Sila ambil perhatian bahawa hanya laman akan dipindahkan dan sebarang laman dalam kategori laman <em>tidak</em> akan dikategorikan semula ke dalam yang baru.",
        "movenologintext": "Anda mesti [[Special:UserLogin|log masuk]] terlebih dahulu untuk memindahkan laman.",
        "api-error-badaccess-groups": "Anda tidak dibenarkan memuat naik fail di wiki ini.",
        "api-error-badtoken": "Ralat dalaman: token tak elok.",
        "api-error-copyuploaddisabled": "Ciri memuat naik melalui URL dimatikan di pelayan ini.",
-       "api-error-duplicate": "Di tapak ini sudah ada {{PLURAL:$1|[$2 satu fail lain]|[$2 fail-fail lain]}} yang sama kandungannya.",
-       "api-error-duplicate-archive": "Di tapak ini pernah ada {{PLURAL:$1|[$2 satu fail lain]|[$2 fail-fail lain]}} yang sama kandungannya, tetapi telah dihapuskan.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fail|Fail-fail}} pendua yang sudah dihapuskan",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fail|Fail-fail}} pendua",
+       "api-error-duplicate": "Di tapak ini sudah ada {{PLURAL:$1|satu fail lain|fail-fail lain}} yang sama kandungannya.",
+       "api-error-duplicate-archive": "Di tapak ini pernah ada {{PLURAL:$1|satu fail lain|fail-fail lain}} yang sama kandungannya, tetapi telah dihapuskan.",
        "api-error-empty-file": "Fail yang anda serahkan adalah kosong.",
        "api-error-emptypage": "Anda tidak dibenarkan membuat laman baru yang kosong.",
        "api-error-fetchfileerror": "Ralat dalaman: ada malasah ketika mengambil fail itu.",
index a8b84f9..18eb177 100644 (file)
@@ -10,7 +10,8 @@
                        "아라",
                        "CharlieTheCabbie",
                        "Leli Forte",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Ħoloq sottolinjati:",
        "mergehistory-go": "Uri modifiki li jistgħu jiġu magħquda",
        "mergehistory-submit": "Waħħad ir-reviżjonijiet",
        "mergehistory-empty": "L-Ebda reviżjoni tista' tiġi magħquda.",
-       "mergehistory-success": "$3 {{PLURAL:$3|reviżjoni|reviżjonijiet}} ta' [[:$1]] twaħħdu ma' [[:$2]] b'suċċess.",
+       "mergehistory-done": "$3 {{PLURAL:$3|reviżjoni|reviżjonijiet}} ta' $1 twaħħdu ma' [[:$2]] b'suċċess.",
        "mergehistory-fail": "Mhux possibli li jitwaħħdu l-istejjer, jekk jogħġbok ivverifika l-paġna u l-parametri tal-ħin.",
        "mergehistory-no-source": "Paġna tas-sors $1 ma teżistix.",
        "mergehistory-no-destination": "Paġna tad-destinazzjoni $1 ma teżistix.",
        "filerevert-legend": "Erġa' lura għall-fajl",
        "filerevert-intro": "Inti qiegħed terġa lura għal fajl '''[[Media:$1|$1]]''' fil-[verżjoni $4 minn $3, $2].",
        "filerevert-comment": "Raġuni:",
-       "filerevert-defaultcomment": "Irkuprata l-verżjoni ta' $2, $1",
+       "filerevert-defaultcomment": "Irkuprata l-verżjoni ta' $2, $1 ($3)",
        "filerevert-submit": "Ġib lura",
        "filerevert-success": "'''Il-fajl [[Media:$1|$1]]''' ġie irkuprat lura għall-[$4 verżjoni tal-$2, $3].",
        "filerevert-badversion": "M'hemmx verżjoni lokali tal-fajl aktar riċenti b'timbru tal-ħin rikjest.",
        "movepagetext": "L-użu tal-formola t'hawn taħt, twassal f'isem ġdid għall-paġna, tmexxija tal-kronoloġija kollha tagħha għall-isem il-ġdid.<br />\nIt-titlu l-antik se jsir paġna ta' riindirizz għat-titlu l-ġdid.<br />\nTista' taġġorna riindirizzi li jippuntaw awtomatikament lejn l-isem oriġinali.<br />\nTista' tagħżel li ma tagħmilx dan, imma ftakar biex tivverifika li t-tmexxija li saret ma ħolqitx riindirizzi [[Special:DoubleRedirects|doppji]] jew [[Special:BrokenRedirects|ħżiena]]. Inti responsabbli li tkun ċert li l-ħoloq jibqgħu korretti.\n\nGħandek tkun taf li l-paġna '''mhux''' se titmexxa jekk hemm diġà paġna fit-titlu l-ġdid, sakemm tkun vojta jew xi riindirizz u m'għandha ebda kronoloġija ta' modifika passata. Fil-każ ta' tmexxija ħażina tista' tmur lura mal-ewwel għat-titlu l-antik, u mhuwiex possibli li tikteb bi żball fuq paġna diġà eżistenti.\n\n'''ATTENZJONI!'''\nDin tista' tkun bidla drastika u mhux mistenniha għal paġna popolari; jekk jogħġbok kun ċert li tifhem il-konsegwenzi ta' din qabel ma tkompli.",
        "movepagetext-noredirectfixer": "Bl-użu tal-formola t'hawn taħt inti tista' ssemmi paġna mill-ġdid, bil-kronoloġija tal-oriġinali timxi fuq il-ġdida.\nIt-titlu l-antik jiġi paġna ta' rindirizz lejn it-titlu l-ġdid.\nKun żgur li tiċċekkja għal [[Special:DoubleRedirects|rindirizzi doppji]] jew [[Special:BrokenRedirects|miksura]].\nInti responsabbli li tiżgura li l-ħoloq ikomplu jippuntaw fejn suppost immorru.\n\nKun af li l-paġna '''mhux''' se titmexxa jekk diġà hemm paġna bit-titlu l-ġdid, sakemm din tkun vojta jew rindirizz u nieqsa minn kwalunkwe modifika.\nDan ifisser li inti tista' ssemmi paġna lura lejn l-isem oriġinali jekk tara li ħadt żball, u ma tistasx tikteb fuq paġna diġà eżistenti.\n\n'''Twissija!'''\nDin tista' tkun bidla drastika għal paġna populari; kun ċert li tifhem il-konsegwenzi qabel ma tkompli.",
        "movepagetalktext": "Il-Paġna korrispondenti tad-diskussjoni se tiġi awtomatikament imċaqilqa flimkien magħha '''sakemm:'''\n* Paġna mhux vojta ta' diskussjoni ġa teżisti taħt l-isem il-ġdid.\n* Ma tagħżilx il-kaxxa t'hawn taħt.\n\nF'dawn il-każi, inti trid iċaqlaq jew tagħqad il-paġna manwalment jekk dan huwa mixtieq.",
-       "movearticle": "Ċaqlaq il-paġna:",
        "moveuserpage-warning": "'''Twissija:''' Inti se tmexxi paġna tal-utent. Kun af li hi l-paġna biss li se titmexxa. L-utent ''mhux'' se jitmexxa.",
        "movecategorypage-warning": "<strong>Attenzjoni:</strong> Se tmexxi kategorija. Kun af li l-paġna biss se titmexxa u kwalunkwe paġna fil-kategorija l-qadima <em>mhumiex</em> se jiġu kategorizzati fil-kategorija l-ġdida.",
        "movenologintext": "Trid [[Special:UserLogin|tidħol]] bħalha utent reġistrat sabiex tkun tista' iċaqlaq din il-paġna.",
        "api-error-badaccess-groups": "Mintix permess li ttella' fajls fuq din il-wiki.",
        "api-error-badtoken": "Żball intern: <em>Token</em> ħażin.",
        "api-error-copyuploaddisabled": "It-tlugħ ta' fajls bl-użu tal-URL mhuwiex permess fuq dan is-server.",
-       "api-error-duplicate": "Hemm {{PLURAL:$1|[$2 fajl ieħor]|[$2 xi fajls oħra]}} diġà fuq dan is-sit bl-istess kontenut.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fajl duplikat li diġà ġie mħassar|Fajls duplikat li diġà ġew imħassra}}.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fajl duplikat|Fajls duplikati}}.",
+       "api-error-duplicate": "Hemm {{PLURAL:$1|fajl ieħor|xi fajls oħra}} diġà fuq dan is-sit bl-istess kontenut.",
        "api-error-empty-file": "Il-fajl li bgħatt kien vojt.",
        "api-error-emptypage": "Mhuwiex permess il-ħolqien ta' paġna ġdida vojta.",
        "api-error-fetchfileerror": "Żball intern: Kien hemm problema waqt il-kisba tal-fajl.",
index 432b416..216e2f1 100644 (file)
@@ -10,7 +10,9 @@
                        "Spacebirdy",
                        "محک",
                        "아라",
-                       "Alirezaaa"
+                       "Alirezaaa",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "پیوندون زیر خط دکشی بواشه",
        "api-error-badaccess-groups": "شما اجازهٔ باربی‌یشتن پرونده‌ها ره این ویکی دله ندارنی.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتبائه (Bad token).",
        "api-error-copyuploaddisabled": "باربی‌یشتن با استفاده از نشونی اینترنتی این کارساز دله غیرفعاله.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 پروندهٔ دیگه‌یی]|[$2 چن پروندهٔ دیگه]}} وب‌گاه دله با محتوای ات‌تی دیی‌یه.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 پروندهٔ دیگه‌یی]|[$2 چن پروندهٔ دیگه]}} وب‌گاه دله با محتوای اتجور وجود داشته، ولی حذف {{PLURAL:$1|بیی‌یه|بیی‌نه}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|پروندهٔ|پرونده‌ئون}} تکراری که اسا حذف بیی‌نه",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|پرونده|پرونده‌ئون}} تکراری",
+       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگه‌یی|چن پروندهٔ دیگه}} وب‌گاه دله با محتوای ات‌تی دیی‌یه.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|پروندهٔ دیگه‌یی|چن پروندهٔ دیگه}} وب‌گاه دله با محتوای اتجور وجود داشته، ولی حذف {{PLURAL:$1|بیی‌یه|بیی‌نه}}.",
        "api-error-empty-file": "پرونده‌ای که شما برسنینی خالی بی‌یه.",
        "api-error-fetchfileerror": "خطای داخلی: زمون بییتن پرونده، اتا چی درست پیش نشی‌یه.",
        "api-error-file-too-large": "پرونده‌ای که شما برسنینی خله خله گت بی‌یه.",
index 7fb21a3..f00d523 100644 (file)
        "tog-diffonly": "Ahmo tiquittāz zāzanilli ītlapiyaliz ahneneuhquilitzīntlan",
        "tog-showhiddencats": "Mà monèxtìkàn in tlatlatìltìn tlaìxmatkàtlàlilòmë",
        "underline-always": "Mochipa",
-       "underline-never": "Aīcmah",
+       "underline-never": "Aīc",
        "editfont-monospace": "Cencoyāhualiztli machiyōtlahtōliztli",
        "editfont-sansserif": "Sans-serif machiyōtlahtōliztli",
        "editfont-serif": "Serif machiyōtlahtōliztli",
-       "sunday": "ic cemilhuitl",
-       "monday": "ic ōmilhuitl",
-       "tuesday": "ic ēyilhuitl",
-       "wednesday": "ic nāhuilhuitl",
-       "thursday": "ic mācuīlilhuitl",
-       "friday": "ic chicuacemilhuitl",
-       "saturday": "ic chicōmilhuitl",
-       "sun": "cemilhui",
-       "mon": "ōmilhui",
-       "tue": "ēyilhui",
-       "wed": "nāhuilhui",
-       "thu": "mācuīlilhui",
-       "fri": "chicuacemilhui",
-       "sat": "chicōmilhui",
-       "january": "Àtemòstli",
-       "february": "Iskalli",
-       "march": "Àtlakàwalo",
-       "april": "Tlàkaxipèwalistli",
-       "may_long": "Tosostli",
-       "june": "Toxkatl",
-       "july": "Tèkòilwitl",
-       "august": "Tlaxòchimàko",
-       "september": "Xokowetzi",
-       "october": "Teòtlêko",
-       "november": "Tepèilwitl",
-       "december": "Pànketzalistli",
-       "january-gen": "ic cē mētztli",
-       "february-gen": "ic ōme mētztli",
-       "march-gen": "ic ēyi mētztli",
-       "april-gen": "ic nāuhtetl mētztli",
-       "may-gen": "ic mācuīlli mētztli",
-       "june-gen": "ic chicuacen mētztli",
-       "july-gen": "ic chicōme mētztli",
-       "august-gen": "ic chicuēyi mētztli",
-       "september-gen": "ic chiucnāhui mētztli",
-       "october-gen": "ic mahtlāctetl mētztli",
-       "november-gen": "ic mahtlāctetl oncē mētztli",
-       "december-gen": "ic mahtlāctetl omōme mētztli",
-       "jan": "ic cē",
-       "feb": "ic ōme",
-       "mar": "ic ēyi",
-       "apr": "ic nāuh",
-       "may": "ic mācuīl",
-       "jun": "ic chicuacē",
-       "jul": "ic chicōme",
-       "aug": "ic chicuēyi",
-       "sep": "ic chiucnāuh",
-       "oct": "ic mahtlāc",
-       "nov": "ic mahtlāctli oncē",
-       "dec": "ic mahtlāctli omōme",
+       "sunday": "Īccemilhuitl",
+       "monday": "Īcōmilhuitl",
+       "tuesday": "Īcyēyilhuitl",
+       "wednesday": "Īcnāhuilhuitl",
+       "thursday": "Īcmācuīlilhuitl",
+       "friday": "Īcchicuacemilhuitl",
+       "saturday": "Īcchicōmilhuitl",
+       "sun": "ilhui",
+       "mon": "ilhui",
+       "tue": "ilhui",
+       "wed": "ilhui",
+       "thu": "ilhui",
+       "fri": "ilhui",
+       "sat": "ilhui",
+       "january": "Īccēmētztli",
+       "february": "Īcōmēmētztli",
+       "march": "Īcyēyimētztli",
+       "april": "Īcnāuhtetlmētztli",
+       "may_long": "Īcmācuīllimētztli",
+       "june": "Īcchicuacemmētztli",
+       "july": "Īcchicōmemētztli",
+       "august": "Īcchicuēyimētztli",
+       "september": "Īcchiucnāhuimētztli",
+       "october": "Īcmahtlāctlimētztli",
+       "november": "Īcmahtlāctlioncēmētztli",
+       "december": "Īcmahtlāctliomōmemētztli",
+       "january-gen": "Īccēmētztli",
+       "february-gen": "Īcōmemētztli",
+       "march-gen": "Īcyēyimētztli",
+       "april-gen": "Īcnāuhtetlmētztli",
+       "may-gen": "Īcmācuīllimētztli",
+       "june-gen": "Īcchicuacemmētztli",
+       "july-gen": "Īcchicōmemētztli",
+       "august-gen": "Īcchicuēyimētztli",
+       "september-gen": "Īcchiucnāhuimētztli",
+       "october-gen": "Īcmahtlāctetlmētztli",
+       "november-gen": "Īcmahtlāctetloncēmētztli",
+       "december-gen": "Īcmahtlāctetlomōmemētztli",
+       "jan": "1 Mētz",
+       "feb": "2 Mētz",
+       "mar": "3 Mētz",
+       "apr": "4 Mētz",
+       "may": "5 Mētz",
+       "jun": "6 Mētz",
+       "jul": "7 Mētz",
+       "aug": "8 Mētz",
+       "sep": "9 Mētz",
+       "oct": "10 Mētz",
+       "nov": "11 Mētz",
+       "dec": "12 Mētz",
        "january-date": "Īccēmētztli $1",
        "february-date": "Īcōmemētztli $1",
        "march-date": "Īquēyimētztli $1",
        "category-file-count": "{{PLURAL:$2|Inìn tlaìxmatkàtlàlilòtl san kipia|Inìn tlaìxmatkàtlalilòtl kimpia {{PLURAL:$1|inìn èwalli|inîkë $1 èwaltìn}}, ìwikpa $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|Inìn tlâkuilòlèwalli kä|Inîkë $1 tlâkuilòlèwaltìn katêkë}} ìpan inìn tlaìxmatkàtlàlilòtl.",
        "listingcontinuesabbrev": "niman",
-       "about": "Ītechpa",
+       "about": "Ītechcopa",
        "article": "Tlâkuilòpilli",
        "newwindow": "(Motlapoāz cē yancuīc tlanexillōtl)",
-       "cancel": "Ticcuepāz",
+       "cancel": "Ticcāhuaz",
        "moredotdotdot": "Huehca ōmpa...",
        "mypage": "Noāmauh",
        "mytalk": "Notēixnāmiquiliz",
        "and": "&#32;īhuān",
        "qbfind": "Tlatēmōz",
        "qbbrowse": "Titlatēmōz",
-       "qbedit": "Ticpatlāz",
+       "qbedit": "Ticpatlaz",
        "qbpageoptions": "Inīn zāzanilli",
        "qbmyoptions": "Nozāzanil",
        "faq": "Zan īc tētlatlanīliztli",
        "searchbutton": "Tlatēmōz",
        "go": "Yāuh",
        "searcharticle": "Yāuh",
-       "history": "tlahcuilōlloh",
-       "history_short": "Tlahcuilōlloh",
+       "history": "Tlaīxtli ītlahtōllo",
+       "history_short": "Tlahtōllōtl",
        "updatedmarker": "ōmoyancuīx īhuīcpa xōcoyōc notlahpololiz",
        "printableversion": "Tepoztlahcuilōlli",
        "permalink": "Mochipa tzonhuiliztli",
        "edit-local": "Ticpatlaz nicān tlahtōlli",
        "create": "Ticchīhuaz",
        "create-local": "Ticahxiltīz nicān tlahtōlli",
-       "editthispage": "Ticpatlaz inīn zāzanilli",
-       "create-this-page": "Ticchīhuaz inīn zāzanilli",
+       "editthispage": "Ticpatlaz inīn tlaīxtli",
+       "create-this-page": "Ticchīhuaz inīn tlaīxtli",
        "delete": "Ticpolōz",
-       "deletethispage": "Ticpolōz inīn zāzanilli",
+       "deletethispage": "Ticpolōz inīn tlaīxtli",
+       "undeletethispage": "Ticmāquīxtīz 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}}",
        "protect": "Ticquīxtīz",
        "protectthispage": "Ticquīxtiāz inīn zāzanilli",
        "unprotect": "Ticpatlaz in tlaquīxtīliztli",
        "unprotectthispage": "Ticpatlaz inīn āmatl ītlaquīxtīliz",
-       "newpage": "Yancuīc zāzanilli",
+       "newpage": "Yancuic tlaīxtli",
        "talkpage": "Tictlahtōz inīn zāzaniltechcopa",
-       "talkpagelinktext": "Tèìxnàmikilistli",
+       "talkpagelinktext": "Zānīlli",
        "specialpage": "Nònkuâkìskàtlaìxtlapalli",
        "personaltools": "In tlein nitēquitiltilia",
-       "articlepage": "Xiquittaz in tlahcuilōlli",
+       "articlepage": "Tiquittaz in tlahcuilōlli",
        "talk": "tēixnāmiquiliztli",
        "views": "Tlachiyaliztli",
        "toolbox": "Tlachihchīhualōni",
        "nstab-template": "Nemachiòtl",
        "nstab-help": "Tèpalèwilistli",
        "nstab-category": "Tlaìxmatkàtlàlilòtl",
+       "mainpage-nstab": "Huēyitlaīxtli",
        "nosuchaction": "Ahmo ia tlachīhualiztli",
        "nosuchspecialpage": "Âmò ka inòn nònkuâkìskàtlaìxtlapalli",
        "nospecialpagetext": "<strong>Tiknẻki sè nònkuâkìskàtlaìxtlapalli tlèn âmò kä.</strong>\n\nKualli tikỉtas sè ìntlapòpòwaltekpànal in nònkuâkìskàtlaìxtlapaltìn ìpan [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Ahcuallōtl",
        "databaseerror": "Tlahcuilōltzintlān īahcuallo",
+       "databaseerror-query": "Tlahtlanilli: $1",
        "laggedslavemode": "Xiquitta: huel ahmo ia achi yancuīc in tlapatlaliztli inīn zāzanilco.",
        "readonly": "Mactzīntlantli tzahtzacticah",
        "missingarticle-rev": "(tlachiyaliztli ītlapōhual: $1)",
        "nologin": "¿Ahmō ticpiya cuentah? '''$1'''.",
        "nologinlink": "Ticchīhuaz cē cuentah",
        "createaccount": "Ticchīhuaz cuentah",
-       "gotaccount": "¿Ye ticpiya cē cuentah? '''$1'''.",
+       "gotaccount": "¿Ye ticpiya cē tlapōhualli? '''$1'''.",
        "gotaccountlink": "Ximocalaqui",
        "createaccountmail": "Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō in tiquēhualtīz in maltzinteyōtl monetitlanizyeyān",
        "createaccountreason": "Tleīpampa:",
        "passwordsent": "Ōmoihuah yancuīc motlahtōlichtacāyo īhuīc mo e-mail (\"$1\").\nOcceppa xicalaqui niman ticmatīz.",
        "mailerror": "Ahcuallōtl e-mailcopa: $1",
        "emailconfirmlink": "Ticchicāhua mo e-mail",
-       "accountcreated": "Cuentah ōmochīuh",
+       "accountcreated": "Tlapōhualli ōmochīuh",
        "accountcreatedtext": "In ītlatequitiltilīllapōhual in [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ōquiyōcoyalo.",
        "createaccount-title": "Cuentah ītlachīhualiz ic {{SITENAME}}",
        "loginlanguagelabel": "Tlâtòlli: $1",
        "edit-gone-missing": "Ahmo huelīti yancuīya zāzanilli.\nHueliz ōmopolo.",
        "edit-conflict": "Tlapatlaliztli yāōyōtōn",
        "edit-already-exists": "Ahmo mohuelīti mochīhua yancuīc zāzanilli.\nYe ia.",
+       "content-model-javascript": "JavaScript",
        "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",
        "email": "E-mail",
        "prefs-help-realname": "Melāhuac motōca.\nIntlā ticnequi, tlācah quimatīzqueh motequi.",
        "prefs-help-email-required": "Tihuīquilia quihcuiloa mo e-mailcān.",
+       "prefs-signature": "Motōcā",
        "userrights-user-editname": "Xihcuiloa cē tlatequitiltilīltōcāitl:",
        "editusergroup": "Tiquimpatlāz tlatequitiltilīlli olōlli",
        "userrights-editusergroup": "Tiquimpatlāz tlatequitiltilīlli olōlli",
        "right-edit": "Tiquimpatlāz zāzaniltin",
        "right-createpage": "Ticchīhuāz zāzaniltin (ahmo tēixnāmiquiliztli zāzaniltin)",
        "right-createtalk": "Ticchīhuāz tēixnāmiquiliztli zāzaniltin",
-       "right-createaccount": "Tiquinchīhuāz yancuīc cuentah",
+       "right-createaccount": "Ticchīhuaz yancuic tlapōhualli",
        "right-minoredit": "Ticpatlāz quemeh tlapatlalitzintli",
        "right-move": "Tiquinzacāz zāzaniltin",
        "right-move-subpages": "Tiquinzacāz zāzaniltin auh īzāzaniltōn",
        "action-block": "tiquitzacuilīz inīn tlatequitiltilīlli",
        "action-userrights": "tiquimpatlāz mochi tlatequitiltilīlli huelītiliztli",
        "nchanges": "$1 {{PLURAL:$1|tlapatlaliztli}}",
+       "enhancedrc-history": "tlahtōllōtl",
        "recentchanges": "Yancuīc tlapatlaliztli",
        "recentchanges-legend": "Yancuīc tlapatlaliztechcopa tlanequiliztli",
        "recentchanges-summary": "Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.",
        "savefile": "Quipiyāz tlahcuilōlli",
        "uploaddisabled": "Ahmo mohuelīti tlahcuilōlquetzā",
        "uploaddisabledtext": "Ahmo huelīti moquetzazqueh tlahcuilōlli.",
+       "upload-source": "Mēyalihcuilōlli",
        "sourcefilename": "Tōcāhuīcpa:",
+       "sourceurl": "Mēyal-URL:",
        "destfilename": "Tōcāhuīc:",
        "watchthisupload": "Tictlachiyāz inīn zāzanilli",
        "upload-success-subj": "Cualli quetzaliztli",
+       "upload-form-label-infoform-name": "Tōcāitl",
+       "upload-form-label-usage-filename": "Ihcuilōlli ītōcā",
        "upload_source_file": " (cē tlahcuilōlli mochīuhpōhualhuazco)",
        "listfiles_search_for": "Tlatēmōz mēdiatl tōcācopa:",
        "imgfile": "īxiptli",
        "listfiles_name": "Tōcāitl",
        "listfiles_user": "Tlatequitiltilīlli",
        "listfiles_size": "Octacayōtl (bytes)",
+       "listfiles_count": "Cuepaliztli",
+       "listfiles-latestversion-yes": "Quēmah",
+       "listfiles-latestversion-no": "Ahmō",
        "file-anchor-link": "Īxiptli",
        "filehist": "Tlahcuilōlli tlahcuilōlloh",
        "filehist-deleteall": "tiquimpolōz mochīntīn",
        "deadendpages": "Ahtlaquīzaliztli zāzaniltin",
        "protectedpages": "Zāzaniltin ōmoquīxti",
        "protectedpages-indef": "Zan ahcāhuitl tlaquīxtiliztli",
+       "protectedpages-page": "Tlaīxtli",
+       "protectedpages-reason": "Tleīpampa",
        "protectedtitles": "Tōcāitl ōmoquīxtih",
        "listusers": "Tlatequitiltilīlli",
        "newpages": "Yancuīc zāzaniltin",
        "delete-edit-reasonlist": "Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa",
        "rollbacklink": "tlacuepāz",
        "rollback-success": "Ōmotlacuep $1 ītlahcuilōl; āxcān achto $2 ītlahcuilōl.",
+       "changecontentmodel-title-label": "Tlaīxtōcāitl",
+       "changecontentmodel-reason-label": "Tleīpampa:",
        "protectedarticle": "ōmoquīxti \"[[$1]]\"",
        "unprotectedarticle": "ōahmoquīxtih «[[$1]]»",
        "prot_1movedto2": "[[$1]] ōmozacac īhuīc [[$2]]",
+       "protectcomment": "Tleīpampa:",
        "protectexpiry": "Tlamiliztli:",
        "protect_expiry_invalid": "Ahcualli tlamiliztli cāhuitl.",
        "protect-default": "Ticmācāhuaz mochintin in tlatequitiltilīltin",
        "undeletebtn": "Ahticpolōz",
        "undeletelink": "tiquittaz/ticpahtīz",
        "undeleteviewlink": "tiquittāz",
+       "undeletecomment": "Tleīpampa:",
        "undelete-search-box": "Tiquintlatēmōz zāzaniltin ōmopolōz",
        "undelete-search-prefix": "Tiquittāz zāzaniltin mopēhua īca:",
        "undelete-search-submit": "Tlatēmōz",
        "ipb-unblock": "Ahtiquitzacuilīz IP nozo tlatequitiltilīlli",
        "unblockip": "Ahtiquitzacuilīz tlatequitiltilīlli",
        "ipblocklist": "Tlatequitiltilīltzacualli",
+       "blocklist-reason": "Tleīpampa",
        "ipblocklist-submit": "Tlatēmōz",
        "infiniteblock": "ahtlamic",
        "expiringblock": "tlami īpan $1 īpan $2",
        "move-page": "Ticzacāz $1",
        "move-page-legend": "Ticzacāz zāzanilli",
        "movepagetext": "Nicān mohcuiloa quemeh ticzacāz cē zāzanilli auh mochi in ītlahcuillōloh īhuīc occē yancuīc ītōca.\nHuēhuehtōcāitl yez tlacuepaliztli yancuīc tōcāhuīc.\nTzonhuiliztli huēhuehzāzanilhuīc ahmo mopatlāz.\nXiquitta ic māca xicchīhua [[Special:DoubleRedirects|ōntlacuepaliztli]] ahnozo [[Special:BrokenRedirects|tzomoc]].\nTitzonhuilizpiyāz.\n\nXicmati in zāzanilli ahmo mozacāz intlā ye ia cē zāzanilli tōcātica, zan cah iztāc zāzanilli ahnozo tlacuepaliztli īca ahmo tlahcuilōlloh.\nQuihtōznequi tihuelītīz ticuepāz cē zāzanilli īhuīc ītlācatōca intlā ahcuallōtl ticchīhuāz, tēl ahmo tihuelītīz occeppa tihcuilōz īpan zāzanilli tlein ia.\n\n'''¡XICPŌHUA!'''\nHueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl auh ahcuallōtl achtopa ticzacāz.",
-       "movearticle": "Ticzacāz tlahcuilōlli",
        "movenotallowed": "Ahmo tihuelīti tiquinzaca zāzaniltin.",
        "newtitle": "Yancuīc tōcāhuīc",
        "move-watch": "Tictlachiyāz inīn zāzanilli",
        "thumbnail-more": "Tiquihuēyiyāz",
        "thumbnail_error": "Aiuhcāyōtl ihcuāc mochīhuaya tepitōntli: $1",
        "import": "Tiquincōhuāz zāzaniltin",
+       "import-interwiki-sourcewiki": "Mēyalhuiqui:",
+       "import-interwiki-sourcepage": "Mēyallaīxtli:",
        "import-interwiki-submit": "Tiquicōhuāz",
        "import-upload-filename": "Tlahcuilōltōcāitl:",
        "importstart": "Motlacōhua zāzaniltin...",
        "importlogpage": "Tiquincōhuāz tlahcuilōlloh",
        "tooltip-pt-userpage": "Notlatequitiltilīlzāzanil",
        "tooltip-pt-mytalk": "Notēixnāmiquiliz",
-       "tooltip-pt-preferences": "Notlaēlēhuiliz",
+       "tooltip-pt-preferences": "Mopanitlatlālīl",
        "tooltip-pt-watchlist": "Zāzaniltin tiquintlachiya ic tlapatlaliztli",
        "tooltip-pt-mycontris": "Notlahcuilōl",
        "tooltip-pt-login": "Tihuelīti timocalaqui, tēl ahmo tihuīquilia.",
        "siteusers": "$1 {{PLURAL:$2|tlatequitiltilīlli}} īpan {{SITENAME}}",
        "spam_reverting": "Mocuepacah īhuīc xōcoyōc tlapatlaliztli ahmo tzonhuilizca īhuīc $1",
        "spam_blanking": "Mochi tlapatlaliztli quimpiyah tzonhuiliztli īhuīc $1, iztāctiliacah",
+       "pageinfo-firstuser": "Tlaīxchīuhqui",
+       "pageinfo-contentpage-yes": "Quēmah",
+       "pageinfo-protect-cascading-yes": "Quēmah",
        "previousdiff": "← Achtopa",
        "nextdiff": "Oc ye cencah yancuīc tlapatlaliztli →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:|zāzanilli|zāzanilli}}",
        "file-info-size": "$1 × $2 pixel; zāzanilli octacayōtl: $3; machiyōtl MIME: $4",
        "file-nohires": "Ahmo ia achi cualli ahmo occē īxiptli.",
-       "show-big-image": "Mochi cuallōtl",
+       "show-big-image": "Tzīntilicihcuilōlli",
        "newimages": "Yancuīc īxipcān",
        "imagelisttext": "Nicān {{PLURAL:$1|mopiya|mopiyah}} '''$1''' īxiptli $2 iuhcopa.",
        "noimages": "Ahtlein ic tlatta.",
index 76b609d..cb73ce4 100644 (file)
        "nstab-template": "Modello",
        "nstab-help": "Ajùto",
        "nstab-category": "Categurìa",
+       "mainpage-nstab": "Paggena prencepale",
        "nosuchaction": "Operazione nun ricanusciuta",
        "nosuchactiontext": "L'azione specificata dint'a l'URL nun è bbona.\nPuò darse ca l'URL fosse stata digitata 'n modo sbagliàto o che fosse stato seguito nu link sbagliàto.\nChesto putesse innecà pùre nu bug dint'a {{SITENAME}}.",
        "nosuchspecialpage": "Chista paggena speciale nun ce sta",
        "viewsource": "Vere sorgente",
        "viewsource-title": "Vere surgente 'e $1",
        "actionthrottled": "Azione ritardata",
-       "actionthrottledtext": "Comme misura anti-spam, site lemmetato 'a ffà st'azione troppe vote dint'a nu curto spazio 'e tiempo, e mò stu lèmmeto è stato superato.\nPe' piacere pruvate n'ata vota dint'a cocche minuto.",
+       "actionthrottledtext": "Comme misura anti-abuse, site lemmetato 'a ffà st'azione troppe vote dint'a nu curto spazio 'e tiempo, e mò stu lèmmeto è stato superato.\nPe' piacere pruvate n'ata vota dint'a cocche minuto.",
        "protectedpagetext": "Sta paggena s'è prutetta pe' ne bloccà 'a mudifeca o n'ata azione.",
        "viewsourcetext": "Putite vedé e copià 'o codece surgiva 'e sta paggena.",
        "viewyourtext": "Putite vedé e copià 'o codice surgiva d' 'e <strong>cagnamiénte vuoste</strong> a sta paggena.",
        "createacct-captcha": "Cuntrollo 'e sicurezza",
        "createacct-imgcaptcha-ph": "Scrivite 'o testo ca vedite ncoppa",
        "createacct-submit": "Cria 'a toja utenza",
-       "createacct-another-submit": "Cria n'atu cunto",
+       "createacct-another-submit": "Cria nu cunto",
        "createacct-benefit-heading": "{{SITENAME}} è fatta 'e perzone comme te.",
        "createacct-benefit-body1": "{{PLURAL:$1|càgnamiento|càgnamiente}}",
        "createacct-benefit-body2": "{{PLURAL:$1|paggena|paggene}}",
        "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": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata.",
+       "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-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 l'indirizzo e-mail",
-       "changeemail-text": "Ghienchete stu modulo pe' cangà l'indirizzo mail d' 'o vuosto. Sarrà necessario nzertà 'a password vosta pe' puté cunfermà stu cagnamiento.",
+       "changeemail": "Cagna o lèva l'indirizzo e-mail",
+       "changeemail-text": "Ghienchete stu modulo pe' cangà l'indirizzo mail d' 'o vuosto. Sarrà necessario nzertà 'a password vosta pe' puté cunfermà stu cagnamiento. Si vuje vulite luvà 'o cullegamento d' 'a mail c' 'o cunto, luvate l'indirizzo e-mail nuovo e lassatevell'abbacante quanno mannarrate stu modulo.",
        "changeemail-no-info": "Avite 'a trasì ('o login) pe ffà l'acciesso a sta paggena direttamente.",
        "changeemail-oldemail": "Indirizzo email 'e mmò:",
        "changeemail-newemail": "Indirizzo e-mail nuovo:",
+       "changeemail-newemail-help": "Stu campo avess'a stà abbacnte si vulite luvà l'indirizzo e-mail. Nun sarrate premmesso 'e rimpizzà na password sperduta e nun ve pigliarrate 'email 'a sta wiki quanno 'o cunto e-mail se luvarrà.",
        "changeemail-none": "(nisciuno)",
        "changeemail-password": "'A password vosta pe' {{SITENAME}}:",
        "changeemail-submit": "Cagna e-mail",
        "permissionserrorstext-withaction": "Nun haje premmesse abbastante pe' $2, {{PLURAL:$1|'o mutivo è chesto|'e mutive so' chiste}}:",
        "recreate-moveddeleted-warn": "'''Attenziò: staje a crià na paggena scancellata già.'''\n\nVire si è bbuono 'e cuntinuà a cagnà sta paggena. L'elenco ch' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' ffà comodo:",
        "moveddeleted-notice": "Sta paggena è stata scancellata.\nL'elenco d' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' n'avé nfurmazione.",
+       "moveddeleted-notice-recent": "Scusate, sta mmasciata è stata scancellata mo mo (dint'a sti 24 ore).\n\nL'aziune 'e scancellazione e spustamento pe' sta paggena so dispunibbele ccà p' 'a cumpretezza.",
        "log-fulllog": "Vide log sano",
        "edit-hook-aborted": "'O cagnamiento è stato annullato 'a 'o «hook».\nNun dette spiegazione nisciuna.",
        "edit-gone-missing": "Nun se può agghiurnà 'a paggena.\nPare ch' 'è stata scancellata.",
        "mergehistory-go": "Vide 'e cagnamiente ca se ponno aunì",
        "mergehistory-submit": "Aunisce 'e verziune",
        "mergehistory-empty": "Nun ce stanno virziune pe' putè ffà l'aunione.",
-       "mergehistory-success": "{{PLURAL:$3|Na virziona 'e [[:$1]] è stata aunita|$3 versiune 'e [[:$1]] so' state aunite}} â cronologgia 'e [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Na virziona 'e $1 è stata aunita|$3 versiune 'e $1 so' state aunite}} â cronologgia 'e [[:$2]].",
        "mergehistory-fail": "Nun se ponno aunì 'e cronologgie. Pe' piacere cuntrullate n'ata vota 'a paggena e li parametre tempurale.",
        "mergehistory-fail-toobig": "Nun se può fà l'aunione d' 'a cronologgia cu nu lémmeto 'e n'ati $1 {{PLURAL:$1|revisione|rivisiune}} 'a cagnà posto.",
        "mergehistory-no-source": "'A paggena d'origgine $1 nun esiste.",
        "prefs-watchlist-token": "Token 'e l'elenco 'e cuntrollo:",
        "prefs-misc": "Varje",
        "prefs-resetpass": "Cagna 'a password",
-       "prefs-changeemail": "Cagna l'indirizzo e-mail",
+       "prefs-changeemail": "Cagna o lèva l'indirizzo e-mail",
        "prefs-setemail": "Mpizza nu ndirizzo e-mail",
        "prefs-email": "Opziune e-mail",
        "prefs-rendering": "Aspetto",
        "group-bot": "Bot",
        "group-sysop": "Ammenistrature",
        "group-bureaucrat": "Burocrate",
-       "group-suppress": "Oversight",
+       "group-suppress": "Soppressure",
        "group-all": "(tutte)",
        "group-user-member": "{{GENDER:$1|utente}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utente autocunfermato|utente autocunfermata|utente autocunfermato/a}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|ammenistratore|ammenistratrice|ammenistratore/trice}}",
        "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
-       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "group-suppress-member": "{{GENDER:$1|suppressure|supprimitrice}}",
        "grouppage-user": "{{ns:project}}:Utente",
        "grouppage-autoconfirmed": "{{ns:project}}:Utente autocunfermate",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Ammenistrature",
        "grouppage-bureaucrat": "{{ns:project}}:Burocrate",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "grouppage-suppress": "{{ns:project}}:Suppressure",
        "right-read": "Liegge paggene",
        "right-edit": "Cagna paggene",
        "right-createpage": "Crìa paggene (ca nun songo paggene 'e chiacchiera)",
        "recentchangeslinked-summary": "Chest'è n'alenco d' 'e cagnamiente fatte mò a 'e paggene cullegate 'a chilla specificata (o pe' cuntenute dint'a na categurìa specificata). 'E paggene cuntenute dint' 'o proprio elenco 'e l'[[Special:Watchlist|Paggene cuntrullate]] songo mmustate 'n '''grassetto'''.",
        "recentchangeslinked-page": "Nomme d' 'a paggena",
        "recentchangeslinked-to": "Mmusta sulamente 'e cagnamiente a 'e paggene cullegate a chilla specificata",
+       "recentchanges-page-added-to-category": "[[:$1]] azzeccato â categurìa",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|na paggena|$2 paggene}} azzeccate â categurìa",
+       "recentchanges-page-removed-from-category": "[[:$1]] luvato d' 'a categurìa",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|na paggena|$2 paggena}} luvate d' 'a categurìa",
+       "autochange-username": "Cagnamiento automateco MediaWiki",
        "upload": "Carreca file",
        "uploadbtn": "Carreca file",
        "reuploaddesc": "Torna a 'o modulo pe ffà 'a carreca",
        "upload-options": "Opziune 'e carreca",
        "watchthisupload": "Tiene d'uocchio chistu file",
        "filewasdeleted": "Nu file ca se chiamave cumm'a chillo c'avete primma carrecato e pò è stato scancellato.\nVedite 'e cuntrullà 'o $1 apprimma ca cuntinuate c' 'a carreca.",
+       "filename-thumb-name": "Chesto pare nu titolo 'e miniatura. Pe' piacere nun carrecate miniature 'a stessa wiki. 'E n'atu modo, cagnate pe' piacere 'o nomme d' 'o file, facenno chesto cchiù significativo e senza prefisso 'e miniatura.",
        "filename-bad-prefix": "'O nomme d' 'o file ca state a carrecà accummencia pe' ''\"$1\"''', ca nurmalmente è 'o nomme c'assegnasse na machina fotografeca automatecamente ed è nu nomme nun descrittivo.\nPe' piacere scigliete n'atu nomme ca fosse cchiù descrittivo.",
        "upload-success-subj": "Carreca ngarrata",
        "upload-success-msg": "'A carreca tuja d' 'o [$2] è asciuta bona. Mò è a disposizione ccà: [[:{{ns:file}}:$1]]",
        "upload-http-error": "N'errore HTTP è succiesso: $1",
        "upload-copy-upload-invalid-domain": "Nun è permessa 'a carreca 'e copie 'a chistu dumminio.",
        "upload-dialog-title": "Carreca file",
-       "upload-dialog-error": "N'errore cumparette",
-       "upload-dialog-warning": "N'avviso cumparette",
        "upload-dialog-button-cancel": "Canciella",
        "upload-dialog-button-done": "Fatto",
        "upload-dialog-button-save": "Sarva",
        "upload-dialog-button-upload": "Carreca",
-       "upload-dialog-label-select-file": "Sceglie file",
-       "upload-dialog-label-infoform-title": "Dettaglie",
-       "upload-dialog-label-infoform-name": "Nomme",
-       "upload-dialog-label-infoform-description": "Descrizzione",
-       "upload-dialog-label-usage-title": "Aúso",
-       "upload-dialog-label-usage-filename": "Nomme d' 'o file",
+       "upload-process-error": "N'errore cumparette",
+       "upload-process-warning": "N'avviso cumparette",
+       "upload-form-label-select-file": "Sceglie file",
+       "upload-form-label-infoform-title": "Dettaglie",
+       "upload-form-label-infoform-name": "Nomme",
+       "upload-form-label-infoform-description": "Descrizzione",
+       "upload-form-label-usage-title": "Aúso",
+       "upload-form-label-usage-filename": "Nomme d' 'o file",
+       "foreign-structured-upload-form-label-own-work": "Chest'è fatica mia",
+       "foreign-structured-upload-form-label-infoform-categories": "Categurìe",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-default": "Capisco ca sto a carrecà stu file a nu repositorio spartuto. Cunfermo ca facenno chesto sto secutanno 'e tèrmene 'e servizio e licienze llanno.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Si nun site capace 'e carrecà stu file pe' bbìa d' 'e pulitiche d' 'o repusitorio spartuto, pe' piacere nchiurete sta casciulella e tentate n'ata maniera.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Putite pure tentà 'ausà [[Special:Upload|'a paggena 'e carreche 'e {{SITENAME}}]], si stu file nun se putesse carrecà llanno pe' bbìa d' 'e pulitiche.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Faccio attestato ca songo 'o detentore d' 'o copyright 'e stu file, e so' d'accordo 'e lassà irrevocabbelmente stu file a Wikimedia Commons sott'a licienza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribuziona-SparteEguale 4.0], e so' d'accordo cu sti [https://wikimediafoundation.org/wiki/Terms_of_Use Termene d'Uso].",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Si nun tenite 'o copyright 'e stu file, o pure 'o vulite lassà libbero cu n'ata licienza, cunziderate 'ausà 'o [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Putite pure tentà 'e ausà [[Special:Upload|'a paggena 'e carreche 'e {{SITENAME}}]], si stu sito ve premmettesse 'e carrecà llanno pe' bbìa d' 'e pulitiche.",
        "backend-fail-stream": "Nun se può mannà 'o file \"$1\".",
        "backend-fail-backup": "Nun se può ffà 'o backup d' 'o file \"$1\".",
        "backend-fail-notexists": "'O file $1 nun esiste.",
        "filerevert-legend": "Arrepiglia 'o file",
        "filerevert-intro": "State arrepiglianno 'o file '''[[Media:$1|$1]]''' int' 'a [$4 verzione d' 'o $3, $2].",
        "filerevert-comment": "Mutive:",
-       "filerevert-defaultcomment": "Arripigliata 'a verzione d' 'o $2, $1",
+       "filerevert-defaultcomment": "Turnata 'a verzione comm' 'o $2, $1 ($3)",
        "filerevert-submit": "Arrepiglia",
        "filerevert-success": "'''[[Media:$1|$1]]''' è stat'arripigliato â verziona [$4 d' 'e $3 d' 'o $2].",
        "filerevert-badversion": "Nun ce sta na virziona lucale 'e stu file cu l'orario addimannato.",
        "nopagetext": "'A paggena 'e destinazione c'avite specificato nun esiste.",
        "pager-newer-n": "{{PLURAL:$1|1 cchiù nova|$1 cchiù nnove}}",
        "pager-older-n": "{{PLURAL:$1|1 cchiù viecchio|$1 cchiù viecchie}}",
-       "suppress": "Supervisione",
+       "suppress": "Supprime",
        "querypage-disabled": "Sta paggena speciale è stutata pe' mutive 'e prestaziune.",
        "apihelp": "Ajuto cu l'API",
        "apihelp-no-such-module": "'O modulo \"$1\" nun se trova.",
        "emailccsubject": "Copia d' 'a mmasciata tua 'a $1: $2",
        "emailsent": "Mmasciata e-mail mannata",
        "emailsenttext": "'A mmasciata d' 'a toja s'è mannata.",
-       "emailuserfooter": "Chista mmasciata e-mail è stata mannata 'a $1 a $2 p' 'a funziona \"{{int:emailuser}}\" 'e {{SITENAME}}.",
+       "emailuserfooter": "Chista mmasciata e-mail è stata {{GENDER:$1|mannata}} 'a $1 a {{GENDER:$2|$2}} p' 'a funziona \"{{int:emailuser}}\" 'e {{SITENAME}}.",
        "usermessage-summary": "Lassanno na mmasciata 'e sistema.",
        "usermessage-editor": "Mmasciatore d' 'o sistema",
        "watchlist": "Paggene cuntrullate",
        "deletepage": "Scancella paggena",
        "confirm": "Cunferma",
        "excontent": "'o cuntenuto era: '$1'",
-       "excontentauthor": "'o cuntenuto era: '$1' (e ll'unneco cuntribbutore era '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "'o cuntenuto era: '$1', e ll'unneco cuntribbutore era '[[Special:Contributions/$2|$2]]' ([[User talk:$2|chiacchieria]])",
        "exbeforeblank": "'O cuntenuto apprimm' 'a ll'arrevacamento era: '$1'",
        "delete-confirm": "Scancella \"$1\"",
        "delete-legend": "Scancella",
        "move-page-legend": "Mòve paggena",
        "movepagetext": "Ausanno stu modulo ccà abbascio s'anommenarrà 'a paggena n'ata vota, movenno tutt' 'a cronologgia suja a l'atu nomme.\n'O titolo viecchio s'addeventarrà nu redirect â paggena c' 'o titolo nuovo. Putite agghiurnà 'e redirect ca puntassero ô titolo origgenale automaticamente.\nSi chesto nun facite, state sicuro 'e cuntrullà [[Special:DoubleRedirects|doppie ridirezionamiente]] o [[Special:BrokenRedirects|ridirezionamiente scassate]]. Vuje site 'o responsabbile 'e chillo ca cumbinate, assicurateve ca 'o cullegamiento cuntinua a spuntà addò avess'a spuntà.\n\nVedite bbuono ca 'a paggena <strong>nun</strong> se muoverrà si esiste n'ata paggena c' 'o titolo nuovo, a meno ca è abbacante o ca ce sta na paggena 'e ridirezionamiento senza cronologgia. Chesto significasse ca putite fà turnà 'o nomme viecchio â paggena addò ce steva apprimma si avite cumbinato nu nguacchio p'errore, e nun può sovrascrivere 'a paggena ch'esiste già. <strong>Attenzione!</strong> Chisto può essere nu cagnamiento drastico e inaspettato 'e na paggena famosa assaje; pe' piacere, avite 'a essere sicure-sicure d' 'e conseguenze apprimm' 'e cuntinuà.",
        "movepagetext-noredirectfixer": "Ausanno stu modulo ccà abbascio s'anommenarrà 'a paggena n'ata vota, movenno tutt' 'a cronologgia suja a l'atu nomme.\n'O titolo viecchio s'addeventarrà nu redirect â paggena c' 'o titolo nuovo. State sicuro 'e cuntrullà [[Special:DoubleRedirects|doppie ridirezionamiente]] o [[Special:BrokenRedirects|ridirezionamiente scassate]]. Vuje site 'o responsabbile 'e chillo ca cumbinate, assicurateve ca 'o cullegamiento cuntinua a spuntà addò avess'a spuntà.\n\nVedite bbuono ca 'a paggena <strong>nun</strong> se muoverrà si esiste n'ata paggena c' 'o titolo nuovo, a meno ca è abbacante o ca ce sta na paggena 'e ridirezionamiento senza cronologgia. Chesto significasse ca putite fà turnà 'o nomme viecchio â paggena addò ce steva apprimma si avite cumbinato nu nguacchio p'errore, e nun può sovrascrivere 'a paggena ch'esiste già. <strong>Attenzione!</strong> Chisto può essere nu cagnamiento drastico e inaspettato 'e na paggena famosa assaje; pe' piacere, avite 'a essere sicure-sicure d' 'e conseguenze apprimm' 'e cuntinuà.",
-       "movepagetalktext": "'A paggena 'e chiacchieria suoccia a chesta sarrà spustata automaticamente cu chesta <strong>a meno che:</strong>\n*Esiste na paggena 'e chiacchieria ca nun è abbacante c' 'o nomme nuovo, o\n*Vuje sciglite accussì abbacantanno 'a casciulella ccà abbascio.\n\nInd' 'a sti case, 'a paggena nun se muoverrà, ma 'a putite sempe scagnà manualmente si vulite.",
-       "movearticle": "Mòve 'a paggena",
+       "movepagetalktext": "Si vuje facite click a sta casciulella, 'a paggena 'e chiacchiera suoccia a chesta sarrà spustata automaticamente addò 'o titolo nuovo, si nun è ca na paggena abbacante 'e chiacchiera esiste mo' mo' llàn\n\nInd' 'a stu caso, 'a paggena nun se muoverrà, ma 'a putite sempe scagnà manualmente si vulite.",
        "moveuserpage-warning": "<strong>Attenziò:</strong> Vuje state a muovere na paggena utente. Vedite bbuono ca sulamente 'a paggena sarrà spustata e l'utente <em>nun</em> sarrà reanummenato.",
        "movecategorypage-warning": "<strong>Attenziò:</strong> Vuje state a muovere na categurìa. Vedite bbuono ca sulamente 'a paggena sarrà spustata e 'a categurìa viecchia <em>nun</em> sarrà cagnata â nnova.",
        "movenologintext": "Vuje avite 'a essere n'utente riggistrato e [[Special:UserLogin|cullegato]] pe' spustà na paggena.",
        "logentry-newusers-byemail": "'O cunto utente $3 fuje {{GENDER:$2|criato|criata}} pe' $1 e 'a passuor è stata mannata pe' bbìa 'e na mmasciata e-mail",
        "logentry-newusers-autocreate": "'O cunto utente $1 fuje {{GENDER:$2|criato|criata}} automatecamente",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|spustaje}} mpustaziune 'e pruteziona 'a $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|luvata}} pruteziona 'a $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|pruteggette}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|pruteggette}} $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|cagnaje}} 'o livello 'e prutezione pe' $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cagnaje}} 'o livello 'e prutezione pe' $3 $4 [cascading]",
        "logentry-rights-rights": "$1 {{GENDER:$2|cagnaje}} 'e gruppo pe' $3 'a $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|cagnaje}} 'e gruppo pe' $3",
        "logentry-rights-autopromote": "$1 è {{GENDER:$2|stato promosso|stata promossa}} automatecamente 'a $4 a $5",
        "api-error-badaccess-groups": "Tun putite carrecà file ncopp' 'a sta wiki.",
        "api-error-badtoken": "Errore interno: 'O token nun è buono.",
        "api-error-copyuploaddisabled": "'A funzione carrcà 'e n'URL nun è appicciata dint'a stu server.",
-       "api-error-duplicate": "Nce {{PLURAL:$1|stà [$2 n'atu file]|stanno [$2 ati file]}} ncopp' 'o sito ch' 'e stisse cuntenute.",
-       "api-error-duplicate-archive": "Nce {{PLURAL:$1|steva [$2 n'atu file]|stevano [$2 ati file]}} già ncopp' 'o sito ch' 'e stisse cuntenute, però {{PLURAL:$1|è stato|so' state}} scancellate.",
-       "api-error-duplicate-archive-popup-title": "File duprecat{{PLURAL:$1|o che è già stato scancellato|e che songo già state scancellati}}",
-       "api-error-duplicate-popup-title": "Dupreche {{PLURAL:$1|file|file}}",
+       "api-error-duplicate": "Nce {{PLURAL:$1|sta è n'atu file|stanno ati file}} ncopp' 'o sito ch' 'e cuntenute eguale eguale.",
+       "api-error-duplicate-archive": "Nce {{PLURAL:$1|steva n'atu file|stevano ati file}} già ncopp' 'o sito ch' 'e stisse cuntenute, però {{PLURAL:$1|è stato|so' state}} scancellate.",
        "api-error-empty-file": "'O file ch'avite mannato è abbacante.",
        "api-error-emptypage": "'A criazione 'e paggene nuove abbacante nun è permessa.",
        "api-error-fetchfileerror": "Errore interno: Coccosa ascette stuorta quanno se steva 'analizzà stu file.",
index b17439f..b92be75 100644 (file)
@@ -45,7 +45,8 @@
                        "Helland",
                        "Macofe",
                        "Kingu",
-                       "Tarjeimo"
+                       "Tarjeimo",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Strek under lenker:",
        "virus-scanfailed": "skanning mislyktes (kode $1)",
        "virus-unknownscanner": "ukjent antivirusprogram:",
        "logouttext": "'''Du er nå logget ut.'''\n\nVær oppmerksom på at noen sider kan fortsette å dukke opp som om du fortsatt var innlogget, helt til du nullstiller nettleserens mellomlager (cache).",
-       "welcomeuser": "Velkommen, $1!",
+       "welcomeuser": "Velkommen $1!",
        "welcomecreation-msg": "Kontoen din har blitt opprettet.\nIkke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.",
        "yourname": "Brukernavn:",
        "userlogin-yourname": "Brukernavn",
-       "userlogin-yourname-ph": "Skriv inn brukernavnet ditt",
-       "createacct-another-username-ph": "Skriv inn brukernavnet",
+       "userlogin-yourname-ph": "Fyll inn brukernavnet ditt",
+       "createacct-another-username-ph": "Fyll inn brukernavnet",
        "yourpassword": "Passord:",
        "userlogin-yourpassword": "Passord",
-       "userlogin-yourpassword-ph": "Skriv inn passordet ditt",
-       "createacct-yourpassword-ph": "Skriv inn et passord",
+       "userlogin-yourpassword-ph": "Fyll inn passordet ditt",
+       "createacct-yourpassword-ph": "Fyll inn et passord",
        "yourpasswordagain": "Gjenta passord",
        "createacct-yourpasswordagain": "Bekreft passord",
-       "createacct-yourpasswordagain-ph": "Skriv inn passordet igjen",
+       "createacct-yourpasswordagain-ph": "Gjenta passordet",
        "remembermypassword": "Husk meg på denne datamaskinen (i maks $1 {{PLURAL:$1|dag|dager}})",
        "userlogin-remembermypassword": "Hold meg innlogget",
        "userlogin-signwithsecure": "Logg inn med sikker tjener",
        "userlogout": "Logg ut",
        "notloggedin": "Ikke logget inn",
        "userlogin-noaccount": "Ingen konto?",
-       "userlogin-joinproject": "Bli med  {{SITENAME}}",
+       "userlogin-joinproject": "Bli med i {{SITENAME}}",
        "nologin": "Har du ingen konto? $1.",
        "nologinlink": "Opprett en konto",
        "createaccount": "Opprett konto",
        "userlogin-createanother": "Opprett ny konto",
        "createacct-emailrequired": "E-postadresse",
        "createacct-emailoptional": "E-postadresse (valgfritt)",
-       "createacct-email-ph": "Skriv inn e-postadressen din",
-       "createacct-another-email-ph": "Skriv inn epostadressen",
+       "createacct-email-ph": "Fyll inn e-postadressen din",
+       "createacct-another-email-ph": "Fyll inn epostadressen",
        "createaccountmail": "Bruk et midlertidig, tilfeldig passord, og send det til angitt e-postadresse",
        "createacct-realname": "Virkelig navn (valgfritt)",
        "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "createacct-reason-ph": "Hvorfor lager du en annen bruker",
        "createacct-captcha": "Sikkerhetssjekk",
-       "createacct-imgcaptcha-ph": "Skriv inn teksten du ser ovenfor",
+       "createacct-imgcaptcha-ph": "Fyll inn teksten du ser ovenfor",
        "createacct-submit": "Opprett konto",
-       "createacct-another-submit": "Lag ny konto",
+       "createacct-another-submit": "Opprett konto",
        "createacct-benefit-heading": "{{SITENAME}} er laget av folk som deg.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringer}}",
        "createacct-benefit-body2": "{{PLURAL:$1|side|sider}}",
        "emailnotauthenticated": "Din e-postadresse er ikke bekreftet. Du vil ikke kunne motta e-post for noen av følgende egenskaper.",
        "noemailprefs": "Oppgi en e-postadresse for at disse funksjonene skal fungere.",
        "emailconfirmlink": "Bekreft e-postadressen din.",
-       "invalidemailaddress": "Din e-postadresse kan ikke aksepteres, fordi den er ugyldig formatert.\nSkriv inn en fungerende e-postadresse eller tøm feltet.",
+       "invalidemailaddress": "E-postadresse din kan ikke aksepteres fordi den er ugyldig formatert.\nSkriv inn en korrekt e-postadresse eller tøm feltet.",
        "cannotchangeemail": "E-postadresser knyttet til brukerkontoer kan ikke endres på denne wikien.",
        "emaildisabled": "Dette nettstedet kan ikke sende e-poster.",
        "accountcreated": "Konto opprettet",
        "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": "En passordtilbakestillingslenke har blitt sendt per e-post.",
+       "passwordreset-emailsent": "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 e-postadresse",
-       "changeemail-text": "Fyll ut dette skjemaet for å endre din e-postadresse. Du må oppgi ditt passord for å bekrefte endringen.",
+       "changeemail": "Endre eller fjerne epostadresse",
+       "changeemail-text": "Fyll ut dette skjemaet for å endre epostadressen din. Du må oppgi passordet ditt for å bekrefte endringen. Hvis du ikke ønsker at det skal være knyttet noen epostadresse til kontoen din, kan du la feltet stå tomt.",
        "changeemail-no-info": "Du må være innlogget for å få direkte tilgang til denne siden.",
        "changeemail-oldemail": "Nåværende e-postadresse:",
        "changeemail-newemail": "Ny e-postadresse:",
        "mergehistory-go": "Vis flettbare redigeringer",
        "mergehistory-submit": "Flett revisjoner",
        "mergehistory-empty": "Ingen revisjoner kan flettes.",
-       "mergehistory-success": "{{PLURAL:$3|Én revisjon|$3 revisjoner}} av [[:$1]] ble flettet til [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Én revisjon|$3 revisjoner}} av $1 ble flettet til [[:$2]].",
        "mergehistory-fail": "Klarte ikke å utføre historikkfletting; sjekk siden og tidsparameterne igjen.",
        "mergehistory-fail-toobig": "Det er ikke mulig å utføre historikk-fletting fordi flere enn tillatte $1 {{PLURAL:$1|revisjon|revisjoner}} ville blitt flyttet.",
        "mergehistory-no-source": "Kildesiden $1 finnes ikke.",
        "prefs-watchlist-token": "Nøkkel for overvåkningsliste",
        "prefs-misc": "Diverse",
        "prefs-resetpass": "Endre passord",
-       "prefs-changeemail": "Endre e-postadresse",
+       "prefs-changeemail": "Endre eller fjerne e-postadresse",
        "prefs-setemail": "Oppgi en e-postadresse",
        "prefs-email": "Alternativer for e-post",
        "prefs-rendering": "Utseende",
        "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": "Skriv inn en gyldig e-postadresse",
+       "email-address-validity-invalid": "Fyll inn en gyldig e-postadresse",
        "userrights": "Brukerrettighetskontroll",
        "userrights-lookup-user": "Ordne brukergrupper",
-       "userrights-user-editname": "Skriv inn et brukernavn:",
+       "userrights-user-editname": "Fyll inn et brukernavn:",
        "editusergroup": "Endre brukergrupper",
        "editinguser": "Endrer brukerrettighetene for {{GENDER:$1|bruker}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Rediger brukergrupper",
        "filerevert-legend": "Tilbakestill fil",
        "filerevert-intro": "Du tilbakestiller '''[[Media:$1|$1]]''' til [$4 versjonen à $2, $3].",
        "filerevert-comment": "Årsak:",
-       "filerevert-defaultcomment": "Tilbakestilte til versjonen à $1, $2",
+       "filerevert-defaultcomment": "Tilbakestilte til versjonen à $1, $2 ($3)",
        "filerevert-submit": "Tilbakestill",
        "filerevert-success": "'''[[Media:$1|$1]]''' ble tilbakestilt til [$4 versjonen à $2, $3].",
        "filerevert-badversion": "Det er ingen tidligere lokal versjon av denne filen med det gitte tidstrykket.",
        "booksources-text": "Under er en liste over lenker til andre sider som selger nye og brukte bøker, og kan også ha videre informasjon om bøker du leter etter:",
        "booksources-invalid-isbn": "Det gitte ISBN-nummeret er ugyldig; sjekk om du har angitt det riktig.",
        "specialloguserlabel": "Utøver:",
-       "speciallogtitlelabel": "Mål (tittel eller bruker):",
+       "speciallogtitlelabel": "Mål (tittel eller {{ns:user}}:brukernavn for brukeren):",
        "log": "Logger",
        "all-logs-page": "Alle offentlige logger",
        "alllogstext": "Kombinert visning av alle loggene på {{SITENAME}}.\nDu kan minske antallet resultater ved å velge loggtype, brukernavn eller den siden som er påvirket (husk å skille mellom store og små bokstaver).",
        "emailccsubject": "Kopi av din beskjed til $1: $2",
        "emailsent": "E-post sendt",
        "emailsenttext": "E-postbeskjeden er sendt",
-       "emailuserfooter": "Denne e-posten ble sendt av $1 til $2 via funksjonen «{{int:emailuser}}» på {{SITENAME}}.",
+       "emailuserfooter": "Denne e-posten ble {{GENDER:$1|sendt}} av $1 til {{GENDER:$2|$2}}  via funksjonen «{{int:emailuser}}» på {{SITENAME}}.",
        "usermessage-summary": "Etterlater en systembeskjed.",
        "usermessage-editor": "Systembudbringer",
        "watchlist": "Overvåkningsliste",
        "watchlistanontext": "Logg inn for å vise eller redigere elementer på overvåkningslisten din.",
        "watchnologin": "Ikke logget inn",
        "addwatch": "Legg til i overvåkningslisten",
-       "addedwatchtext": "Siden «[[:$1]]» er lagt til [[Special:Watchlist|overvåkningslisten]] din.\nFremtidige endringer til denne siden og den tilhørende diskusjonssiden blir listet opp der.",
+       "addedwatchtext": "«[[:$1]]» og den tilhørende diskusjonssiden er lagt til i [[Special:Watchlist|overvåkningslisten]] din.",
        "addedwatchtext-short": "Siden «$1» har blitt lagt til i overvåkningslisten din.",
        "removewatch": "Fjern fra overvåkningslisten",
-       "removedwatchtext": "Siden «[[:$1]]» er fjernet fra [[Special:Watchlist|overvåkningslisten din]].",
+       "removedwatchtext": "«[[:$1]]» og den tilhørende diskusjonssiden har blitt fjernet fra [[Special:Watchlist|overvåkningslisten din]].",
        "removedwatchtext-short": "Siden «$1» har blitt fjernet fra overvåkningslisten din.",
        "watch": "Overvåk",
        "watchthispage": "Overvåk denne siden",
        "deletepage": "Slett side",
        "confirm": "Bekreft",
        "excontent": "Innholdet var: «$1»",
-       "excontentauthor": "innholdet var «$1» (og eneste bidragsyter var [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "innholdet var «$1», og eneste bidragsyter var [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])",
        "exbeforeblank": "innholdet før siden ble tømt var: «$1»",
        "delete-confirm": "Slett «$1»",
        "delete-legend": "Slett",
        "protect-locked-blocked": "Du kan ikke endre beskyttelsesnivåer mens du er blokkert. Dette er de nåværende innstillingene for siden '''$1''':",
        "protect-locked-dblock": "Beskyttelsesnivåer kan ikke endres under en aktiv databasebeskyttelse. Dette er de nåværende innstillingene for siden '''$1''':",
        "protect-locked-access": "Kontoen din har ikke tillatelse til å endre sidebeskyttelsesnivå.\nDette er de nåværende innstillingene for siden '''$1''':",
-       "protect-cascadeon": "Denne siden er for tiden beskyttet fordi den er inkludert på følgende {{PLURAL:$1|side|sider}} som har dypbeskyttelse slått på.\nDu kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen.",
+       "protect-cascadeon": "Denne siden er for tiden beskyttet fordi den er transkludert på følgende {{PLURAL:$1|side|sider}} som har dypbeskyttelse slått på.\nDu kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen.",
        "protect-default": "Tillat alle brukere",
        "protect-fallback": "Tillat kun brukere med tillatelsen «$1»",
        "protect-level-autoconfirmed": "Tillat kun autobekreftede brukere",
        "undeletepagetext": "Følgende {{PLURAL:$1|side|sider}} er slettet, men finnes fortsatt i arkivet og kan gjenopprettes. Arkivet blir periodevis slettet.",
        "undelete-fieldset-title": "Gjenopprett revisjoner",
        "undeleteextrahelp": "For å gjenopprette hele sidens historikk, la alle boksene være tomme og klikk '''''{{int:undeletebtn}}'''''.\nFor å gjenopprette kun deler, kryss av boksene for revisjonene du vil gjenopprette og klikk '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|Én versjon arkivert|$1 versjoner arkiverte}}",
+       "undeleterevisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} slettet",
        "undeletehistory": "Om du gjenoppretter siden vil alle revisjoner gjenopprettes i historikken.\nDersom en ny side ved samme navn har blitt oprettet etter slettingen, vil de gjenopprettede revisjonene dukke opp før denne i redigeringshistorikken.",
        "undeleterevdel": "Gjenoppretting kan ikke utføres dersom det resulterer i at den øverste revisjonen blir delvis slettet. I slike tilfeller må du fjerne merkingen av den nyeste slettede revisjonen.",
        "undeletehistorynoadmin": "Denne artikkelen har blitt slettet. Grunnen for slettingen vises i oppsummeringen nedenfor, sammen med detaljer om brukerne som redigerte siden før den ble slettet. Teksten i disse slettede revisjonene er kun tilgjengelig for administratorer.",
        "movepagetext": "Når du bruker skjemaet nedenfor døper du om en side og flytter hele historikken til det nye navnet.\nDen gamle tittelen blir en omdirigeringsside til den nye tittelen.\nDu kan oppdatere omdirigeringer som peker til den opprinnelige tittelen automatisk.\nOm du velger å ikke gjøre det, sjekk at flyttingen ikke fører til [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].\nDu er ansvarlig for at lenker fortsetter å peke til de sidene de er ment å peke til.\n\nLegg merke til at siden '''ikke''' kan flyttes hvis det allerede finnes en side med den nye tittelen, med mindre sistnevnte er tom eller er en omdirigeringsside uten historikk.\nDet betyr at du kan flytte en side tilbake dit den kom fra hvis du gjør en feil, og du kan ikke overskrive eksisterende sider ved et uhell.\n\n'''Advarsel!'''\nDette kan være en drastisk og uventet endring for en populær side;\nvær sikker på at du forstår konsekvensene av dette før du fortsetter.",
        "movepagetext-noredirectfixer": "Skjemaet nedenfor vil gi en side ny tittel og flytte historikken dens til det nye navnet.\nDen gamle tittelen vil bli en omdirigering til den nye.\nSjekk om det blir [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].\nDu er ansvarlig for å sjekke at lenker fortsetter å gå dit de skal.\n\nMerk at sider '''ikke''' blir flyttet om det allerede finnes en side med den tittelen, med mindre siden er tom eller en omdirigering og ikke har noen redigeringshistorikk.\nDette betyr at du kan endre tittelen til en tittel siden hadde tidligere, og at du ikke kan skrive over en eksisterende side.\n\n'''Advarsel!'''\nDette kan være en drastisk og uventet endring for en populær side;\nvær sikker på at du forstår konsekvensene av dette før du fortsetter.",
        "movepagetalktext": "Den tilhørende diskusjonssiden vil automatisk bli flyttet sammen med siden '''med mindre:'''\n*Det allerede finnes en diskusjonsside som ikke er tom under det nye navnet, eller\n*Du fjerner markeringen i boksen nedenfor.\n\nI disse tilfellene er du nødt til å flytte eller flette siden manuelt, om ønskelig.",
-       "movearticle": "Flytt side:",
        "moveuserpage-warning": "'''Advarsel:''' Du er i ferd med å flytte en brukerside. Merk at kun siden vil bli flyttet; brukernavnet vil ''ikke'' bli endret.",
        "movecategorypage-warning": "<strong>Advarsel:</strong> Du er i ferd med å flytte en kategoriside. Merk at kun siden blir flyttet, og at sider i det gamle kategorinavnet <em>ikke</em> blir omkategorisert til det nye navnet.",
        "movenologintext": "Du må være registrert bruker og være [[Special:UserLogin|logget på]] for å flytte en side.",
        "cant-move-to-user-page": "Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).",
        "cant-move-category-page": "Du har ikke tillatelse til å flytte kategorisider.",
        "cant-move-to-category-page": "Du har ikke tillatelse til å flytte en side til en kategoriside.",
-       "newtitle": "Til ny tittel:",
+       "newtitle": "Ny tittel:",
        "move-watch": "Overvåk kilde- og målsiden",
        "movepagebtn": "Flytt side",
        "pagemovedsub": "Flytting gjennomført",
        "confirmemail_sendfailed": "{{SITENAME}} klarte ikke å sende bekreftelseskode.\nSjekk e-postadressen for ugyldige tegn.\n\nE-postsenderen ga følgende melding: $1",
        "confirmemail_invalid": "Ugyldig bekreftelseskode. Koden kan ha utløpt.",
        "confirmemail_needlogin": "Du må $1 for å bekrefte e-postadressen din.",
-       "confirmemail_success": "Din e-postadresse er nå bekreftet. Du kan nå logge inn og bruke wikien.",
+       "confirmemail_success": "E-postadressen din har blitt bekreftet. Du kan nå [[Special:UserLogin|logge inn]] og bruke wikien.",
        "confirmemail_loggedin": "E-postadressen din er bekreftet.",
        "confirmemail_subject": "Bekreftelsesmelding fra {{SITENAME}}",
        "confirmemail_body": "Noen, antageligvis deg, har registrert kontoen «$2» på {{SITENAME}}, fra IP-adressen $1.\n\nFor å bekrefte at denne kontoen tilhører deg og for å aktivere e-posttjenester på {{SITENAME}}, åpne følgende lenke i nettleseren din:\n\n$3\n\nOm du *ikke* registrerte kontoen, følg denne lenken for å avbryte bekreftelse av e-postadresse:\n\n$5\n\nDenne bekreftelseskoden utgår $4.",
        "deletedwhileediting": "'''Advarsel:''' Denne siden har blitt slettet etter at du begynte å redigere den!",
        "confirmrecreate": "«[[User:$1|$1]]» ([[User talk:$1|diskusjon]]) slettet siden etter at du begynte å redigere den, med begrunnelsen «$2». Vennligst bekreft at du vil gjenopprette siden.",
        "confirmrecreate-noreason": "Brukeren [[User:$1|$1]] ([[User talk:$1|diskusjon]]) slettet denne siden etter at du begynte å redigere. Bekreft at du virkelig ønsker å gjenopprette denne siden.",
-       "recreate": "Siden har blitt slettet etter at du begynte å redigere. Trykk \"$1\" for å gjenopprette den.",
+       "recreate": "Gjenopprett",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Vil du slette tjenerens mellomlagrede versjon (''cache'') av denne siden?",
        "confirm-purge-bottom": "Rensing av en side sletter mellomlageret og tvinger frem den nyeste versjonen.",
        "api-error-badaccess-groups": "Du har ikke tillatelse til å laste opp filer til denne wikien.",
        "api-error-badtoken": "Intern feil: Ugyldig nøkkel.",
        "api-error-copyuploaddisabled": "Opplasting ved URL er deaktivert på denne tjeneren.",
-       "api-error-duplicate": "Det er allerede {{PLURAL:$1|en [$2 annen fil]|flere [$2 andre filer]}} på denne siden med samme innhold.",
-       "api-error-duplicate-archive": "Det fantes {{PLURAL:$1|[$2 en annen fil]|[$2 noen andre filer]}} på siden som hadde samme innhold, men {{PLURAL:$1|den|de}} ble slettet.",
-       "api-error-duplicate-archive-popup-title": "Duplikat-{{PLURAL:$1|fil|filer}} som allerede har blitt slettet",
-       "api-error-duplicate-popup-title": "Duplikat {{PLURAL:$1|fil|filer}}",
+       "api-error-duplicate": "Det er allerede {{PLURAL:$1|en annen fil|flere andre filer}} på denne siden med samme innhold.",
+       "api-error-duplicate-archive": "Det fantes {{PLURAL:$1|en annen fil|noen andre filer}} på siden som hadde samme innhold, men {{PLURAL:$1|den|de}} ble slettet.",
        "api-error-empty-file": "Filen du sendte inn var tom.",
        "api-error-emptypage": "Det er ikke tillatt å opprette nye, tomme sider.",
        "api-error-fetchfileerror": "Intern feil: Noe gikk galt ved henting av denne filen.",
index 0e312ba..de8c688 100644 (file)
@@ -16,7 +16,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Kolega2357",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Verwiezingen onderstrepen",
        "mergehistory-go": "Bekiek bewarkingen die bie mekaar edaon kunnen wörden",
        "mergehistory-submit": "Versies bie mekaar doon",
        "mergehistory-empty": "Der bin gien versies die samenevoegd kunnen wörden.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] bin suksesvol samenevoegd naor [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 bin suksesvol samenevoegd naor [[:$2]].",
        "mergehistory-fail": "Kan gien geschiedenisse samenvoegen, kiek opniej de zied- en tiedparameters nao.",
        "mergehistory-no-source": "Bronzied $1 besteet niet.",
        "mergehistory-no-destination": "Bestemmingszied $1 besteet niet.",
        "filerevert-legend": "Bestaand weerummezetten",
        "filerevert-intro": "Je bin '''[[Media:$1|$1]]''' an t weerummedreien tot de [$4 versie van $2, $3]",
        "filerevert-comment": "Reden:",
-       "filerevert-defaultcomment": "Weerummedreid tot de versie van $1, $2",
+       "filerevert-defaultcomment": "Weerummedreid tot de versie van $1, $2 ($3)",
        "filerevert-submit": "Weerummedreien",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' is weerummedreid naor de [$4 versie op $2, $3]</span>.",
        "filerevert-badversion": "Der is gien veurige lokale versie van dit bestaand mit de op-egeven tied.",
        "movepagetext": "Mit dit formulier ku'j de zied n nieje naam geven, de geschiedenisse geet dan vanzelf mee.\nDe ouwe naam zal automaties n deurverwiezing wörden naor de nieje zied.\nDeurverwiezingen naor de ouwe naam kunnen automaties ewiezigd wörden.\nA'j derveur kiezen um dat niet te doon, kiek t dan effen nao of der [[Special:DoubleRedirects|dubbele]] en [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.\nt Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.\n\nn Zied kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.\nDit betekent da'j n zied weer naor de ouwe naam kunnen herneumen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde zied overschrieven.\n\n'''WAORSCHUWING!'''\nVeur populaere ziejen kan t herneumen drastiese en onveurziene gevolgen hebben.\nZörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
        "movepagetext-noredirectfixer": "Mit dit formulier ku'j de zied n nieje naam geven, de geschiedenisse geet dan vanzelf mee.\nDe ouwe naam zal automaties n deurverwiezing wörden naor de nieje zied.\nKiek oek effen nao of der gien [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.\nt Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.\n\nn Zied kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.\nDit betekent da'j n zied weer naor de ouwe naam herneumen kunnen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde zied overschrieven.\n\n'''WAORSCHUWING!'''\nVeur ziejen die vake bekeken wörden kan t herneumen drastiese en onveurziene gevolgen hebben.\nZörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
        "movepagetalktext": "De overlegzied die derbie heurt krig oek n nieje titel, mer '''niet''' in de volgende gevallen:\n* As der al n niet-lege overlegzied besteet onder de aandere naam, of\n* A'j de opsie hieronder uutzetten.\n\nAs dat zo is dan mu'j de zied haandmaotig herneumen of samenvoegen.",
-       "movearticle": "Herneum",
        "moveuserpage-warning": "'''Waorschuwing:''' Je staon op t punt um n gebrukerszied te herneumen. Allinnig disse zied zal herneumd wörden, '''niet''' de gebruker.",
        "movenologintext": "Je mutten [[Special:UserLogin|an-emeld]] ween um de naam van n zied te wiezigen.",
        "movenotallowed": "Je hebben gien rechten um ziejen te herneumen.",
        "api-error-badaccess-groups": "Je maggen gien bestaanden in disse wiki oplaojen.",
        "api-error-badtoken": "Interne fout: t token klopt niet.",
        "api-error-copyuploaddisabled": "Bestaanden opsturen via n webadres is uutezet op disse server.",
-       "api-error-duplicate": "Der {{PLURAL:$1|steet al [$2 n bestaand]|staon al [$2 bestaanden]}} mit de zelfde inhoud in de wiki.",
-       "api-error-duplicate-archive": "Der {{PLURAL:$1|was al [$2 n aander bestaand]|waren al [$2 $1 aandere bestaanden]}}  op de webstee mit de zelfde inhoud, mer {{PLURAL:$1|dat is|die bin}} vortedaon.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplikaotbestaand dat al vortedaon is|Duplikaotbestaanden die al vortedaon bin}}",
-       "api-error-duplicate-popup-title": "Zelfde {{PLURAL:$1|bestaand|bestaanden}}",
+       "api-error-duplicate": "Der {{PLURAL:$1|steet al n bestaand|staon al bestaanden}} mit de zelfde inhoud in de wiki.",
+       "api-error-duplicate-archive": "Der {{PLURAL:$1|was al n aander bestaand|waren al $1 aandere bestaanden}}  op de webstee mit de zelfde inhoud, mer {{PLURAL:$1|dat is|die bin}} vortedaon.",
        "api-error-empty-file": "t Bestaand da'j op-estuurd hebben is leeg.",
        "api-error-emptypage": "Je maggen gien lege nieje ziejen anmaken.",
        "api-error-fetchfileerror": "Interne fout: der is iets verkeerd egaon mit t ophaolen van t bestaand.",
index 3f685db..8531d9e 100644 (file)
@@ -12,7 +12,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Kolega2357",
-                       "Servien"
+                       "Servien",
+                       "Macofe"
                ]
        },
        "tog-underline": "Verwies ünnerstrieken",
        "mergehistory-go": "Wies Versionen, de tohoopföhrt warrn köönt",
        "mergehistory-submit": "Versionen tohoopbringen",
        "mergehistory-empty": "Köönt kene Versionen tohoopföhrt warrn.",
-       "mergehistory-success": "{{PLURAL:$3|Ene Version|$3 Versionen}} vun „[[:$1]]“ mit Spood tohoopföhrt mit „[[:$2]]“.",
+       "mergehistory-done": "{{PLURAL:$3|Ene Version|$3 Versionen}} vun „$1“ mit Spood tohoopföhrt mit „[[:$2]]“.",
        "mergehistory-fail": "Tohoopföhren geiht nich, kiek na, wat de Siet un de Tietangaven ok passen doot.",
        "mergehistory-no-source": "Utgangssiet „$1“ gifft dat nich.",
        "mergehistory-no-destination": "Teelsiet „$1“ gifft dat nich.",
        "filerevert-legend": "Datei trüchsetten",
        "filerevert-intro": "Du settst de Datei '''[[Media:$1|$1]]''' op de [$4 Version vun $2, $3] trüch.",
        "filerevert-comment": "Kommentar:",
-       "filerevert-defaultcomment": "trüchsett op de Version vun’n $1, $2",
+       "filerevert-defaultcomment": "trüchsett op de Version vun’n $1, $2 ($3)",
        "filerevert-submit": "Trüchsetten",
        "filerevert-success": "'''[[Media:$1|$1]]''' is op de [$4 Version vun $2, $3] trüchsett worrn.",
        "filerevert-badversion": "Gifft keen vörige lokale Version vun de Datei to disse Tied.",
        "emailuser": "E-Mail an dissen Bruker",
        "emailuser-title-target": "Email düss {{GENDER:$1|user}}",
        "emailuser-title-notarget": "E-Mail an Bruker",
-       "emailpage": "E-Mail an Bruker",
        "emailpagetext": "Du kannst dissen Bruker mit dit Formular en E-Mail tostüren. As Afsenner warrt de E-Mail-Adress ut dien [[Special:Preferences|Instellen]] indragen, dat de Bruker di antern kann.",
        "defemailsubject": "{{SITENAME}} E-Mail",
        "usermaildisabled": "E-Mails an Brukers utstellt",
        "move-page-legend": "Siet schuven",
        "movepagetext": "Mit dit Formular kannst du en Siet en ne’en Naam geven, tohoop mit all Versionen.\nDe ole Titel wiest denn achterna na den ne’en.\nVerwiesen op den olen Titel köönt automaatsch ännert warrn.\nWenn du dat automaatsche Utbetern vun de Redirects nich utwählst, denn kiek na, wat dor kene [[Special:DoubleRedirects|dubbelten]] un [[Special:BrokenRedirects|kaputten Redirects]] nablifft.\nDat is dien Opgaav, optopassen, dat de Lenken all dorhen wiest, wo se hen wiesen schöölt.\n\nDe Siet warrt '''nich''' schaven, wenn dat al en Siet mit’n ne’en Naam gifft. Utnahmen vun disse Regel sünd blot leddige Sieden un Redirects, wenn disse Sieden kene öllern Versionen hebbt.\nDat bedüüdt, dat du ene jüst verschavene Siet na’n olen Titel trüchschuven kannst, wenn du en Fehler maakt hest, un dat du kene vörhannenen Sieden överschrieven kannst.\n\n'''WOHRSCHAU!'''\nDit kann sik temlich dull utwarken bi veel bruukte Sieden. Stell seker, dat du weetst, wie sik dat utwarkt, ehrdat du wiedermaakst.",
        "movepagetalktext": "De tohören Diskuschoonssiet warrt, wenn een dor is, mitverschaven, ''mit disse Utnahmen:''\n* Du schuffst de Siet in en annern Naamruum oder\n* dat gifft al en Diskuschoonssiet mit dissen Naam, oder\n* du wählst de nerrn stahn Opschoon af\n\nIn disse Fäll musst du de Siet, wenn du dat willst, vun Hand schuven.",
-       "movearticle": "Siet schuven",
        "movenologintext": "Du muttst en registreert Bruker un\n[[Special:UserLogin|anmellt]] ween,\nüm en Siet to schuven.",
        "movenotallowed": "Du hest nich de Rechten, Sieden to schuven.",
        "movenotallowedfile": "Du hest nich de Rechten, Datein to schuven.",
index 510ef79..6e2b45b 100644 (file)
@@ -19,7 +19,8 @@
                        "Macofe",
                        "बिप्लब आनन्द",
                        "Nirjal stha",
-                       "राम प्रसाद जोशी"
+                       "राम प्रसाद जोशी",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
        "nstab-template": "ढाँचा (टेम्प्लेट)",
        "nstab-help": "सहायता पृष्ठ",
        "nstab-category": "श्रेणी",
+       "mainpage-nstab": "मुख्य पृष्ठ",
        "nosuchaction": "यस्तो कार्य हैन",
        "nosuchactiontext": "URL ले खुलाएको कार्य मान्य छैन ।\nतपाईंले URL गलत टाइपगर्नु भएको , वा गलत लिंक पछ्याउनु भएको हुनसक्छ ।\nयो{{SITENAME}}ले सफ्टवेयरमा भएको गल्ति देखाएको पनि हुनसक्छ ।",
        "nosuchspecialpage": "त्यस्तो विशेष पृष्ठ छैन",
        "mergehistory-go": "जोड्न मिल्ने सम्पादनहरू",
        "mergehistory-submit": "पुनरावलोकहरु जोड्नुहोस्",
        "mergehistory-empty": "कुनै पनि पुनरावलोकनहरु जोड्न मिल्दैन ।",
-       "mergehistory-success": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  [[:$1]]बाट सफलतापूर्वक [[:$2]]मा थपियो ।",
+       "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बाट सफलतापूर्वक [[:$2]]मा थपियो ।",
        "mergehistory-fail": "इतिहास जोड्न सकिएन कृपया पृष्ठको नाम र समयमान जाँच गर्नुहोस्।",
        "mergehistory-fail-toobig": "इतिहास समाहित गर्न सम्भव छैन किनभने अवतरण सिमा $1 भन्दा बढी {{PLURAL:$1|अवतरण|अवतरणहरू}} लाई स्थानान्तरित गर्नु पर्छ।",
        "mergehistory-no-source": "स्रोत पृष्ठ $1 अस्तित्वमा छैन ।",
        "movepagetext": "तल दिएको फारमको उपयोगले पृष्ठ नाम परिवर्तन हुनेछ र पृष्ठको सम्पूर्ण इतिहास नयाँ नामको साथमा जानेछ।\nपुरानो शीर्षक नयाँ शीर्षककोलागि अनुप्रेषित पृष्ठ बनिनेछ।\nतपाईंले यो स्वचालित रूपले अनुप्रेषित पृष्ठलाई अपडेट गर्न सक्नुहुनेछ।\nयदि तपाईं हुँदैन चुन्नुहुन्छ भनें जाँचेर सुनिश्चित गर्नुहोस् कि [[Special:DoubleRedirects|दोहोरो]] अथवा [[Special:BrokenRedirects|टुटेको अनुप्रेषण]]।\nतपाईंमाथि यो सुनिश्चित गर्ने उत्तरदायित्व रहन्छ कि लिङ्क कुन विन्दुमा जानु पर्ने हो ।\n\nध्यान दिनुहोस् नयाँ नामको पृष्ठ पहिलेबाट नैं छ भनें पृष्ठ सारिने <strong>छैन</strong>। नयाँ नामको पृष्ठ पहिलेबाट भएर पनि यदि यो खालि छ अथवा अनुप्रेषित छ र सम्पादित इतिहास छैन भनें सारिनेछ।\nयसको अर्थ हुन्छ यदि कुनै गल्ती गरेमा तपाईंले पुनः पुरानै नाम दिनु पर्ने हुन्छ यसलाई अधिलेखन गर्नसक्नु हुनेछैन। \n\n<strong>चेतावनी!</strong>\nयो एक लोकप्रिय पृष्ठको लागि एउटा कठोर र अप्रत्याशित परिवर्तन हुनसक्नेछ;\nकृपया सुनिश्चित गर्नुहोस् कि तपाईंले यसको सही परिणाम बुझ्नु भएको छ अनि मात्र नयाँ नाम दिन अघि बढ्नुहोस्।",
        "movepagetext-noredirectfixer": "तल दिइएको फारमले पृष्ठको नाम परिवर्तन गर्नेछ, उसको सबै इतिहास पनि नयाँ नामले देखिनेछ ।\nपुरानो शीर्षक नयाँ नाममा अनुप्रेषण गर्नेछ ।\nमूल शीर्षक तर्फ लिएर जाने सबै अनुप्रेषणहरूलाई तपाईं स्वचालित रूपले परिवर्तन गर्न सक्नुहुन्छ ।\nयदि तपाईं यसो गर्नुहुन्न भने कृपया [[Special:DoubleRedirects|दोहोरो]] पुनर्निर्देशन वा [[Special:BrokenRedirects|टुटेको पुनर्निर्देशन]]को लागि पक्कै जाँच गर्नुहोस् ।\nलिङ्क आफ्नो स्थानमै रहोस्, यो सुनिश्चित गर्ने जिम्मेवारी तपाईंको हो ।\n\nयदि नयाँ शीर्षकको लेख पहिले देखि छ भने नाम परिवर्तन '''हुन''' सक्दैन । तर यदि नयाँ शीर्षक भएको लेख खाली छ अथवा कतै अन्य स्थानमा अनुप्रेषित गर्दैछ र साथै उसको पुरानो संस्करण छैन भने त्यसको नाम परिवर्तन हुनेछ ।\nयसको अभिप्राय यो हो कि यदि तपाईंद्वारा गल्ती भएको छ भने तपाईं फेरी पुरानो नाममा यस पृष्ठलाई सार्न सक्नुहुन्छ, र साथै तपाईं कुनै पहिले देखि रहेको पृष्ठको सट्टा यो स्थानान्तरण गर्न सक्नुहुन्न।\n\n<strong>चेतावनी!<strong>\nयदि पृष्ठ खासै लोकप्रिय छ भने त्यसको लागि यो एउटा ठुलो र अकस्मात परिवर्तन हुन सक्छ;\nअगाडी बढ्नु भन्दा पहिले तपाईं यसको नतिजासँग परिचित हुनुहुन्छ।",
        "movepagetalktext": "संबद्ध वार्तालाप पृष्ठ स्वतः योसित जानेछ '''यदि'''\n* नयाँ नामको पृष्ठको वार्तालाप पृष्ठ रिक्त छैन अथवा\n* तपाईंले यसको सन्दूकमा अनचेक गर्नुहुन्छ भनें '''वार्तालाप पृष्ठ जानेछैन'''। \n\nयस्तो भएमा, तपाईंको इच्छाले आफैंले (manually) पृष्ठ सार्नु अथवा मिलाउनु पर्ने हुन्छ।",
-       "movearticle": "पृष्ठ सार्नुहोस्",
        "moveuserpage-warning": "'''चेतावनी:''' तपाईंले प्रयोगकर्ता पृष्ठ सार्न आँट्नु भएकोछ। कृपया याद राख्नुहोस् पृष्ठ मात्र सारिने छ र प्रयोगकर्ताको अर्को नाम राख्न '''सकिंदैन'''।",
        "movecategorypage-warning": "<strong>चेतावनी:</strong> तपाईं एउटा श्रेणी पृष्ठलाई स्थानान्तरित गर्न जादै हुनुहुन्छ। याद राख्नुहोस् कि मात्रै यो पृष्ठ स्थानान्तरित हुनेछ र पुरानो श्रेणीमा सामेल पृष्ठ नयाँ श्रेणी अन्तर्गत <em>जाने</em> छैन।",
        "movenologintext": "पृष्ठ सार्नको लागि तपाईं दर्ता गरिएको र [[Special:UserLogin|प्रवेश गरेको]] प्रयोगकर्ता हुनुपर्छ ।",
        "api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
        "api-error-badtoken": "आन्तरिक समस्याः खराब टोकन ।",
        "api-error-copyuploaddisabled": "यस सर्वरमा URL द्वारा अपलोड गर्ने व्यवस्था निस्क्रिय गरिएकोछ।",
-       "api-error-duplicate": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको [$2 अर्को फाइल छ]|भएका  [$2 केहि अरु फाइलहरू छन्]}} ।",
-       "api-error-duplicate-archive": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको [$2 अर्को फाइल थियो]|भएका  [$2 केहि अरु फाइलहरू थिए]}} ।\nतर {{PLURAL:$1|यो मेटाइएको थियो|यी मेटाइएका थिए}} ।",
-       "api-error-duplicate-archive-popup-title": "पहिले  {{PLURAL:$1|मेटाइएको फाइलको|मेटाइएका फाइलहरूको}} नकल प्रति बनाउने।",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|फाइल|फाइलहरू}} नकल प्रति बनाउने",
+       "api-error-duplicate": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको अर्को फाइल छ|भएका  केहि अरु फाइलहरू छन्}} ।",
+       "api-error-duplicate-archive": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको अर्को फाइल थियो|भएका  केहि अरु फाइलहरू थिए}} ।\nतर {{PLURAL:$1|यो मेटाइएको थियो|यी मेटाइएका थिए}} ।",
        "api-error-empty-file": "तपाईंले बुझाएको फाइल खालि छ।",
        "api-error-emptypage": "नयाँ तयार गर्दै, खाली पृष्ठ तयार गर्न अनुमति छैन ।",
        "api-error-fetchfileerror": "आन्तरिक समस्याः फाइल तान्दा केही कुरा गलत भएछ ।",
index 01adf4e..6c0a4a2 100644 (file)
@@ -69,7 +69,8 @@
                        "Kthoelen",
                        "Mbch331",
                        "Esketti",
-                       "M!dgard"
+                       "M!dgard",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "nstab-template": "Sjabloon",
        "nstab-help": "Hulppagina",
        "nstab-category": "Categorie",
+       "mainpage-nstab": "Hoofdpagina",
        "nosuchaction": "Opgegeven handeling bestaat niet",
        "nosuchactiontext": "De opdracht in de URL is ongeldig.\nMogelijk heeft u een typefout gemaakt in de URL of een onjuiste koppeling gevolgd.\nHet kan ook wijzen op een fout in de software van {{SITENAME}}.",
        "nosuchspecialpage": "Deze speciale pagina bestaat niet",
        "mergehistory-go": "Samenvoegbare bewerkingen bekijken",
        "mergehistory-submit": "Versies samenvoegen",
        "mergehistory-empty": "Er zijn geen versies die samengevoegd kunnen worden.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] zijn samengevoegd naar [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 zijn samengevoegd naar [[:$2]].",
        "mergehistory-fail": "Kan geen geschiedenis samenvoegen, controleer opnieuw de pagina- en tijdinstellingen.",
        "mergehistory-fail-toobig": "Niet in staat om geschiedenis samen te voegen omdat meer dan de limiet van $1 {{PLURAL:$1|versie wordt|versie worden}} verplaatst.",
        "mergehistory-no-source": "De bronpagina $1 bestaat niet.",
        "columns": "Kolommen:",
        "searchresultshead": "Zoekresultaten",
        "stub-threshold": "Drempel voor markering als <a href=\"#\" class=\"stub\">beginnetje</a>:",
+       "stub-threshold-sample-link": "voorbeeld",
        "stub-threshold-disabled": "Uitgeschakeld",
        "recentchangesdays": "Aantal dagen weer te geven in de recente wijzigingen:",
        "recentchangesdays-max": "(maximaal $1 {{PLURAL:$1|dag|dagen}})",
        "group-bot": "bots",
        "group-sysop": "beheerders",
        "group-bureaucrat": "bureaucraten",
-       "group-suppress": "toezichthouders",
+       "group-suppress": "Toezichthouders",
        "group-all": "(iedereen)",
        "group-user-member": "{{GENDER:$1|gebruiker}}",
        "group-autoconfirmed-member": "{{GENDER:$1|autobevestigde gebruiker}}",
        "upload-http-error": "Er is een HTTP-fout opgetreden: $1",
        "upload-copy-upload-invalid-domain": "Uploaden per kopie is niet beschikbaar vanuit dit domein.",
        "upload-dialog-title": "Bestand uploaden",
-       "upload-dialog-error": "Er is een fout opgetreden",
-       "upload-dialog-warning": "Een waarschuwing is opgetreden",
        "upload-dialog-button-cancel": "Annuleren",
        "upload-dialog-button-done": "Afgerond",
        "upload-dialog-button-save": "Opslaan",
        "upload-dialog-button-upload": "Upload",
-       "upload-dialog-label-select-file": "Selecteer bestand",
-       "upload-dialog-label-infoform-title": "Details",
-       "upload-dialog-label-infoform-name": "Naam",
-       "upload-dialog-label-infoform-description": "Beschrijving",
-       "upload-dialog-label-usage-title": "Gebruik",
-       "upload-dialog-label-usage-filename": "Bestandsnaam",
+       "upload-process-error": "Er is een fout opgetreden",
+       "upload-process-warning": "Een waarschuwing is opgetreden",
+       "upload-form-label-select-file": "Selecteer bestand",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Naam",
+       "upload-form-label-infoform-description": "Beschrijving",
+       "upload-form-label-usage-title": "Gebruik",
+       "upload-form-label-usage-filename": "Bestandsnaam",
+       "foreign-structured-upload-form-label-own-work": "Dit is mijn eigen werk",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorieën",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
        "backend-fail-stream": "Het was niet mogelijk het bestand \"$1\" te streamen.",
        "backend-fail-backup": "Het was niet mogelijk een reservekopie van het bestand $1 te maken.",
        "backend-fail-notexists": "Het bestand $1 bestaat niet.",
        "filerevert-legend": "Bestand terugdraaien",
        "filerevert-intro": "U bent '''[[Media:$1|$1]]''' aan het terugdraaien tot de [$4 versie op $2, $3].",
        "filerevert-comment": "Reden:",
-       "filerevert-defaultcomment": "Teruggedraaid tot de versie op $1 om $2",
+       "filerevert-defaultcomment": "Teruggedraaid tot de versie op $1 om $2 ($3)",
        "filerevert-submit": "Terugdraaien",
        "filerevert-success": "'''[[Media:$1|$1]]''' is teruggedraaid tot de [$4 versie op $2, $3].",
        "filerevert-badversion": "Er is geen vorige lokale versie van dit bestand met het opgegeven tijdstip.",
        "movepagetext": "Door middel van het onderstaande formulier kunt u een pagina hernoemen.\nDe geschiedenis gaat mee naar de nieuwe pagina.\n* De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\n* Koppelingen naar de oude pagina worden niet aangepast.\n* De pagina's die doorverwijzen naar de oorspronkelijke paginanaam worden automatisch bijgewerkt.\nAls u dit niet wenst, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\n\n'''Waarschuwing!'''\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
        "movepagetext-noredirectfixer": "Door middel van het onderstaande formulier kunt u een pagina en alle bijbehorende oude versies hernoemen.\nDe oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\nControleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\nU kunt dus een pagina die per ongeluk is hernoemd terug hernoemen en u kunt een bestaande pagina niet overschrijven. \n\n'''Waarschuwing!'''\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
        "movepagetalktext": "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':\n* De overlegpagina onder de nieuwe naam al bestaat;\n* U het onderstaande vinkje deselecteert.\n\nIn die gevallen moet u de pagina handmatig hernoemen of samenvoegen.",
-       "movearticle": "Te hernoemen pagina:",
        "moveuserpage-warning": "'''Waarschuwing:''' u gaat een gebruikerspagina hernoemen. Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
        "movecategorypage-warning": "<strong>Waarschuwing:</strong> U staat op het punt een categoriepagina te hernoemen. Houdt u er rekening mee dat alleen de categoriepagina zelf hernoemd wordt; pagina's in de oude categorie worden <em>niet</em> automatisch naar de nieuwe verplaatst.",
        "movenologintext": "U moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.",
        "cant-move-to-user-page": "U hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk.",
        "cant-move-category-page": "U hebt geen rechten om categoriepagina's te hernoemen.",
        "cant-move-to-category-page": "U hebt geen rechten om een pagina naar een categoriepagina te hernoemen.",
-       "newtitle": "Naar de nieuwe paginanaam:",
+       "newtitle": "Nieuwe paginanaam:",
        "move-watch": "Bronpagina en doelpagina volgen",
        "movepagebtn": "Pagina hernoemen",
        "pagemovedsub": "De pagina is hernoemd",
        "api-error-badaccess-groups": "U mag geen bestanden uploaden in deze wiki.",
        "api-error-badtoken": "Interne fout: het token klopt niet.",
        "api-error-copyuploaddisabled": "Uploaden via URL is uitgeschakeld op deze server.",
-       "api-error-duplicate": "Er {{PLURAL:$1|staat al [$2 een bestand]|staan al [$2 bestanden]}} met dezelfde inhoud in de wiki.",
-       "api-error-duplicate-archive": "Er {{PLURAL:$1|was al [$2 een ander bestand]|waren al [$2 $1 andere bestanden]}}  op de site met dezelfde inhoud, maar {{PLURAL:$1|dat is|die zijn}} verwijderd.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplicaatbestand dat al verwijderd is|Duplicaatbestanden die al verwijderd zijn}}",
-       "api-error-duplicate-popup-title": "Zelfde {{PLURAL:$1|bestand|bestanden}}",
+       "api-error-duplicate": "Er {{PLURAL:$1|staat al een bestand|staan al bestanden}} met dezelfde inhoud in de wiki.",
+       "api-error-duplicate-archive": "Er {{PLURAL:$1|was al een ander bestand|waren al $1 andere bestanden}}  op de site met dezelfde inhoud, maar {{PLURAL:$1|dat is|die zijn}} verwijderd.",
        "api-error-empty-file": "Het bestand dat u hebt geüpload is leeg.",
        "api-error-emptypage": "Het aanmaken van nieuwe, lege pagina's is niet toegestaan.",
        "api-error-fetchfileerror": "Interne fout: er is iets misgegaan bij het ophalen van het bestand.",
index 4d13fb7..20cb80d 100644 (file)
@@ -23,7 +23,8 @@
                        "아라",
                        "Gaute",
                        "Macofe",
-                       "Chameleon222"
+                       "Chameleon222",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Strek under lenkjer:",
        "mergehistory-go": "Vis flettbare endringar",
        "mergehistory-submit": "Flett versjonane",
        "mergehistory-empty": "Ingen endringar kan flettast.",
-       "mergehistory-success": "{{PLURAL:$3|Éin versjon|$3 versjonar}} av [[:$1]] er fletta til [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Éin versjon|$3 versjonar}} av $1 er fletta til [[:$2]].",
        "mergehistory-fail": "Kunne ikkje utføre fletting av historikkane, ver venleg og dobbelsjekk sidene og versjonane du har valt.",
        "mergehistory-no-source": "Kjeldesida $1 finst ikkje.",
        "mergehistory-no-destination": "Målsida $1 finst ikkje.",
        "filerevert-legend": "Rull attende fila",
        "filerevert-intro": "Du rullar attende '''[[Media:$1|$1]]''' til [$4 versjonen frå $3, $2].",
        "filerevert-comment": "Årsak:",
-       "filerevert-defaultcomment": "Rulla attende til versjonen frå $2, $1",
+       "filerevert-defaultcomment": "Rulla attende til versjonen frå $2, $1 ($3)",
        "filerevert-submit": "Rull attende",
        "filerevert-success": "'''[[Media:$1|$1]]''' er rulla attende til [$4 versjonen frå $3, $2].",
        "filerevert-badversion": "Det finst ingen tidlegare lokal versjon av denne fila frå det oppgjevne tidspunktet.",
        "movepagetext": "Ved å bruka skjemaet nedanfor kan du få omdøypt ei side og flytt heile historikken til det nye namnet.\nDen gamle tittelen vil verta ei omdirigeringsside til den nye.\nDu kan oppdatera omdirigeringar som peikar til den opphavlege tittelen automatisk.\nVel du å ikkje gjera dette, pass på å sjå etter [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|øydelagde omdirigeringar]].\n\nMerk at sida '''ikkje''' vert flytt dersom det alt finst ei side med den nye tittelen, minder målsida er ei omdirigering og ikkje har nokon endringshistorikk. Detter tyder at du kan omdøypa ei side attende til der ho vart omdøypt frå om du gjorde eit mistak, og du kan ikkje skriva over sider som finst.\n\n'''ÅTVARING!'''\nDette kan vera ei drastisk og uventa endring for ei populær side; ver viss på at du skjøner konsekvensane av dette før du held fram.",
        "movepagetext-noredirectfixer": "Nyttar ein skjemaet under får ein døypt om ei side og flytt heile historikken til det nye namnet. \nDen gamle tittelen vil verta ei omdirigeringsside for den nye tittelen. \nPass på å sjå etter [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|uverksame]] omdirigeringar. \nDu er ansvarleg for at alle lenkjene stadig peikar dit det er meininga at dei skal føra.\n\nMerk at sida '''ikkje''' vert flytt dersom det alt finst ei side med den nye tittelen, om ho då ikkje er tom eller ei omdirigeringsside utan endringshistorikk.\nDette vil seia at du kan døypa om ei side til det gamle namnet hennar om du gjer ein feil, og dessutan at du ikkje kan skriva over ei side som finst.\n\n'''ÅTVARING!'''\nDette kan vera ei drastisk og uventa endring for ei populær side;\nver viss på at du skjøner konsekvensane av flyttinga før du held fram.",
        "movepagetalktext": "Den tilhøyrande diskusjonssida, om ho finst, vert automatisk flytt med sida '''minder:'''\n*ei ikkje-tom diskusjonsside alt finst under det nye namnet, eller\n*du fjernar avhakinga i boksen nedanfor.\n\nI desse falla lyt du flytta eller fletta sida manuelt, om ynskjeleg.",
-       "movearticle": "Flytt side:",
        "moveuserpage-warning": "'''Åtvaring:''' Du er i ferd med å flytta ei brukarside. Merk at berre sida vert flytt og at brukarnamnet '''ikkje''' vert endra.",
        "movecategorypage-warning": "<strong>Åtvaring:</strong> Du er i ferd med å flytta ei kategoriside. Merk at berre kategorisida vert flytt og at sider i den gamle kategorien <em>ikkje</em> vert omkategoriserte til den nye kategorien.",
        "movenologintext": "Du lyt vera registrert brukar og vera [[Special:UserLogin|innlogga]] for å flytte ei side.",
        "api-error-badaccess-groups": "Du har ikkje løyve til å lasta opp filer til wikien.",
        "api-error-badtoken": "Intern feil: ugild token.",
        "api-error-copyuploaddisabled": "Opplasting etter URL er avslege på tenaren.",
-       "api-error-duplicate": "Det finst {{PLURAL:$1|[$2 ei anna fil]|[$2 andre filer]}} på nettstaden med same innhaldet.",
-       "api-error-duplicate-archive": "Det fanst {{PLURAL:$1|[$2 ei anna fil]|[$2 andre filer]}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Tvifelt fil|Tvifelte filer}} som alt er sletta",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Tvifelt fil|Tvifelte filer}}",
+       "api-error-duplicate": "Det finst {{PLURAL:$1|ei anna fil|andre filer}} på nettstaden med same innhaldet.",
+       "api-error-duplicate-archive": "Det fanst {{PLURAL:$1|ei anna fi]|andre file]}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.",
        "api-error-empty-file": "Fila du sende var tom.",
        "api-error-emptypage": "Det er ikkje tillate å oppretta nye tomme sider.",
        "api-error-fetchfileerror": "Intern feil: Noko gjekk gale då fila vart henta.",
index 449d7a1..c7923ee 100644 (file)
@@ -4,7 +4,8 @@
                        "Kaganer",
                        "Mohau",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Tsenya mothalafase go dihlomaganyo:",
        "sharedupload-desc-here": "Letlakala le letšwa $1 ebile le ka ba ke šumišwa ke di  projeke tše dingwe.\n Tlhaloso ya [letlakala $2 tlhaloso ya faele] le laetšwa kago latela.",
        "uploadnewversion-linktext": "Lokela peoletšo ye mphsa ya faele",
        "filerevert-comment": "Lebaka:",
-       "filerevert-defaultcomment": "Boela go poeletšo ya go tloga go $2, $1",
+       "filerevert-defaultcomment": "Boela go poeletšo ya go tloga go $2, $1 ($3)",
        "filedelete": "Phumula $1",
        "filedelete-legend": "Phumula faele",
        "filedelete-intro": "O phumula <strong>[[Media:$1|$1]]</strong> le histori ya yona.",
        "unusedtemplates": "''templates'' tša go se šomišwe",
        "unusedtemplateswlh": "dihlomaganyo tše dingwe",
        "randompage": "Letlakala le lengwe le le lengwe",
+       "randomincategory-submit": "Sepela",
        "randomredirect": "''redirect'' engwe le engwe",
        "statistics": "Dipalopalo",
        "statistics-header-users": "Dipalopalo tša mošomiši",
        "listusers-submit": "Bontšha",
        "listgrouprights-members": "(Lenano la ditho)",
        "emailuser": "Romela mošomiši yo molaetša",
-       "emailpage": "Romela email go mošomiši",
        "noemailtitle": "Gago email atrese",
        "emailfrom": "Go tšwa go:",
        "emailsubject": "Sebolelwa:",
        "move-page-legend": "Huduša letlakala",
        "movepagetext": "Ge o šomiša fomo ye mo tlase, letlakala le kgale le history ya lona di tla huduga go ya letlakaleng le lemphsa.\nLetlakala la kgale le ba ''redirect'' go ya letlakaleng le lemphsa.\nDihlomaganyo goya letlakaleng la kgale ga di fetolwe; gopola go sekaseka di [[Special:DoubleRedirects|''double'']] goba [[Special:BrokenRedirects|''broken redirects'']].\n\nKe boikarabela ba gago go kgonthišisa gore dihlomaganyo di tšhwela pele go šupa mowe di swanetšego goya.\n\nEla hloko gore letlakala le '''ka se''' hudušwe gaeba go ena letlakala la leina le lemphsa, ntle ga le sa selo goba ele ''redirect'' ebile le sa na histori.\nSe sera gore o ka huduša letlakala morago ge o direle phošo gape o ka se ngwale godimo (''overwrite'') ga letlakala leo le lego gona.\n\n'''TEMOŠO!'''\nSe sekapa le dipheto tšeo di sa letelwago go matlakala atumilego;\nKa kgopelo kgontišiša gore o kwešiša ditla morago tša se, pele o tšwelapele.",
        "movepagetalktext": "Letlakala la dipoledišano lago hlobana le letlakala le le tla hudušwa '''ntle le ge''':\n\n*Ge letlakala la dipoledišano la leina le lemphsa lephela, goba\n*O sa kgetha go le huduša tlase ga letlakala le.\n\nGe go le bjalo,o tla swanela ke go huduša goba go kopanya matlakala ka bowena.",
-       "movearticle": "Huduša letlakala:",
        "newtitle": "Goya go taetlile:",
        "move-watch": "Tlhapetša letlakala le",
        "movepagebtn": "Huduša letlakala",
index 5b54f9d..f2ea42b 100644 (file)
@@ -12,7 +12,9 @@
                        "Spacebirdy",
                        "Горан Анђелковић",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Soslinhar los ligams :",
        "mergehistory-go": "Veire las edicions fusionablas",
        "mergehistory-submit": "Fusionar las revisions",
        "mergehistory-empty": "Cap de revision pòt pas èsser fusionada.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} de [[:$1]] {{PLURAL:$3|fusionada|fusionadas}} amb succès amb [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} de $1 {{PLURAL:$3|fusionada|fusionadas}} amb succès amb [[:$2]].",
        "mergehistory-fail": "Impossible de procedir a la fusion dels istorics. Seleccionatz  tornamai la pagina e mai los paramètres de data.",
        "mergehistory-fail-toobig": "Impossible d’efectuar la fusion de l’istoric perque un nombre de {{PLURAL:$1|revisions}} superior al limit de $1 deuriá èsser desplaçat.",
        "mergehistory-no-source": "La pagina d'origina $1 existís pas.",
        "filerevert-legend": "Revocar lo fichièr",
        "filerevert-intro": "Anatz revocar '''[[Media:$1|$1]]''' fins a [$4 la version del $2 a $3].",
        "filerevert-comment": "Motiu :",
-       "filerevert-defaultcomment": "Revocat fins a la version del $1 a $2",
+       "filerevert-defaultcomment": "Revocat fins a la version del $1 a $2 ($3)",
        "filerevert-submit": "Revocar",
        "filerevert-success": "'''[[Media:$1|$1]]''' es estat revocat fins a [$4 la version del $2 a $3].",
        "filerevert-badversion": "I a pas de version mai anciana del fichièr amb lo Timestamp donat.",
        "move-page-legend": "Tornar nomenar una pagina",
        "movepagetext": "Utilizatz lo formulari çaijós per tornar nomenar una pagina, en desplaçant tot son istoric cap al nom novèl. Lo títol ancian vendrà una pagina de redireccion cap al títol novèl. Podètz metre a jorn automaticament las redireccions actualas que puntan cap al títol original. Se causissètz de lo far pas, asseguratz-vos de verificar tota [[Special:DoubleRedirects|redireccion dobla]] o [[Special:BrokenRedirects|redireccion copada]]. Avètz la responsabilitat de vos assegurar que los ligams contunhen de puntar cap a lor destinacion supausada.\n\nNotatz que la pagina serà '''pas''' renomada s'existís ja una pagina amb lo novèl títol, levat se aquesta darrièra a un istoric de modificacions verge e es una simpla redireccion. Aquò permet de renomenar una pagina cap a sa posicion d'origina se lo desplaçament s'avera erronèu.\n\n'''ATENCION !'''\nAquò pòt provocar un cambiament radical e imprevist per una pagina consultada frequentament ; asseguratz-vos de n'aver comprés las consequéncias abans de contunhar.",
        "movepagetalktext": "La pagina de discussion associada, se presenta, serà automaticament desplaçada amb ''' levat se :'''\n*Desplaçatz una pagina cap a un autre espaci,\n*Una pagina de discussion ja existís amb lo nom novèl, o\n*Avètz deseleccionat lo boton çaijós.\n\nDins aqueste cas, vos caldrà desplaçar o fusionar la pagina manualament se o volètz.",
-       "movearticle": "Tornar nomenar l'article",
        "moveuserpage-warning": "'''Atencion :''' Sètz a mand de tornar nomenar una pagina d’utilizaire. Notatz que sola la pagina serà renomenada e que l’utilizaire '''ne''' serà '''pas''' renomenat.",
        "movenologintext": "Per poder renomenar una pagina, vos cal èsser [[Special:UserLogin|indentific{{GENDER:||t|da)}}]]\nen tant qu'utilizaire enregistrat amb pro d'ancianetat.",
        "movenotallowed": "Avètz pas la permission de renomenar de paginas.",
        "api-error-badaccess-groups": "Sètz pas autorizat a cargar de fichièrs sus aqueste wiki.",
        "api-error-badtoken": "Error intèrna : marrit « geton ».",
        "api-error-copyuploaddisabled": "Los cargaments via URL son desactivats sus aqueste servidor.",
-       "api-error-duplicate": "I a ja {{PLURAL:$1|[$2 un autre fichièr present]|[$2 d'autres fichièrs presents]}} sul site amb lo meteis contengut.",
-       "api-error-duplicate-archive": "I aviá ja {{PLURAL:$1|[$2 un autre fichièr present]|[$2 d'autres fichièrs presents]}} sul site amb lo meteis contengut, mas {{PLURAL:$1|es estat suprimit|son estats suprimits}}.",
-       "api-error-duplicate-archive-popup-title": "Duplicar {{PLURAL:$1|lo fichièr|los fichièrs}} que {{PLURAL:$1|ja es estat suprimit|je son estats suprimits}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|fichièr|fichièrs}} en doble",
+       "api-error-duplicate": "I a ja {{PLURAL:$1|un autre fichièr present|d'autres fichièrs presents}} sul site amb lo meteis contengut.",
+       "api-error-duplicate-archive": "I aviá ja {{PLURAL:$1|un autre fichièr present|d'autres fichièrs presents}} sul site amb lo meteis contengut, mas {{PLURAL:$1|es estat suprimit|son estats suprimits}}.",
        "api-error-empty-file": "Lo fichièr qu'avètz somés èra void.",
        "api-error-emptypage": "Creacion de paginas voidas pas autorizada.",
        "api-error-fetchfileerror": "Error intèrna : Quicòm s'es mal passat al moment de la recuperacion del fichièr.",
index 0f38416..56eca63 100644 (file)
@@ -8,16 +8,31 @@
                ]
        },
        "tog-underline": "Linkien alleviivuamine:",
-       "tog-hideminor": "Peittiä pienet muutokset uuvet muutokset -listaspäi",
-       "tog-hidepatrolled": "Peittiä tarkastetut muutokset uvvet muutokset -listaspäi",
-       "tog-newpageshidepatrolled": "Peittiä tarkastetut sivut uuzien sivuloin listalpäi",
+       "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-extendwatchlist": "Levitä valvonduluvettelo ku ozuttua kai muutokset, ei vaiku jälgimäzii",
+       "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-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-watchdeletion": "Ližiä minun iäreotetut sivut da failat minun valvonduluvetteloh",
+       "tog-watchrollback": "Ližiä tarkailuluvetteloh net sivut, kudamis olen käyttänyh mene järilleh -toiminduo.",
+       "tog-minordefault": "Merkiče kai muutokset automuattizesti pienikse muutoksikse",
+       "tog-previewontop": "Ozuta ezikačondu enne kirjutusalovehtu",
+       "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-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-uselivepreview": "Käytä välittömiä ezikaččeluu",
+       "tog-forceeditsummary": "Huomavuta minuu, gu en olle kirjutannuh yhtehveduo",
+       "tog-watchlisthideown": "Peittiä minun korjavukset valvonduluvettelospä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",
@@ -27,7 +42,8 @@
        "tog-norollbackdiff": "Älä ozuta eroloi, konzu olet ottanuh järilleh aijemban versien järilleh tuondu -toimindol",
        "underline-always": "Ainos",
        "underline-never": "Nikonzu",
-       "editfont-style": "Edituičendualovehen kirjainstiilu:",
+       "editfont-style": "Edituičendualovehen kirjainstiil'u:",
+       "editfont-default": "Livaimen piäazetus",
        "editfont-sansserif": "Sans-serif -fontu",
        "editfont-serif": "Serif-fontu",
        "sunday": "Pyhäpäivy",
        "category-media-header": "Medii kategouries \"$1\"",
        "hidden-categories": "{{PLURAL:$1|Peitetty kategourii|Peitetyt kategouriet}}",
        "hidden-category-category": "Peitetyt kategouriet",
-       "category-subcat-count": "{{PLURAL:$2|Täs kategouries on vaiku tämä alikategourii.|Täs kategouries on nämmä {{PLURAL:$1|subcategory|$1 alikategouriet}}, kaikkiedah $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|Täs kategouries on vaiku tämä alikategourii.|Täs kategouries on nämmä {{PLURAL:$1|subcategory|$1 alikategouriedu}}, kaikkiedah $2.}}",
        "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-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.}}",
        "listingcontinuesabbrev": "(jatko)",
        "index-category": "Indeksiruitut sivut",
        "noindex-category": "Indeksiruičemattomat sivut",
-       "broken-file-category": "Sivut, kudamil on ruadamattomii failulinkilöi",
+       "broken-file-category": "Sivut, kudamil on avuamattomii failulinkilöi",
        "about": "Tieduo sovellukses",
        "article": "Yhtevyssivu",
        "newwindow": "(avata uvves ikkunas)",
        "morenotlisted": "Tämä listu ei ole valmis.",
        "mypage": "Sivu",
        "mytalk": "Pagin",
-       "anontalk": "Paginsivutälle IP-adressile",
+       "anontalk": "Paginsivu tälle IP-adressile",
        "navigation": "Navigatsii",
        "and": "&#32;da",
        "qbfind": "Eči",
        "redirectedfrom": "(siirretty $1:späi)",
        "redirectpagesub": "uvvellehohjavussivu",
        "redirectto": "Uvvellehohjuau sivuh:",
-       "lastmodifiedat": "Tädä sivuu on muutettu jälgimäizen kerran $1, $2 aigah.",
+       "lastmodifiedat": "Tädä sivuu on muutettu jälgimäzen kerran $1, $2 aigah.",
        "protectedpage": "Suojattu sivu",
        "jumpto": "Siirry",
        "jumptonavigation": "navigatsii",
        "nstab-template": "Šablon",
        "nstab-help": "Abusivu",
        "nstab-category": "Kategourii",
+       "mainpage-nstab": "Piäsivu",
        "nosuchaction": "Nengostu toiminduo ei ole",
        "error": "Haireh",
        "databaseerror": "Tiedokanduhaireh",
        "internalerror": "Syväindölline haireh",
        "internalerror_info": "Syväindölline haireh: $1",
        "filecopyerror": "Failua \"$1\" ei voitu kopiruija failakse \"$2\".",
-       "filerenameerror": "Ei voi uvvellehnimittoä \"$1\"-failua nimele \"$2\".",
+       "filerenameerror": "Ei voi uvvellehnimittiä \"$1\"-failua nimele \"$2\".",
        "filedeleteerror": "Failua \"$1\" ei voitu ottua iäre.",
        "directorycreateerror": "Ei voi luadie al'bomua \"$1\".",
        "directoryreadonlyerror": "Al'bom $1 on kirjutussuojattu.",
        "createacct-email-ph": "Kirjuta sinun sähköpoštuadressu",
        "createacct-another-email-ph": "Kirjuta sinun sähköpoštuadressu",
        "createacct-realname": "Tovelline nimi (omatahtoine tiedo)",
+       "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 toine tili",
+       "createacct-another-submit": "Luaji tili",
        "createacct-benefit-heading": "Sivun {{SITENAME}} ollah luajittu sinunjyttymät rahvas.",
        "createacct-benefit-body1": "{{PLURAL:$1|kohennus|kohendustu}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sivu|sivuu}}",
        "createacct-benefit-body3": "{{PLURAL:$1|Jälgimäime käyttäi|Jälgimäzet käyttäjät}}",
        "badretype": "Sinun kirjutetut peittosanat ei oldu yhtenjyttymät.",
+       "usernameinprogress": "Tunnuksen luadimine tälle käyttäinimele on nygöi kesken. Ole hyvä da vuota.",
+       "userexists": "Syötetty käyttäjän nimi on jo käytös. Ole hyvä, keksi toine nimi.",
        "loginerror": "Kirjuttuanduhaireh",
        "createacct-error": "Haireh käyttäitunnuksen luadimizes",
        "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.",
        "nouserspecified": "Käyttäinimi pidäy.",
        "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",
-       "passwordremindertitle": "Uusi 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 dajatkua vahnan peittosanan käyttyö.",
+       "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ö.",
        "mailerror": "Haireh työndäjes sähköpoštua: $1",
+       "emaildisabled": "Tämä verkosivusto ei voi työndiä sähköpoštuviestilöi.",
        "accountcreated": "Tili luajittu",
+       "createaccount-title": "{{SITENAME}}: käyttäitunnuksen luadimine",
        "loginlanguagelabel": "Kieli: $1",
        "pt-login": "Kirjuttai",
        "pt-login-button": "Kirjuttai",
        "pt-userlogout": "Kirjuttai ullos",
        "user-mail-no-addy": "Opit työndiä sähköpoštan sähköpoštuadressittah.",
        "changepassword": "Vaihta peittosana",
+       "resetpass_announce": "Suaja sizähkirjuamine loppuh, sinul pidäy keksie uuzi peittosana.",
        "resetpass_header": "Vaihta tilin peittosana",
        "oldpassword": "Vahnu peittosana:",
        "newpassword": "Uuzi peittosana:",
+       "retypenew": "Kirjuta peittosana uvvessah:",
+       "resetpass_submit": "Azeta peittosana da kirjuttai sistiemah:",
        "changepassword-success": "Sinun peittosana on vaihtettu!",
        "resetpass_forbidden": "Ei voi vaihtua peittosanua",
        "resetpass-no-info": "Et voi nähtä tädä sivuu kuni et ole kirjutannuhes.",
        "passwordreset-domain": "Domain:",
        "passwordreset-email": "Sähköpoštuadressu:",
        "passwordreset-emailelement": "Käyttäinimi: \n$1\n\nVäliaigaine peittosana: \n$2",
-       "changeemail": "Vaihta sähköpoštuadressu",
+       "changeemail": "Vaihta libo ota iäre sähköpoštuadressu",
        "changeemail-oldemail": "Nygöine sähköpoštuadressu:",
        "changeemail-newemail": "Uuzi sähköpoštuadressu:",
        "changeemail-none": "(niyhty)",
        "changeemail-password": "Sinun {{SITENAME}}-peittosana:",
        "changeemail-submit": "Vaihta sähköpoštu",
-       "changeemail-throttled": "Olet oppinuh kirjuttuakseh liijan moni kerdua. Ole hyvä, vuota $1 enne ku opit uvvelleh.",
+       "changeemail-throttled": "Olet oppinuh kirjuttuakseh liijan moni kerdua. Ole hyvä, vuota $1 enne ku opit uvvessah.",
        "resettokens-tokens": "Avaimet:",
        "bold_sample": "Lihavoitu tekstu",
        "bold_tip": "Lihavoitu tekstu",
        "watchthis": "Tarkaile tädä sivuu",
        "savearticle": "Tallenda sivu",
        "preview": "Ezikačo",
-       "showpreview": "Ezikaččo",
+       "showpreview": "Ezikačo",
        "showdiff": "Luajitut korjavukset",
        "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.",
        "blockedtitle": "Käyttäi on estetty",
        "loginreqlink": "kirjuttai",
        "accmailtitle": "Peittosana työtty",
        "newarticle": "(Uuzi)",
-       "newarticletext": "Olet puutunuh sivule, kudamua ei ole vie. Ku luadie sivu, zavodi kirjuttua al olijah juaššiekkah (kačo [$1 help page] ku suaha ližätieduo).\nKu puutuit tänne petties, painalda sinun livaimen <strong>järilleh</strong>-nyblyä.",
+       "newarticletext": "Olet puuttunuh sivule, kudamua vie ei ole. Ku luadie sivu, zavodi kirjuttua al olijah juaššiekkah (kačo [$1 ohjavosivulpäi] ližätieduo).\nKu ollet puuttunuh tänne petties, käytä livaimen <strong>mennä järilleh</strong>-toiminduo.",
        "noarticletext": "Täl sivul ei ole juuri nygöi tekstua.\nVoit [[Special:Search/{{PAGENAME}}|eččie sivun nimel]] toizis sivuloispäi,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie sidä koskijua logua],\nlibo [{{fullurl:{{FULLPAGENAME}}|action=edit}} korjata tädä sivuu]</span>.",
        "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.",
        "updated": "(Päivitetty)",
        "prefs-user-pages": "Käyttäisivut",
        "prefs-watchlist": "Valvondulistu",
        "prefs-resetpass": "Vaihta peittosana",
-       "prefs-changeemail": "Vaihta sähköpoštuadressu",
+       "prefs-changeemail": "Vaihta libo ota iäre sähköpoštuadressu",
        "prefs-setemail": "Kirjuta sähköpoštuadressu",
        "saveprefs": "Tallenda",
        "rows": "Riädyy:",
        "filename-tooshort": "Failunimi on liijan lyhyt.",
        "watchthisupload": "Valvo tädä failua",
        "upload-dialog-button-save": "Tallenda",
-       "upload-dialog-label-infoform-title": "Tiijot",
-       "upload-dialog-label-infoform-name": "Nimi",
-       "upload-dialog-label-infoform-description": "Kuvavus",
-       "upload-dialog-label-usage-title": "Käyttö",
-       "upload-dialog-label-usage-filename": "Failunimi",
+       "upload-form-label-infoform-title": "Tiijot",
+       "upload-form-label-infoform-name": "Nimi",
+       "upload-form-label-infoform-description": "Kuvavus",
+       "upload-form-label-usage-title": "Käyttö",
+       "upload-form-label-usage-filename": "Failunimi",
+       "foreign-structured-upload-form-label-own-work": "Tämä on minun oma ruado",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategouriet",
        "license-header": "Licenzii",
        "imgfile": "tiijosto",
        "listfiles_name": "Nimi",
index 017b910..2d78f6e 100644 (file)
@@ -13,7 +13,8 @@
                        "ଶିତିକଣ୍ଠ ଦାଶ",
                        "아라",
                        "Macofe",
-                       "Nistha.aslp"
+                       "Nistha.aslp",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "ଲିଙ୍କତଳେଗାର ଟାଣିବା:",
        "nstab-template": "ଛାଞ୍ଚ",
        "nstab-help": "ସାହାଯ୍ୟ ପୃଷ୍ଠା",
        "nstab-category": "ଶ୍ରେଣୀ",
+       "mainpage-nstab": "ପ୍ରଧାନ ପୃଷ୍ଠା",
        "nosuchaction": "ସେହିଭଳି କିଛି କାମ ନାହିଁ",
        "nosuchactiontext": "URL ଟିରେ ଦିଆଯାଇଥିବା କାମଟି ଅଚଳ ଅଟେ ।\nଆପଣ ବୋଧ ହୁଏ URL ଟି ଭୁଲ ତାଇପ କରିଥିବେ, ଅଥବା ଲିଙ୍କଟି ଭୁଲ ଥିବ ।\nଏହା ମଧ୍ୟ {{SITENAME}}ରେ ବ୍ୟବହାର କରାଯାଇଥିବା ସଫ୍ଟବେରରେ ଥିବା କିଛି ଭୁଲକୁ ସୂଚାଇପାରେ ।",
        "nosuchspecialpage": "ସେହି ଭଳି କିଛି ବି ବିଶେଷ ପୃଷ୍ଠା ନାହିଁ",
        "createacct-another-username-ph": "ଆପଣଙ୍କ ଇଉଜର ନାମ ଟାଇପ କରନ୍ତୁ",
        "yourpassword": "ପାସୱାର୍ଡ଼",
        "userlogin-yourpassword": "ପାସୱାର୍ଡ଼",
-       "userlogin-yourpassword-ph": "à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬¦à¬¿à¬\85ନ୍ତୁ",
+       "userlogin-yourpassword-ph": "à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬²à­\87à¬\96ନ୍ତୁ",
        "createacct-yourpassword-ph": "ପାସୱର୍ଡ଼ ଦିଅନ୍ତୁ",
        "yourpasswordagain": "ପାସୱାର୍ଡ଼ ଆଉଥରେ:",
        "createacct-yourpasswordagain": "ପାସୱର୍ଡ଼ ନିଶ୍ଚିତ କରିବେ",
-       "createacct-yourpasswordagain-ph": "ଆଉଥରେ ପାସୱର୍ଡ଼ ଦିଅନ୍ତୁ",
+       "createacct-yourpasswordagain-ph": "à¬\86à¬\89ଥରà­\87 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬¦à¬¿à¬\85ନà­\8dତà­\81",
        "remembermypassword": "ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ",
        "userlogin-remembermypassword": "ମୋତେ ଲଗ-ଇନ କରି ରଖିଥାନ୍ତୁ",
        "userlogin-signwithsecure": "ନିରାପଦ କନେକସନ ବ୍ୟବ‌ହାର କରନ୍ତୁ",
        "gotaccount": "ଆଗରୁ ଖାତାଟିଏ ଅଛି କି? $1.",
        "gotaccountlink": "ଲଗ ଇନ (Log in)",
        "userlogin-resetlink": "ଲଗଇନ ତଥ୍ୟ ସବୁ ଭୁଲିଗେଲେକି?",
-       "userlogin-resetpassword-link": "ପାସୱାରà­\8dଡ଼ à¬­à­\81ଲିଯାà¬\87à¬\9bନà­\8dତି ?",
+       "userlogin-resetpassword-link": "ପାସୱାରà­\8dଡ଼ à¬®à¬¨à­\87ପଡà­\81ନାହିà¬\81?",
        "userlogin-helplink2": "ଲଗ ଇନ ପାଇଁ ସହଯୋଗ କରନ୍ତୁ",
        "userlogin-loggedin": "ଆପଣ {{GENDER:$1|$1}} ନାମରେ ଲଗ ଇନ କରିଛନ୍ତି । ତଳ ଫର୍ମଟି ବ୍ୟବହାର କରି ଆଉ ଜଣେ ସଭ୍ୟ ଭାବେ ଲଗ ଇନ କରନ୍ତୁ ।",
        "userlogin-createanother": "ଆଉ ଏକ ଖାତା ତିଆରି କରନ୍ତୁ",
        "mergehistory-go": "ଯୋଡ଼ାଯାଇପାରିବା ଭଳି ସମ୍ପାଦନା",
        "mergehistory-submit": "ସଙ୍କଳନସବୁକୁ ମିଶାଇଦେବେ",
        "mergehistory-empty": "କୌଣସିଟି ବି ସଙ୍କଳାନ ମିଶାଯାଇପାରିବ ନାହିଁ ।",
-       "mergehistory-success": "[[:$1]]ର $3 {{PLURAL:$3|ଟି ସଙ୍କଳନ|ଟି ସଙ୍କଳନ}} [[:$2]] ସାଙ୍ଗରେ ଠିକଭାବେ ମିଶାଇ ଦିଆଗଲା ।",
+       "mergehistory-done": "$1ର $3 {{PLURAL:$3|ଟି ସଙ୍କଳନ|ଟି ସଙ୍କଳନ}} [[:$2]] ସାଙ୍ଗରେ ଠିକଭାବେ ମିଶାଇ ଦିଆଗଲା ।",
        "mergehistory-fail": "ଇତିହାସ ମିଶାଇବାରେ ବିଫଳ ହେଲୁ, ଦୟାକରି ପୃଷ୍ଠା ଓ  ସମୟ ନିର୍ଣ୍ଣାୟକ ଦେଖନ୍ତୁ ।",
        "mergehistory-fail-toobig": "$1 ଗୋଟି {{PLURAL:$1|ସଂସ୍କରଣ|ସଂସ୍କରଣ}} ଘୁଞ୍ଚାଇଦିଆଯିବା ହେତୁ  ଅଧିକ ପୃଷ୍ଠାର ଇତିହାସ ମିଶାଇବାରେ ବିଫଳ ହେଲୁ ।",
        "mergehistory-no-source": "ମୂଳ ପୃଷ୍ଠା $1ଟି ନାହିଁ ।",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ସଭ୍ୟ|ସଭ୍ୟଗଣା}}ଙ୍କୁ ଦେଖୁଅଛି]",
        "rc_categories": "ଶ୍ରେଣୀସମୂହ ପାଇଁ ସୀମା ( \"|\" ଦେଇ ଅଲଗା କରିବେ)",
        "rc_categories_any": "ଯେ କୌଣସି",
-       "rc-change-size-new": "ବଦଳପରେ $1 {{PLURAL:$1|byte|bytes}}",
+       "rc-change-size-new": "ବଦଳପରେ $1 {{PLURAL:$1|ବାଇଟ|ବାଇଟ}}",
        "newsectionsummary": "/* $1 */ ନୂଆ ଭାଗ",
        "rc-enhanced-expand": "ସବିଶେଷ ଦେଖାନ୍ତୁ",
        "rc-enhanced-hide": "ବେଶି କଥାସବୁ ଲୁଚାଇଦିଅ",
        "namespace_association": "ସମ୍ଭନ୍ଧିତ ନେମସ୍ପେସ",
        "tooltip-namespace_association": "ବଛାଯାଇଥିବା ନେମ୍ସସ୍ପେସ ସହ ଯୋଡ଼ା ଆଲୋଚନା ବା ବିଷୟ ନେମସ୍ପେସ ଏହା ଅନ୍ତଭୁକ୍ତ କରିବା ନିମନ୍ତେ ଏହି ଘରକୁ ବାଛନ୍ତୁ",
        "blanknamespace": "(ମୂଳ)",
-       "contributions": "{{GENDER:$1|User}}ଙ୍କ ଅବଦାନ",
+       "contributions": "{{GENDER:$1|ବ୍ୟବହାରକାରୀ}}ଙ୍କ ଅବଦାନ",
        "contributions-title": "$1 ପାଇଁ ବ୍ୟବହାରକାରୀଙ୍କ ଦାନ",
        "mycontris": "ଅବଦାନ",
        "contribsub2": "{{GENDER:$3|$1}} ପାଇଁ  ($2)",
        "movepagetext": "ଏହି ଫର୍ମଟି ବ୍ୟବହାର କରି ଆପଣ ତଳ ପୃଷ୍ଠାଟିକୁ ବଦଳାଇ ପାରିବେ, ଏହାର ସବୁ ଇତିହାସ ଏକ ନୂଆ ନାଆଁକୁ ବଦଳିଯିବ ।\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": "ଯଦି:\n*ଗୋଟିଏ ଖାଲି ଆଲୋଚନା ପୃଷ୍ଠା ସେହି ନାଆଁରେ ଥାଏ\n*ଆପଣ ତଳ ବାକ୍ସକୁ ନ ବାଛନ୍ତି\nତେବେ ଏହି ପ୍ରୁଷ୍ଠା ସହ ଯୋଡାଯାଇଥିବା ଆଲୋଚନା ପ୍ରୁଷ୍ଠାକୁ ଆପେ ଆପେ ଘୁଞ୍ଚାଇଦିଆଯିବ ।\nସେହି ଯାଗାରେ, ଆପଣଙ୍କୁ ପ୍ରୁଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବାକୁ/ମିଶାଇବାକୁ ପଡ଼ିବ ।",
-       "movearticle": "ପୃଷ୍ଠା ଘୁଞ୍ଚେଇବା:",
        "moveuserpage-warning": "'''ସୂଚନା:''' ଆପଣ ଏକ ବ୍ୟବହାରକାରୀ ପୃଷ୍ଠାକୁ ଘୁଞ୍ଚାଇବାକୁ ଯାଉଛନ୍ତି । ଦୟାକରି ଜାଣିରଖନ୍ତୁ ଯେ ପୃଷ୍ଠାଟି କେବଳ ଘୁଞ୍ଚିଯିବ ଓ ବ୍ୟବହାରକାରୀ ''ଘୁଞ୍ଚିବେ ନାହିଁ'' ।",
        "movecategorypage-warning": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ଏକ ଶ୍ରେଣୀ ପୃଷ୍ଠାକୁ ଘୁଞ୍ଚାଇବାକୁ ଯାଉଛନ୍ତି । କେବଳ ପୃଷ୍ଠାଟି ଘୁଞ୍ଚିଯିବ ଏବଂ ପୁରୁଣା ଶ୍ରେଣୀର କୌଣସି ପୃଷ୍ଠା ନୂଆ ଶ୍ରେଣୀଭୁକ୍ତ ହେବନାହିଁ <em>ଜାଣିରଖନ୍ତୁ</em> ।",
        "movenologintext": "ଏହି ପୃଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବା ପାଇଁ ଆପଣ ନିହାତି ଜଣେ ପଞ୍ଜୀକୃତ ସଭ୍ୟ ହୋଇଥିବେ ଏବଂ [[Special:UserLogin|logged in]]",
        "allmessages-language": "ଭାଷା:",
        "allmessages-filter-submit": "ଯିବା",
        "allmessages-filter-translate": "ଅନୁବାଦ କରନ୍ତୁ",
-       "thumbnail-more": "ବିସà­\8dତାର",
+       "thumbnail-more": "ବଡ଼",
        "filemissing": "ଫାଇଲ ମିଳୁନାହିଁ",
        "thumbnail_error": "ନଖଦେଖଣା ତିଆରିବାରେ ଅସୁବିଧା: $1",
        "thumbnail_error_remote": "$1ରୁ ତ୍ରୁଟି ମେସେଜ:\n$2",
        "tooltip-pt-logout": "ଲଗଆଉଟ",
        "tooltip-pt-createaccount": "ଆପଣଙ୍କୁ ଗୋଟେ ଖାତା ଖୋଲି ଲଗ ଇନ କରିବା ପାଇଁ ପ୍ରୋତ୍ସାହିତ କରାଯାଉଛି, ଏମିତିବି ଏହା କରିବା ନିତାନ୍ତ ଆବଶ୍ୟକ ନୁହେଁ ।",
        "tooltip-ca-talk": "ଏହି ପୃଷ୍ଠାଟି ଉପରେ ଆଲୋଚନା",
-       "tooltip-ca-edit": "à¬\86ପଣ à¬\8fହି à¬ªà­\83ଷà­\8dଠାà¬\9fିରà­\87 à¬\85ଦଳ à¬¬à¬¦à¬³ à¬\95ରିପାରିବà­\87, à¬¤à­\87ବà­\87 à¬¸à¬¾à¬\87ତିବା à¬\86à¬\97ରà­\81 à¬¦à­\87à¬\96ଣା à¬¦à­\87à¬\96ନà­\8dତà­\81 à¥¤",
+       "tooltip-ca-edit": "à¬\8fହି à¬ªà­\83ଷà­\8dଠାà¬\9fି à¬¸à¬®à­\8dପାଦନ à¬\95ରନà­\8dତà­\81",
        "tooltip-ca-addsection": "ନୂଆ ବିଭାଗଟିଏ ଆରମ୍ଭ କରିବେ",
        "tooltip-ca-viewsource": "ଏହି ପୃଷ୍ଠାଟି କିଳାଯାଇଛି ।\nଆପଣ ଏହାର ମୂଳ ଦେଖିପାରିବେ",
        "tooltip-ca-history": "ଏହି ପୃଷ୍ଠାର ପୁରୁଣା ସଂସ୍କରଣ",
        "tooltip-ca-nstab-main": "ସୂଚୀ ପୃଷ୍ଠାଟି ଦେଖାଇବେ",
        "tooltip-ca-nstab-user": "ଫାଇଲ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ",
        "tooltip-ca-nstab-media": "ମିଡ଼ିଆ ପୃଷ୍ଠାଟି ଦେଖିବେ",
-       "tooltip-ca-nstab-special": "à¬\8fହା à¬\97à­\8bà¬\9fିà¬\8f à¬¬à¬¿à¬¶à­\87ଷ à¬ªà­\83ଷà­\8dଠା, à¬\86ପଣ à¬\8fହାà¬\95à­\81 à¬¬à¬¦à¬³à¬¾à¬\87ପାରିବà­\87 ନାହିଁ",
+       "tooltip-ca-nstab-special": "à¬\8fହା à¬\8fà¬\95 à¬¬à¬¿à¬¶à­\87ଷ à¬ªà­\83ଷà­\8dଠା à¬¹à­\8bà¬\87ଥିବାରà­\81 à¬\8fହାà¬\95à­\81 à¬¬à¬¦à¬³à¬¾à¬¯à¬¾à¬\87ପାରିବ ନାହିଁ",
        "tooltip-ca-nstab-project": "ପ୍ରକଳ୍ପ ପୃଷ୍ଠାଟି ଦେଖାଇବେ",
        "tooltip-ca-nstab-image": "ଫାଇଲ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ",
        "tooltip-ca-nstab-mediawiki": "ସିଷ୍ଟମ ମେସେଜ ଦେଖିବେ",
        "spam_reverting": "$1 ସହ ଯୋଡ଼ା ନଥିବା ଶେଷ ସଂସ୍କରଣକୁ ଲେଉଟାଇ ଦେଉଅଛୁଁ",
        "spam_blanking": "$1 ସହ ଯୋଡ଼ାଥିବା ସବୁଯାକ ସଂସ୍କରଣ ଖାଲି କରିଦିଆଗଲା",
        "spam_deleting": "$1 ସହ ଯୋଡ଼ାଥିବା ସବୁଯାକ ସଂସ୍କରଣ ଖାଲି କରିଦିଆଗଲା",
-       "simpleantispam-label": "à¬\86ଣà­\8dà¬\9fି-ସà­\8dପାମ à¬ªà¬°à¬\96 à¥¤\nà¬\8fହାà¬\95à­\81 à¬­à¬°ନ୍ତୁ <strong>ନାହିଁ</strong>!",
+       "simpleantispam-label": "ସà­\8dପାମରà­\8bଧà­\80 à¬ªà¬°à¬\96 à¥¤\nà¬\8fଥିରà­\87 à¬\95ିà¬\9bି à¬²à­\87à¬\96ନ୍ତୁ <strong>ନାହିଁ</strong>!",
        "pageinfo-title": "\"$1\"ର ବିବରଣୀ",
        "pageinfo-not-current": "ଦୁଖିତଃ, ପୁରୁଣା ସଂସ୍କରଣଗୁଡିକର ଏହି ତଥ୍ୟ ଦେବା ସମ୍ଭବ ନୁହେଁ ।",
        "pageinfo-header-basic": "ସାଧାରଣ ଜାଣିବା କଥା",
        "api-error-badaccess-groups": "ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।",
        "api-error-badtoken": "ଭିତର ଅସୁବିଧା: ଖରାପ ଟୋକନ ।",
        "api-error-copyuploaddisabled": "URL ଦେଇ ଅପଲୋଡ଼ କରିବା ଏହି ସର୍ଭରରେ ଅଚଳ କରାଯାଇଅଛି ।",
-       "api-error-duplicate": "ଏହି ସାଇଟରେ ସେହି ଏକା ତଥ୍ୟ ଥିବା {{PLURAL:$1| [$2 ଆଉ ଏକ ଫାଇଲ] ରହିଅଛି|[$2 ଆଉ କିଛି ଫାଇଲ] ରହି ଅଛନ୍ତି}} ।",
-       "api-error-duplicate-archive": "ସେହି ସାଇଟରେ ସେହି ଏକା ଭିତର ଭାଗ ସହିତ ଆଗରୁ {{PLURAL:$1|[$2 ଆଉ ଫାଇଲଟିଏ] ଥିଲା|[$2 ଆଉ କେତେକ ଫାଇଲ] ଥିଲା}}, କିନ୍ତୁ {{PLURAL:$1|ତାହାକୁ|ସେସବୁକୁ}} ଲିଭାଇ ଦିଆଯାଇଅଛି ।",
-       "api-error-duplicate-archive-popup-title": "ଆଗରୁ ଲିଭାଯାଇଥିବା ନକଲି {{PLURAL:$1|ଗୋଟି ଫାଇଲ|ଗୋଟି ଫାଇଲ}}",
-       "api-error-duplicate-popup-title": "ନକଲି {{PLURAL:$1|ଗୋଟି ଫାଇଲ|ଗୋଟି ଫାଇଲ}}",
+       "api-error-duplicate": "ଏହି ସାଇଟରେ ସେହି ଏକା ତଥ୍ୟ ଥିବା {{PLURAL:$1| ଆଉ ଏକ ଫାଇଲ ରହିଅଛି|ଆଉ କିଛି ଫାଇଲ ରହି ଅଛନ୍ତି}} ।",
+       "api-error-duplicate-archive": "ସେହି ସାଇଟରେ ସେହି ଏକା ଭିତର ଭାଗ ସହିତ ଆଗରୁ {{PLURAL:$1|ଆଉ ଫାଇଲଟିଏ ଥିଲା|ଆଉ କେତେକ ଫାଇଲ ଥିଲା}}, କିନ୍ତୁ {{PLURAL:$1|ତାହାକୁ|ସେସବୁକୁ}} ଲିଭାଇ ଦିଆଯାଇଅଛି ।",
        "api-error-empty-file": "ଆପଣ ପଠାଇଥିବା ଫାଇଲଟି ଖାଲି ଅଟେ ।",
        "api-error-emptypage": "ନୂଆ, ଖାଲି ପୃଷ୍ଠ ତିଆରି କରିବାର ଅନୁମତି ନାହି ।",
        "api-error-fetchfileerror": "ଭିତର ଅସୁବିଧା: ଏହି ଫାଇଲଟି ପାଖରେ ପହଞ୍ଚିବା ବେଳେ କିଛି ଅସୁବିଧା ହେଲା ।",
index 9a2588d..5c506c0 100644 (file)
@@ -21,7 +21,8 @@
                        "Ævar Arnfjörð Bjarmason",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "ਪ੍ਰਚਾਰਕ"
                ]
        },
        "tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
@@ -38,6 +39,7 @@
        "tog-watchdefault": "ਮੇਰੇ ਵੱਲੋਂ ਸੋਧੇ ਗਏ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
        "tog-watchmoves": "ਮੇਰੇ ਵੱਲੋਂ ਬਦਲੇ ਸਿਰਲੇਖਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
        "tog-watchdeletion": "ਮੇਰੇ ਵਲੋਂ ਮਿਟਾਏ ਗਏ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
+       "tog-watchrollback": "ਮੇਰੇ ਦੁਆਰਾ ਮੋੜੇ ਗਏ ਸਫ਼ਿਅਾਂ ਨੂੰ ਮੇਰੀ ਧਿਆਨਸੂਚੀ ਵਿੱਚ ਸ਼ਾਮਿਲ ਕਰੋ",
        "tog-minordefault": "ਸਾਰੀਆਂ ਸੋਧਾਂ ’ਤੇ ਮੂਲ ਰੂਪ ਵਿਚ ਛੋਟੇ ਹੋਣ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ",
        "tog-previewontop": "ਸੋਧ ਬਕਸੇ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵਖਾਓ",
        "tog-previewonfirst": "ਪਹਿਲੀ ਸੋਧ ਉੱਤੇ ਝਲਕ ਵਖਾਓ",
@@ -48,7 +50,7 @@
        "tog-shownumberswatching": "ਨਜ਼ਰ ਰੱਖ ਰਹੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਗਿਣਤੀ ਵਖਾਓ",
        "tog-oldsig": "ਮੌਜੂਦਾ ਦਸਤਖ਼ਤ:",
        "tog-fancysig": "ਦਸਤਖ਼ਤ ਨੂੰ ਬਤੌਰ ਵਿਕੀਲਿਖਤ ਮੰਨੋ (ਬਿਨਾਂ ਆਟੋਮੈਟਿਕ ਲਿੰਕ)",
-       "tog-uselivepreview": "ਸਿੱਧà©\80 à¨\9dਲà¨\95 à¨µà¨°à¨¤à©\8b (ਤà¨\9cਰਬà©\87-à¨\85ਧà©\80ਨ)",
+       "tog-uselivepreview": "ਮà©\8cà¨\9cà©\82ਦਾ à¨\9dਲà¨\95 à¨µà¨°à¨¤à©\8b",
        "tog-forceeditsummary": "ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦੇਵਾਂ ਤਾਂ ਮੈਨੂੰ ਆਗਾਹ ਕਰੋ",
        "tog-watchlisthideown": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਮੇਰੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ",
        "tog-watchlisthidebots": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਬੋਟਾਂ ਦੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ",
        "jumptonavigation": "ਨੇਵੀਗੇਸ਼ਨ",
        "jumptosearch": "ਖੋਜ",
        "view-pool-error": "ਅਫ਼ਸੋਸ, ਸਰਵਰ ਇਸ ਵੇਲੇ ਓਵਰਲੋਡ ਹੈ।\nਬਹੁਤ ਸਾਰੇ ਮੈਂਬਰ ਇਸ ਸਫ਼ੇ ਨੂੰ ਵੇਖਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹਨ।\nਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜੀ ਉਡੀਕ ਕਰੋ ਜੀ।\n$1",
+       "generic-pool-error": "ਮੁਆਫ਼ ਕਰੋ, ਇਸ ਵੇਲੇ ਸਰਵਰ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੇ।\nਇਸ ਚੀਜ਼ ਨੂੰ ਇਸ ਵੇਲੇ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵਰਤੋਂਕਾਰ ਵੇਖਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹਨ।\nਇਸ ਚੀਜ਼ ਨੂੰ ਦੁਆਰਾ ਦੇਖਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜ੍ਹੀ ਦੇਰ ਇੰਤਜ਼ਾਰ ਕਰੋ।",
        "pool-timeout": "ਲਾਕ ਲਈ ਉਡੀਕ ਦਾ ਵਕਤ ਖ਼ਤਮ ਹੋ ਗਿਆ ਹੈ",
        "pool-queuefull": "ਪੂਲ ਕਤਾਰ ਭਰੀ ਹੋਈ ਹੈ",
        "pool-errorunknown": "ਅਣਜਾਣ ਗਲਤੀ",
        "nstab-template": "ਫਰਮਾ",
        "nstab-help": "ਮਦਦ ਸਫ਼ਾ",
        "nstab-category": "ਸ਼੍ਰੇਣੀ",
+       "mainpage-nstab": "ਮੁੱਖ ਸਫ਼ਾ",
        "nosuchaction": "ਅਜਿਹੀ ਕੋਈ ਕਾਰਵਾਈ ਨਹੀਂ ਹੈ",
        "nosuchactiontext": "URL ਦੁਆਰਾ ਦੱਸਿਆ ਕੰਮ ਗ਼ਲਤ ਹੈ।\nਸ਼ਾਇਦ ਤੁਸੀਂ URL ਸਹੀ ਨਹੀਂ ਲਿਖਿਆ ਜਾਂ ਕਿਸੇ ਗ਼ਲਤ ਲਿੰਕ ਤੇ ਆਏ ਹੋ।\nਇਹ ਵੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ {{SITENAME}} ਦੁਆਰੇ ਵਰਤੇ ਜਾਂਦੇ ਸਾਫ਼ਟਵੇਅਰ ਵਿਚਲੀ ਗ਼ਲਤੀ ਵੱਲ ਇਸ਼ਾਰਾ ਹੋਵੇ।",
        "nosuchspecialpage": "ਅਜਿਹਾ ਕੋਈ ਖ਼ਾਸ ਸਫ਼ਾ ਨਹੀਂ ਹੈ",
        "filerenameerror": "ਫ਼ਾਈਲ ''$1'' ਦਾ ਨਾਂ ''$2'' ਨਹੀਂ ਸਾ ਸਕਿਆ।",
        "filedeleteerror": "''$1'' ਫ਼ਾਈਲ ਹਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
        "directorycreateerror": "ਡਾਇਰੈਕਟਰੀ ''$1'' ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
+       "directoryreadonlyerror": "\"$1\" ਨਾਮਾਵਲੀ ਸਿਰਫ਼ ਪੜ੍ਹਣਯੋਗ ਹੈ।",
+       "directorynotreadableerror": "\"$1\" ਨਾਮਾਵਲੀ ਪੜ੍ਹਣਯੋਗ ਨਹੀਂ ਹੈ।",
        "filenotfound": "ਫ਼ਾਈਲ ''$1'' ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।",
        "unexpected": "ਅਣਉਮੀਦਿਆ ਮੁੱਲ: \"$1\"=\"$2\"।",
        "formerror": "ਗ਼ਲਤੀ: ਫ਼ਾਰਮ ਪੇਸ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ",
        "createacct-captcha": "ਸੁਰੱਖਿਆ ਜਾਂਚ",
        "createacct-imgcaptcha-ph": "ਉੱਤੇ ਵੇਖਾਈ ਦੇ ਰਿਹਾ ਸ਼ਬਦ ਦਿਉ",
        "createacct-submit": "ਆਪਣਾ ਖਾਤਾ ਬਣਾਓ",
-       "createacct-another-submit": "ਹà©\8bਰ ਖਾਤਾ ਬਣਾਓ",
+       "createacct-another-submit": "ਨਵਾà¨\82 ਖਾਤਾ ਬਣਾਓ",
        "createacct-benefit-heading": "{{SITENAME}} ਨੂੰ ਤੁਹਾਡੇ ਵਰਗੇ ਲੋਕਾਂ ਵਲੋਂ ਹੀ ਬਣਾਇਆ ਗਿਆ ਹੈ।",
        "createacct-benefit-body1": "{{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ਸਫ਼ਾ|ਸਫ਼ੇ}}",
        "changeemail-password": "ਤੁਹਾਡਾ {{SITENAME}} ਪਾਸਵਰਡ:",
        "changeemail-submit": "ਈ-ਮੇਲ ਬਦਲੋ",
        "changeemail-throttled": "ਤੁਸੀਂ ਦਾਖ਼ਲ ਹੋਣ ਦੀਆਂ ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।\nਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ $1 ਉਡੀਕ ਕਰੋ ਜੀ।",
+       "changeemail-nochange": "ਕਿਰਪਾ ਕਰਕੇ ਕੋਈ ਵੱਖਰਾ ਈਮੇਲ ਪਤਾ ਭਰੋ।",
        "resettokens": "ਟੋਕਨ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
        "resettokens-text": "ਤੁਸੀਂ ਆਪਣੀਆਂ ਨਿਸ਼ਾਨੀਆਂ, ਜੋ ਤੁਹਾਡੇ ਖਾਤੇ ਨਾਲ਼ ਜੁੜੇ ਖ਼ਾਸ ਨਿੱਜੀ ਅੰਕੜਿਆਂ ਤੱਕ ਪੁੱਜਣ ਵਾਸਤੇ ਇਜਾਜ਼ਤ ਦਿੰਦੀਆਂ ਹਨ, ਨੂੰ ਇੱਥੇ ਮੁੜ-ਬਣਾ ਸਕਦੇ ਹੋ।\n\nਤੁਹਾਨੂੰ ਇਹ ਤਾਂ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ ਜੇਕਰ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਰੱਬ-ਸਬੱਬੀ ਕਿਸੇ ਨਾਲ਼ ਸਾਂਝਾ ਕਰ ਦਿੱਤਾ ਜਾਂ ਤੁਹਾਡਾ ਖਾਤਾ ਖ਼ਤਰੇ ਵਿੱਚ ਆ ਗਿਆ ਹੈ।",
        "resettokens-no-tokens": "ਨਵੀਆਂ ਬਣਾਉਣ ਵਾਸਤੇ ਕੋਈ ਨਿਸ਼ਾਨੀਆਂ ਨਹੀਂ ਹਨ।",
        "content-model-text": "ਆਮ ਲਿਖਤ",
        "content-model-javascript": "ਜਾਵਾਸਕਰਿਪਟ",
        "content-model-css": "ਸੀਐਸਐਸ",
+       "content-json-empty-object": "ਖਾਲੀ ਚੀਜ਼",
+       "content-json-empty-array": "ਖਾਲੀ ਤਰਤੀਬ",
        "post-expand-template-inclusion-warning": "'''ਖ਼ਬਰਦਾਰ:''' ਫਰਮੇ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ। ਕੁਝ ਫਰਮੇ ਸ਼ਾਮਲ ਨਹੀਂ ਹੋਣਗੇ।",
        "post-expand-template-inclusion-category": "ਉਹ ਸਫ਼ੇ ਜਿੱਥੇ ਫਰਮੇ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਅਕਾਰ ਹੱਦੋਂ ਵੱਧ ਗਿਆ ਹੈ",
        "post-expand-template-argument-warning": "'''ਚੇਤਾਵਨੀ:'''\nਇਸ ਪੰਨੇ ਤੇ ਘੱਟੋ ਘੱਟ ਇੱਕ ਐਸੀ ਸਾਂਚਾ ਬਹਿਸ ਹੈ ਜਿਸ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ। ਅਜਿਹੀਆਂ ਬਹਿਸਾਂ ਨੂੰ ਛੱਡ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
        "parser-template-loop-warning": "ਫਰਮੇ ਦਾ ਲੂਪ ਲੱਭਿਆ: [[$1]]",
        "undo-success": "ਇਹ ਸੋਧ ਨਕਾਰੀ ਜਾ ਸਕਦੀ ਹੈ।\nਮਿਹਰਬਾਨੀ ਕਰਕੇ ਇਹ ਤਸਦੀਕ ਕਰਨ ਲਈ ਹੇਠਲੀ ਤੁਲਨਾ ਜਾਂਚੋ ਕਿ ਇਹ ਓਹੀ ਹੈ ਜੋ ਤੁਸੀਂ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ ਅਤੇ ਫਿਰ ਸੋਧ ਨਕਾਰਨ ਲਈ ਤਬਦੀਲੀਆਂ ਸਾਂਭ ਦਿਓ।",
        "undo-norev": "ਸੋਧ ਨਕਾਰੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਕਿਉਂਕਿ ਇਹ ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ।",
+       "undo-nochange": "ਲਗਦਾ ਹੈ ਕਿ ਿਹ ਸੋਧ ਪਹਿਲਾਂ ਹੀ ਮੋੜ ਦਿੱਤੀ ਗਈ ਹੈ।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ਗੱਲ-ਬਾਤ]]) ਦੀ ਸੋਧ $1 ਨਕਾਰੀ",
        "undo-summary-username-hidden": "ਗੁਪਤ ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਕੀਤੀ $1 ਸੋਧ ਰੱਦ ਕਰੋ",
        "cantcreateaccounttitle": "ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ",
        "mergehistory-go": "ਰਲ਼ਾਉਣਯੋਗ ਸੋਧਾਂ ਵਖਾਓ",
        "mergehistory-submit": "ਰੀਵਿਜ਼ਨਾਂ ਰਲ਼ਾਓ",
        "mergehistory-empty": "ਕੋਈ ਰੀਵਿਜ਼ਨ ਰਲ਼ਾਈ ਨਹੀ ਜਾ ਸਕਦੀ।",
-       "mergehistory-success": "[[:$1]] {{PLURAL:|ਦੀ|ਦੀਆਂ}} $3 {{PLURAL:$3|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}} ਕਾਮਯਾਬੀ ਨਾਲ਼ [[:$2]] ਵਿਚ {{PLURAL:$3|ਰਲ਼ਾਈ|ਰਲ਼ਾਈਆਂ}}।",
+       "mergehistory-done": "$1 {{PLURAL:|ਦੀ|ਦੀਆਂ}} $3 {{PLURAL:$3|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}} ਕਾਮਯਾਬੀ ਨਾਲ਼ [[:$2]] ਵਿਚ {{PLURAL:$3|ਰਲ਼ਾਈ|ਰਲ਼ਾਈਆਂ}}।",
        "mergehistory-no-source": "ਸਰੋਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "mergehistory-no-destination": "ਨੀਯਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "mergehistory-invalid-source": "ਸਰੋਤ ਸਫ਼ਾ ਇੱਕ ਸਹੀ ਸਿਰਲੇਖ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
        "rows": "ਕਤਾਰਾਂ:",
        "columns": "ਕਾਲਮ:",
        "searchresultshead": "ਖੋਜ",
+       "stub-threshold-sample-link": "ਨਮੂਨਾ",
        "stub-threshold-disabled": "ਬੰਦ ਹੈ",
        "recentchangesdays": "ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿਚ ਵਿਖਾਉਣ ਲਈ ਦਿਨ:",
        "recentchangesdays-max": "ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}",
        "right-editmyuserjs": "ਆਪਣੀਆਂ ਵਰਤੋਂਕਾਰ ਜਾਵਾਸਕਰਿਪਟ ਫ਼ਾਈਲਾਂ ਸੋਧੋ",
        "right-viewmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ",
        "right-editmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ। ਧਿਆਨ ਦਿਓ ਕਿ ਕੁਝ ਸਫ਼ੇ ਇਸ ਹੱਕ ਤੋਂ ਬਿਨਾਂ ਵੀ ਜੁੜਨਗੇ।",
+       "right-viewmyprivateinfo": "ਆਪਣਾ ਨਿੱਜੀ ਡਾਟਾ ਵੇਖੋ (ਉਦਾਹਰਨ ਵਜੋਂ ਈਮੇਲ ਪਤਾ, ਅਸਲੀ ਨਾਂ)",
+       "right-editmyprivateinfo": "ਆਪਣਾ ਨਿੱਜੀ ਡਾਟਾ ਸੋਧੋ (ਉਦਾਹਰਨ ਵਜੋਂ ਈਮੇਲ ਪਤਾ, ਅਸਲੀ ਨਾਂ)",
        "right-editmyoptions": "ਆਪਣੀਆਂ ਤਰਜੀਹਾਂ ਸੋਧੋ",
+       "right-import": "ਹੋਰ ਵਿਕੀਅਾਂ ਤੋਂ ਸਫ਼ੇ ਦਰਾਮਦ ਕਰੋ",
+       "right-importupload": "ਕਿਸੇ ਫ਼ਾਈਲ ਅਪਲੋਡ ਤੋਂ ਸਫ਼ੇ ਦਰਾਮਦ ਕਰੋ",
        "right-unwatchedpages": "ਨਜ਼ਰ ਨਾ ਰੱਖੇ ਜਾ ਰਹੇ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਵੇਖਣੀ",
        "right-mergehistory": "ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤਾਂ ਨੂੰ ਰਲ਼ਾਉਣਾ",
        "right-userrights": "ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੇ ਹੱਕ ਬਦਲਣੇ",
        "action-viewmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ",
        "action-viewmyprivateinfo": "ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵੇਖੋ",
        "action-editmyprivateinfo": "ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਸੋਧੋ",
+       "action-editcontentmodel": "ਕਿਸੇ ਸਫ਼ੇ ਦਾ ਸਮੱਗਰੀ ਮਾਡਲ ਸੋਧੋ",
        "nchanges": "$1 {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ਆਖ਼ਰੀ ਫੇਰੀ ਤੋਂ ਲੈ ਕੇ}}",
        "enhancedrc-history": "ਅਤੀਤ",
        "newpageletter": "ਨ",
        "boteditletter": "ਬੋਟ",
        "number_of_watching_users_pageview": "[$1 ਵੇਖ ਰਹੇ ਹਨ {{PLURAL:$1|ਯੂਜ਼ਰ}}]",
-       "rc_categories_any": "ਕੋਈ ਵੀ",
+       "rc_categories_any": "à¨\9aà©\81ਣà©\87 à¨¹à©\8bà¨\87à¨\85ਾà¨\82 à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨\95à©\8bà¨\88 à¨µà©\80",
        "rc-change-size-new": "$1 {{PLURAL:$|ਬਾਈਟ|ਬਾਈਟਾਂ}} ਤਬਦੀਲੀ ਤੋਂ ਬਾਅਦ",
        "newsectionsummary": "/* $1 */ ਨਵਾਂ ਭਾਗ",
        "rc-enhanced-expand": "ਵੇਰਵੇ ਵੇਖਾਓ",
        "tmp-create-error": "ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਬਣਾਈ ਨਾ ਜਾ ਸਕੀ।",
        "tmp-write-error": "ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਲਿਖਣ ਲਈ ਗ਼ਲਤੀ ਆਈ।",
        "large-file": "ਫ਼ਾਈਲਾਂ $1 ਤੋਂ ਵੱਡੀਆਂ ਨਾ ਹੋਣ ਦੀ ਸਲਾਹ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ;\nਇਹ ਫ਼ਾਈਲ $2 ਦੀ ਹੈ।",
+       "largefileserver": "ਇਹ ਫ਼ਾਈਲ ਸਰਵਰ ਦੇ ਮੁਤਾਬਕ ਵੱਡੀ ਹੈ।",
        "windows-nonascii-filename": "ਵਿਕੀ ਖ਼ਾਸ ਚਿੰਨ੍ਹਾਂ ਵਾਲੇ ਫ਼ਾਈਲ ਨਾਮਾਂ ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦਾ।",
-       "fileexists": "à¨\87ਹ à¨«à¨¼à¨¾à¨\88ਲ à¨¨à¨¾à¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¹à©\80 à¨®à©\8cà¨\9cà©\82ਦ à¨¹à©\88। à¨\9cà©\87 à¨¤à©\81ਸà©\80à¨\82 à¨\87ਹਨà©\82à©° à¨¬à¨¦à¨²à¨£ à¨¬à¨¾à¨°à©\87 à¨¦à©\8dਰਿà©\9c à¨¨à¨¹à©\80à¨\82 à¨¹à©\8b à¨¤à¨¾à¨\82  <strong>[[:$1]]</strong> à¨µà©\87à¨\96à©\8b à¨\9cà©\80। [[$1|thumb]]",
+       "fileexists": "à¨\87ਸ à¨¨à¨¾à¨\82 à¨¦à©\80 à¨«à¨¼à¨¾à¨\88ਲ à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¹à©\80 à¨®à©\8cà¨\9cà©\82ਦ à¨¹à©\88। à¨\9cà©\87 {{GENDER:|ਤà©\81ਸà©\80à¨\82}} à¨\87ਸ à¨¨à©\82à©° à¨¬à¨¦à¨²à¨£ à¨¬à¨¾à¨°à©\87 à¨¦à©\8dਰਿà©\9c à¨¨à¨¹à©\80à¨\82 à¨¹à©\8b à¨¤à¨¾à¨\82  <strong>[[:$1]]</strong> à¨µà©\87à¨\96à©\8b à¨\9cà©\80।\n [[$1|thumb]]",
        "fileexists-extension": "ਇਸ ਨਾਂ ਨਾਲ਼ ਰਲਦੀ ਫ਼ਾਈਲ ਮੌਜੂਦ ਹੈ: [[$2|thumb]]\n* ਅੱਪਲੋਡ ਕੀਤੀ ਜਾਂਦੀ ਫ਼ਾਈਲ ਦਾ ਨਾਂ: <strong>[[:$1]]</strong>\n* ਮੌਜੂਦ ਫ਼ਾਈਲ ਦਾ ਨਾਂ: <strong>[[:$2]]</strong>\nਕੋਈ ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।",
        "file-exists-duplicate": "ਇਹ ਫ਼ਾਈਲ {{PLURAL:$1|ਇਸ ਫ਼ਾਈਲ|ਇਹਨਾਂ ਫ਼ਾਈਲਾਂ}} ਦੀ ਨਕਲ ਹੈ:",
        "uploadwarning": "ਅੱਪਲੋਡ ਚਿਤਾਵਨੀ",
        "upload-file-error": "ਅੰਦਰੂਨੀ ਗਲਤੀ",
        "upload-misc-error": "ਅਣਪਛਾਤੀ ਅੱਪਲੋਡ ਗਲਤੀ",
        "upload-http-error": "ਇੱਕ HTTP ਗ਼ਲਤੀ ਹੋਈ: $1",
+       "foreign-structured-upload-form-label-infoform-date": "ਤਾਰੀਖ਼",
        "backend-fail-notexists": "ਫ਼ਾਈਲ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "backend-fail-delete": "ਫ਼ਾਈਲ \"$1\" ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
        "backend-fail-alreadyexists": "ਫ਼ਾਈਲ \"$1\" ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।",
        "unlockconfirm": "ਹਾਂ, ਮੈਂ ਸੱਚੀਂ ਤੱਥ-ਅਧਾਰ ਖੋਲ੍ਹਣਾ ਹੈ।",
        "move-page": "$1 ਭੇਜੋ",
        "move-page-legend": "ਸਫ਼ਾ ਭੇਜੋ",
-       "movearticle": "ਸਫ਼ਾ ਭੇਜੋ:",
        "movenologintext": "ਇਕ ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ ਬਦਲਣ ਲਈ ਤੁਸੀਂ ਰਜਿਸਟਰਡ ਮੈਂਬਰ ਹੋਣੇ ਚਾਹੀਦੇ ਹੋ ਅਤੇ [[Special:UserLogin|ਲਾਗਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
        "movenotallowed": "ਤੁਹਾਡੇ ਕੋਲ਼ ਸਫ਼ੇ ਹਿਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "movenotallowedfile": "ਤੁਹਾਨੂੰ ਫ਼ਾਈਲਾਂ ਭੇਜਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
index e3b19e2..c56ea5d 100644 (file)
@@ -8,7 +8,8 @@
                        "Val2397",
                        "아라",
                        "Leeheonjin",
-                       "TTO"
+                       "TTO",
+                       "Macofe"
                ]
        },
        "tog-underline": "Gulisan lang panglalam deng suglung:",
        "mergehistory-go": "Pakit la reng mibayung maliaring pisanib (mergeable edits)",
        "mergehistory-submit": "Pisamut la reng meyalili",
        "mergehistory-empty": "Alang mibayu/miyalilan a maliaring pisanib.",
-       "mergehistory-success": "Melaus ing pamisanib ning/da ring $3 {{PLURAL:$3|pamagbayu|pamagbayu}} ning [[:$1]] king [[:$2]].",
+       "mergehistory-done": "Melaus ing pamisanib ning/da ring $3 {{PLURAL:$3|pamagbayu|pamagbayu}} ning $1 king [[:$2]].",
        "mergehistory-fail": "E miliari ing pamisanib ning amlat; pakilawe mong pasibayu deng sukad king bulung ampong panaun (page and time parameters).",
        "mergehistory-no-source": "Penibatan a bulung $1 ala yu.",
        "mergehistory-no-destination": "Ala yu ing bulung a puntalan a $1.",
        "upload-dialog-button-done": "Meyari na",
        "upload-dialog-button-save": "Isikap (save)",
        "upload-dialog-button-upload": "Maglulan (upload)",
-       "upload-dialog-label-infoform-title": "Ding detalye",
-       "upload-dialog-label-infoform-name": "Lagyu",
-       "upload-dialog-label-infoform-description": "Pamilarawan",
+       "upload-form-label-infoform-title": "Ding detalye",
+       "upload-form-label-infoform-name": "Lagyu",
+       "upload-form-label-infoform-description": "Pamilarawan",
        "upload-curl-error6": "E ne ayabut ing URL",
        "upload-curl-error6-text": "E ne ayabut ing mibieng URL.\nPakilawe mung pasibayu nung ustu ya ing URL at makasalangi ya ing karinan (site).",
        "upload-curl-error28": "Megisan na ing oras para king pamag-upload",
        "filerevert-legend": "Isubli (revert) ya ing simpan",
        "filerevert-intro": "Susubli me ing '''[[Media:$1|$1]]''' king [$4 bersion aniang $3, $2].",
        "filerevert-comment": "Komentu:",
-       "filerevert-defaultcomment": "Misubli ya king bersion aniang $2, $1",
+       "filerevert-defaultcomment": "Misubli ya king bersion aniang $2, $1 ($3)",
        "filerevert-submit": "Isubli",
        "filerevert-success": "Ing '''[[Media:$1|$1]]''' misubli ya king [$4 bersion aniang $3, $2].",
        "filerevert-badversion": "Alang sadiang/minunang lokal a bersion na niting simpan a tambing maki timestamp.",
        "move-page-legend": "Iyalis ya ing bulung",
        "movepagetext": "Nung gamitan ya in ''form'' king lalam, miyalilan ya lagiu ing bulung, at miyalis ya ngan ing amlat na king bayung bulung.\nMagi yang bulung ning pamanalis direccion (''redirect page'') king bayung bansag ing luma/laun/sadia nang bansag king bayung bansag (''new title'').\nMaliari mong ibayu deng redirect a tambing tuturu king orihinal a bansag.\n\nSana, tandanan mung '''ali''' ya miyalis karin ing bulung nung atin nang bulung king bayung bansag, liban na mu nung alal yang laman o redirect ya, at ala yang amlat ning pamag-edit o pamanalili aniang milabas.\nIng buri nang sabian niti, ayalilan me lagiu ing bulung pabalik ketang sadia nang lagiu nung magkamali ka, at e me maliaring tumpakan ing bulung a atiu na.\n\n'''Kapiadian!'''\nMaliaring metung yang bigla ampong e asahan a pamanaliwa ini king metung a sikat a bulung;\nsana siguraduan mung aintindian mung mayap ing kabaldugan na niti bayu mu isundu.",
        "movepagetalktext": "Tambing yang miyalis ing bulung pisasabian (talk page) a kayabe na niting bulung '''puera nung:'''\n*Atin nang tambing bulung pisasabian lalam ning bayung lagyu, o\n*Lako me panga-check ing kahun king lalam.\n\nNung makanyan pin ing milyari, kailangan meng iyalis o isanib (merge) ing bulung a saparadu nung ita ing buri mung gawan.",
-       "movearticle": "Ialis ya ing bulung",
        "movenologintext": "Kailangan, metung kang talagamit a makarehistru at [[Special:UserLogin|maka-login]] ka ba kang makapanalis bulung.",
        "movenotallowed": "Ala kang paintulut a manalis bulung king {{SITENAME}}.",
        "newtitle": "King bayung bansag:",
index 7127cc6..d8dbd57 100644 (file)
        "personaltools": "Narzędzia osobiste",
        "articlepage": "Pokaż zawartość strony",
        "talk": "Dyskusja",
-       "views": "Wyświetleń",
+       "views": "Widok",
        "toolbox": "Narzędzia",
        "userpage": "Pokaż stronę użytkownika",
        "projectpage": "Pokaż stronę projektu",
        "nstab-template": "Szablon",
        "nstab-help": "Strona pomocy",
        "nstab-category": "Kategoria",
+       "mainpage-nstab": "Strona główna",
        "nosuchaction": "Brak takiej operacji",
        "nosuchactiontext": "Działanie określone w adresie URL jest nieprawidłowe.\nMożliwe przyczyny to literówka w adresie, nieprawidłowy link lub błąd w oprogramowaniu {{GRAMMAR:D.lp|{{SITENAME}}}}.",
        "nosuchspecialpage": "Brak takiej strony specjalnej",
        "createacct-captcha": "Kontrola bezpieczeństwa",
        "createacct-imgcaptcha-ph": "Wpisz tekst widoczny powyżej",
        "createacct-submit": "Utwórz konto",
-       "createacct-another-submit": "Utwórz kolejne konto",
+       "createacct-another-submit": "Utwórz konto",
        "createacct-benefit-heading": "{{grammar:B.lp|{{SITENAME}}}} tworzą ludzie tacy jak Ty.",
        "createacct-benefit-body1": "{{PLURAL:$1|edycja|edycje|edycji}}",
        "createacct-benefit-body2": "{{PLURAL:$1|strona|strony|stron}}",
        "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": "E‐mail resetowania hasła został wysłany.",
+       "passwordreset-emailsent": "Jeśli adres e‐mail przypisany do Twojego konta został zarejestrowany, zostanie 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 adresu e‐mail",
+       "changeemail": "Zmiana lub usunięcie adresu e‐mail",
        "changeemail-text": "Wypełnij formularz, jeśli chcesz zmienić swój adres poczty elektronicznej. Będziesz musiał wprowadzić 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:",
        "mergehistory-go": "Pokaż możliwe do scalenia zmiany",
        "mergehistory-submit": "Scal historię zmian",
        "mergehistory-empty": "Brak historii zmian do scalenia.",
-       "mergehistory-success": "$3 {{PLURAL:$3|zmiana|zmiany|zmian}} w [[:$1]] zostało scalonych z [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|zmiana|zmiany|zmian}} w $1 {{PLURAL:$3|została scalona|zostały scalone|zostało scalonych}} z [[:$2]].",
        "mergehistory-fail": "Scalenie historii zmian jest niewykonalne. Zmień ustawienia parametrów.",
        "mergehistory-fail-toobig": "Nie można połączyć historii, gdyż wymagałoby to przeniesienia więcej niż maksymalnej dopuszczalnej liczby $1 {{PLURAL:$1|wersji}}.",
        "mergehistory-no-source": "Strona źródłowa $1 nie istnieje.",
        "prefs-watchlist-token": "Identyfikator listy obserwowanych:",
        "prefs-misc": "Ustawienia różne",
        "prefs-resetpass": "Zmień hasło",
-       "prefs-changeemail": "Zmień adres e‐mail",
+       "prefs-changeemail": "Zmień lub usuń adres e‐mail",
        "prefs-setemail": "Ustaw adres e‐mail",
        "prefs-email": "E‐mail",
        "prefs-rendering": "Wygląd",
        "recentchangeslinked-summary": "Poniżej znajduje się lista ostatnich zmian na stronach linkowanych z podanej strony (lub we wszystkich stronach należących do podanej kategorii).\nStrony z [[Special:Watchlist|listy obserwowanych]] są '''wytłuszczone'''.",
        "recentchangeslinked-page": "Tytuł strony:",
        "recentchangeslinked-to": "Pokaż zmiany nie na stronach linkowanych, a na stronach linkujących do podanej strony",
+       "recentchanges-page-added-to-category": "dodano [[:$1]] do kategorii",
+       "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",
        "upload": "Prześlij plik",
        "uploadbtn": "Prześlij plik",
        "reuploaddesc": "Przerwij wysyłanie i wróć do formularza wysyłki",
        "upload-http-error": "Wystąpił błąd protokołu HTTP – $1",
        "upload-copy-upload-invalid-domain": "Przesyłanie kopii z tej domeny nie jest dostępne.",
        "upload-dialog-title": "Prześlij plik",
-       "upload-dialog-error": "Wystąpił błąd",
-       "upload-dialog-warning": "Pojawiło się ostrzeżenie",
        "upload-dialog-button-cancel": "Anuluj",
        "upload-dialog-button-done": "Gotowe",
        "upload-dialog-button-save": "Zapisz",
        "upload-dialog-button-upload": "Prześlij",
-       "upload-dialog-label-select-file": "Wybierz plik",
-       "upload-dialog-label-infoform-title": "Szczegóły",
-       "upload-dialog-label-infoform-name": "Nazwa",
-       "upload-dialog-label-infoform-description": "Opis",
-       "upload-dialog-label-usage-title": "Korzystanie",
-       "upload-dialog-label-usage-filename": "Nazwa pliku",
+       "upload-process-error": "Wystąpił błąd",
+       "upload-process-warning": "Pojawiło się ostrzeżenie",
+       "upload-form-label-select-file": "Wybierz plik",
+       "upload-form-label-infoform-title": "Szczegóły",
+       "upload-form-label-infoform-name": "Nazwa",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Korzystanie",
+       "upload-form-label-usage-filename": "Nazwa pliku",
+       "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-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.",
        "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.",
        "filerevert-legend": "Przywracanie poprzedniej wersji pliku",
        "filerevert-intro": "Zamierzasz przywrócić '''[[Media:$1|$1]]''' do [$4 wersji z $3, $2].",
        "filerevert-comment": "Powód:",
-       "filerevert-defaultcomment": "Przywrócono wersję z $2, $1",
+       "filerevert-defaultcomment": "Przywrócono wersję z $1, $2 ($3)",
        "filerevert-submit": "Przywróć",
        "filerevert-success": "Plik '''[[Media:$1|$1]]''' został cofnięty do [$4 wersji z $3, $2].",
        "filerevert-badversion": "Brak poprzedniej lokalnej wersji tego pliku z podaną datą.",
        "emailccsubject": "Kopia Twojej wiadomości do $1: $2",
        "emailsent": "Wiadomość została wysłana",
        "emailsenttext": "Twoja wiadomość została wysłana.",
-       "emailuserfooter": "Ten email został wysłany z {{GRAMMAR:D.lp|{{SITENAME}}}} do $2 przez $1 przy użyciu \"{{int\"emailpage}}\".",
+       "emailuserfooter": "Ten e-mail został {{GENDER:$1|wysłany}} z {{GRAMMAR:D.lp|{{SITENAME}}}} do {{GENDER:$2|$2}} przez $1 przy użyciu funkcji „{{int:emailuser}}”.",
        "usermessage-summary": "Pozostawianie komunikatu systemowego.",
        "usermessage-editor": "Nadawca komunikatów systemowych",
        "watchlist": "Obserwowane",
        "undeletepagetext": "{{PLURAL:$1|Następująca strona została usunięta, ale jej kopia wciąż znajduje|Następujące $1 strony zostały usunięte, ale ich kopie wciąż znajdują|Następujące $1 stron zostało usuniętych, ale ich kopie wciąż znajdują}} się w archiwum.\nArchiwum co jakiś czas może być oczyszczane.",
        "undelete-fieldset-title": "Odtwarzanie wersji",
        "undeleteextrahelp": "Jeśli chcesz odtworzyć całą historię edycji strony, pozostaw wszystkie pola niezaznaczone i kliknij '''''{{int:undeletebtn}}'''''.\nWybiórcze odtworzenie możesz wykonać, zaznaczając pola odpowiadające wersjom, które mają zostać odtworzone, a następnie klikając '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|zarchiwizowana wersja|zarchiwizowane wersje|zarchiwizowanych wersji}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|usunięta wersja|usunięte wersje|usuniętych wersji}}",
        "undeletehistory": "Odtworzenie strony spowoduje przywrócenie także jej wszystkich poprzednich wersji.\nJeśli od czasu usunięcia ktoś utworzył nową stronę o tej samej nazwie, odtwarzane wersje znajdą się w jej historii, a obecna wersja pozostanie bez zmian.",
        "undeleterevdel": "Odtworzenie nie zostanie przeprowadzone, jeśli mogłoby spowodować częściowe usunięcie aktualnej wersji strony lub pliku.\nW takiej sytuacji należy odznaczyć lub przywrócić widoczność najnowszej usuniętej wersji.",
        "undeletehistorynoadmin": "Ta strona została usunięta.\nPrzyczyna usunięcia podana jest w podsumowaniu poniżej, razem z danymi użytkownika, który edytował stronę przed usunięciem.\nSama treść usuniętych wersji jest dostępna jedynie dla administratorów.",
        "movepagetext": "Za pomocą poniższego formularza zmienisz nazwę strony, przenosząc jednocześnie jej historię.\nPod starym tytułem zostanie umieszczona strona przekierowująca.\nMożesz automatycznie zaktualizować przekierowania wskazujące na tytuł przed zmianą.\nJeśli nie wybierzesz tej opcji, upewnij się po przeniesieniu strony, czy nie powstały [[Special:DoubleRedirects|podwójne]] lub [[Special:BrokenRedirects|zerwane przekierowania]].\nJesteś odpowiedzialny za to, by linki w dalszym ciągu prowadziły tam, gdzie powinny.\n\nStrona '''nie''' zostanie przeniesiona, jeśli strona o nowej nazwie już istnieje, chyba że jest pusta lub jest przekierowaniem i ma pustą historię edycji.\nTo oznacza, że błędną operację zmiany nazwy można bezpiecznie odwrócić, zmieniając nową nazwę strony na poprzednią, i że nie można nadpisać istniejącej strony.\n\n'''UWAGA!'''\nMoże to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron.\nUpewnij się co do konsekwencji tej operacji, zanim się na nią zdecydujesz.",
        "movepagetext-noredirectfixer": "Za pomocą poniższego formularza zmienisz nazwę strony, przenosząc jednocześnie jej historię.\nPod starym tytułem zostanie umieszczona strona przekierowująca.\nUpewnij się po przeniesieniu strony, czy nie powstały [[Special:DoubleRedirects|podwójne]] lub [[Special:BrokenRedirects|zerwane przekierowania]].\nJesteś odpowiedzialny za to, by linki w dalszym ciągu pokazywały tam, gdzie powinny.\n\nStrona '''nie''' zostanie przeniesiona, jeśli strona o nowej nazwie już istnieje, chyba że jest pusta lub jest przekierowaniem i ma pustą historię edycji.\nTo oznacza, że błędną operację zmiany nazwy można bezpiecznie odwrócić, zmieniając nową nazwę strony na poprzednią, i że nie można nadpisać istniejącej strony.\n\n'''UWAGA!'''\nMoże to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron.\nUpewnij się co do konsekwencji tej operacji, zanim się na nią zdecydujesz.",
        "movepagetalktext": "Powiązana strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, chyba że:\n*niepusta strona dyskusji już jest pod nową nazwą\n*usuniesz zaznaczenie z poniższego pola wyboru\n\nW takich przypadkach treść dyskusji można przenieść tylko ręcznie.",
-       "movearticle": "Przeniesienie strony:",
        "moveuserpage-warning": "'''Uwaga!''' Masz zamiar przenieść stronę użytkownika. Miej na uwadze, że zostanie przeniesiona tylko strona, a '''nazwa użytkownika pozostanie niezmieniona'''.",
        "movecategorypage-warning": "<strong>Uwaga!</strong> Masz zamiar przenieść stronę kategorii. Miej na uwadze, że strony, które należały do starej kategorii, <em>nie</em> zostaną przeniesione do nowej.",
        "movenologintext": "Przenoszenie stron jest możliwe dopiero po zarejestrowaniu się i [[Special:UserLogin|zalogowaniu]].",
        "logentry-newusers-byemail": "Konto $3 zostało utworzone przez użytkownika $1, hasło wysłano e-mailem",
        "logentry-newusers-autocreate": "$1 automatycznie {{GENDER:$2|utworzył|utworzyła|utworzył}} konto użytkownika",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|przeniósł|przeniosła}} ustawienia zabezpieczeń z $4 do $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|usunął|usunęła}} zabezpieczanie z $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|zabezpieczył|zabezpieczyła|zabezpieczył(a)}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zabezpieczył|zabezpieczyła|zabezpieczył(a)}} $3 $4 [kaskadowo]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} poziom zabezpieczenia dla $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} poziom zabezpieczenia dla $3 $4 [kaskadowo]",
        "logentry-rights-rights": "$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup ($4 → $5)",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup",
        "logentry-rights-autopromote": "$1 automatycznie {{GENDER:$2|zmienił|zmieniła}} przynależność ($4 → $5)",
        "api-error-badaccess-groups": "Nie masz uprawnień aby przesyłać pliki do tej wiki.",
        "api-error-badtoken": "Błąd wewnętrzny – nieprawidłowy kod weryfikacyjny (token).",
        "api-error-copyuploaddisabled": "Przesyłanie poprzez podanie adresu URL zostało na tym serwerze wyłączone.",
-       "api-error-duplicate": "{{PLURAL:$1|Jest już [$2 inny plik]|Są już [$2 inne pliki]}} o tej samej zawartości",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Był już [$2 inny plik]|Były już [$2 inne pliki]}} o takiej samej zawartości, ale {{PLURAL:$1|został usunięty|zostały usunięte}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Zdublowany plik, który został już usunięty|Zdublowane pliki, które zostały już usunięte}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Zdublowany plik|Zdublowane pliki}}",
+       "api-error-duplicate": "{{PLURAL:$1|Jest już inny plik|Są już inne pliki}} o tej samej zawartości",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Był już inny plik|Były już inne pliki}} o takiej samej zawartości, ale {{PLURAL:$1|został usunięty|zostały usunięte}}.",
        "api-error-empty-file": "Przesłany przez Ciebie plik jest pusty.",
        "api-error-emptypage": "Tworzenie nowych, pustych stron jest niedozwolone.",
        "api-error-fetchfileerror": "Błąd wewnętrzny – wystąpił błąd w trakcie pobierania pliku.",
index 5f066f2..e8dce60 100644 (file)
@@ -15,7 +15,9 @@
                        "Shirayuki",
                        "아라",
                        "Kolega2357",
-                       "Purodha"
+                       "Purodha",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Anliure con la sotliniadura",
        "mergehistory-go": "Smon le modìfiche ch'as peulo butesse ansema",
        "mergehistory-submit": "Buta ansema le revision",
        "mergehistory-empty": "Pa gnun-a revision ch'as peula butesse ansema.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revision|revision}} ëd [[:$1]] a son ëstàite butà ansema a [[:$2]] sensa problema.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revision|revision}} ëd $1 a son ëstàite butà ansema a [[:$2]] sensa problema.",
        "mergehistory-fail": "A l'é nen riessusse a buté ansema le revision, për piasì, ch'as contròla la pàgina e ij temp.",
        "mergehistory-fail-toobig": "Impossìbil fé la fusion ëd la stòria përchè un nùmer ëd {{PLURAL:$1|revision}} pi grand che $1 a sarìa spostà.",
        "mergehistory-no-source": "La pàgina sorgiss $1 a-i é pa.",
        "movepagetext": "An dovrand ël mòdul ambelessì-sota a cangerà nòm a na pàgina, tramudand-je dapress ëdcò tuta soa cronologìa anvers al nòm neuv.\nËl vej tìtol a resterà trasformà ant na ridiression che a men-a al tìtol neuv.\nAs peul agiorné an automàtich le ridiression che a men-o al tìtol original.\nSe a decid ëd nen felo, ch'a contròla le [[Special:DoubleRedirects|ridiression dobie]] o le [[Special:BrokenRedirects|ridiression ch'a men-o da gnun-e part]].\nA l'é responsàbil ëd controlé che le liure a men-o ancora andoa as pensa che a devo mné.\n\nNoté bin che la pàgina a sarà '''nen''' tramudà se a-i fussa già mai n'artìcol che a l'ha ël nòm neuv, gavà col cas che a sia na ridiression, e che a l'abia già nen na soa cronologìa.\nSòn a veul dì che, se a fèissa n'operassion nen giusta, a podrìa sempe torné a rinominé la pàgina col nòm vej, ma ant gnun cas a podrìa coaté na pàgina che a-i é già.\n\n'''ATENSION!'''\nUn cambiament dràstich e nen ëspetà parèj a podrìa dé dle gran-e dzora a na pàgina motobin visità.\nChe a varda mach dë esse pì che sigur d'avèj presente le conseguense, prima che fé che fé.",
        "movepagetext-noredirectfixer": "Dovré ël formolari sì-sota a arnominërà na pàgina, tramudand tuta soa stòria al nòm neuv.\nËl tìtol vèj a vnirà na pàgina ëd ridiression al tìtol neuv.\nCh'as sigura ëd controlé le ridiression [[Special:DoubleRedirects|dobie]] o cole [[Special:BrokenRedirects|ch'a marcio nen]].\nA l'é responsàbil ëd fé an manera che le liure a continuo a ponté andova as pensa ch'a vado.\n\nCh'a armarca che la pàgina a sarà '''pa''' tramudà s'a-i é già na pàgina con ël tìtol neuv, gavà ch'a sia veuida o na ridiression e ch'a l'abia pa na stòria ëd modìfiche passà.\nSon a veul dì ch'a peul torna arnominé na pàgina andré da andova a l'avìa arnominala s'a fa n'eror, e ch'a peul pa coaté na pàgina esistenta.\n\n'''Avis!'''\nSossì a peul esse un cambi dràstich e pa spetà për na pàgina popolar;\npër piasì ch'as renda bin cont ëd le conseguense ëd sòn prima d'andé anans.",
        "movepagetalktext": "La pàgina ëd discussion tacà a costa pàgina d'artìcol, se a-i é, a sarà tramudà n'automatich ansema a l'artìcol, '''gavà costi cas-sì''':\n*quand as tramuda la pàgina tra diferent spassi nominaj,\n*quand na pàgina ëd discussion nen veujda a-i é già për ël nòm neuv, ò pura\n*a l'ha desselessionà ël quadrèt ëd conferma ambelessì-sota.\n\nAnt costi cas-sì, se a chërd dë felo, a-j farà da manca dë tramudesse la pàgina ëd discussion daspërchiel, a man.",
-       "movearticle": "Cangeje nòm a l'artìcol:",
        "moveuserpage-warning": "'''Atension:''' A sta për tramudé na pàgina d'utent. Për piasì ch'a nòta che a sarà tramudà mach la pàgina e che l'utent a sarà ''pa'' arbatjà.",
        "movecategorypage-warning": "<strong>Atension:</strong> A l'é a brus ëd tramudé na pàgina ëd categorìa. Për piasì, ch'a ten-a da ment che mach la pàgina a sarà tramudà e che tute le pàgine ant la veja categorìa a saran <em>nen</em> tramudà an cola neuva.",
        "movenologintext": "A venta esse n'Utent registrà e esse [[Special:UserLogin|rintrà ant ël sistema]]\npër podèj tramudé na pàgina.",
        "api-error-badaccess-groups": "Chiel a peul pa carié d'archivi su costa wiki.",
        "api-error-badtoken": "Eror antern: sìmbol pa bon.",
        "api-error-copyuploaddisabled": "Le carie a travers ëd liure a son disabilità ansima a cost servent.",
-       "api-error-duplicate": "A-i {{PLURAL:$1|é [$2 n'àutr archivi]|son [$2 àutri archivi]}} già an sël sit col ël midem contnù.",
-       "api-error-duplicate-archive": "A-i {{PLURAL:$1|era [$2 n'àutr archivi]|ero [$2 àutri archivi]}} già an sël sit con ël midem contnù, ma {{PLURAL:$1|a l'é stàit|a son ëstàit}} ëscancelà.",
-       "api-error-duplicate-archive-popup-title": "Dupliché {{PLURAL:$1|l'archivi|j'archivi}} ch'a son già stàit ëscancelà",
-       "api-error-duplicate-popup-title": "Dupliché {{PLURAL:$1|l'archivi|j'archivi}}",
+       "api-error-duplicate": "A-i {{PLURAL:$1|é n'àutr archivi|son àutri archivi}} già an sël sit col ël midem contnù.",
+       "api-error-duplicate-archive": "A-i {{PLURAL:$1|era n'àutr archivi|ero àutri archivi}} già an sël sit con ël midem contnù, ma {{PLURAL:$1|a l'é stàit|a son ëstàit}} ëscancelà.",
        "api-error-empty-file": "L'archivi ch'a l'ha mandà a l'era veuid.",
        "api-error-emptypage": "La creassion ëd pàgine neuve veujde a l'é nen përmëttùa.",
        "api-error-fetchfileerror": "Eror antern: quaicòs a l'é andàit mal antramentre ch'as arcuperava l'archivi.",
index 62313d8..b6c17e3 100644 (file)
@@ -9,7 +9,9 @@
                        "ZaDiak",
                        "아라",
                        "Amire80",
-                       "Obaid Raza"
+                       "Obaid Raza",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "حوڑ تھلے لین:",
        "mergehistory-go": "رلن والیاں لکھتاں وکھاؤ",
        "mergehistory-submit": "ریویسن رلاؤ",
        "mergehistory-empty": "کوئی ریوین رلائی نئیں جاسکدی",
-       "mergehistory-success": "$3 {{PLURAL:$3|ریوین}} [[:$1]] دی [[:$2]] چ رلا دتی گئی اے۔",
+       "mergehistory-done": "$3 {{PLURAL:$3|ریوین}} $1 دی [[:$2]] چ رلا دتی گئی اے۔",
        "mergehistory-fail": "رکارڈ کٹھا نئیں کیتا جاسکدا، صفہ دوبارہ ویکھو تے ویلے دا پیرامیٹر چیک کرو۔",
        "mergehistory-no-source": "سورس صفہ $1 ہے نئیں۔",
        "mergehistory-no-destination": "اپڑن صفہ $1 ہے ای نئیں۔",
        "movepagetext": "تھلے دتے گۓ فـارم نوں ورت کے  اس صفے دا ناں دوبارہ رکھیا جا سکدا اے، نال ہی اس نال جڑے تاریخچہ وی نۓ ناں نال جڑ جاۓ گی۔ اسدے بعد توں اس صفے دا پرانا ناں ، نۓ ناں ول جائیگا۔ تسیں ریڈائریکٹ تازہ کرسکدے اپنے آپ اصل صفے ول\nاگ تسیں اینج ناں کرو تے فیر پک نال [[Special:DoubleRedirects|دوہرا]]  چیک کرو یا [[Special:BrokenRedirects|ٹٹ ریڈائریکٹاں ول]] \n\nاے پکا بنانا تواڈی ذمہ داری اے کہ سارے جوڑ ٹھیک صفاں دی جانب رہنمائی کردے رین۔\n\nاے گل وی ذہن نشین کرلو کہ اگر نۓ منتخب کردہ ناں دا صفحہ پہلاں توں ہی موجود ہو تو ہوسکدا اے کہ صفحہ منتقل نہ ہوۓ ؛ ہاں اگر پہلے توں موجود صفحہ خالی اے  یا اوہ صرف اک -- ریڈائیرکٹ کیتا گیا صفحہ -- ہوۓ تے اس دے نال کوئی تاریخچہ جڑیا نہ ہووے تے ناں بدلیا جاۓ گا۔ گویا، کسی غلطی دی صورت وچ تسی صفحہ نوں دوبارہ اسی پرانے ناں دی جانب منتقل کرسکدے اوہ تے اس طرح پہلے توں موجود کسی صفحہ وچ کوئی مٹانا یا غلطی نئیں ہوۓ گی۔\n\n''' خبردار '''\n کسی اہم تے مشہور صفحہ دے ناں دی تبدیلی، اچانک تے پریشانی آلی گل وی ہوسکدی اے اس لئی؛ تبدیلی توں پہلاں مہربانی کر کے یقین کرلو کہ تسی اسدے نتائج جاندے او۔",
        "movepagetext-noredirectfixer": "تھلے دتا گیا فارم ورت کے صفے دا نواں ناں رکھیا جاسکدا اے، ایدا سارا رکارڈ نویں ناں ول کلیا جاسکدا اے۔ پرانا ناں اک ریڈائرکٹ صفہ بن کے نویں سرناویں ول جاوے گا۔\nلازمی ویکھو [[Special:DoubleRedirects|ڈبل]] یا [[Special:BrokenRedirects|ٹٹیا ریڈائرکٹ]] نوں۔\nتسیں ذمہدار او ایس گل دے جے جوڑ اوتھے ای جڑن جتھے اوناں نوں جڑنا چائیدا اے۔\n\nاے گل یاد رکھن والی جے صفہ ہٹایا نئیں جائیگا  اگر نویں سرناویں تے پہلے ای صفہ ہیگا اے جدوں تک اے صفا خالی یا ریڈائرکٹ اے تے جیدا کوئی پرانا رکارڈ ناں ہووے۔\n\n'''خبردار'''\nاے اک چوکھے پڑھے جان والے صفے لئی انہونی تی ڈر والی گل اے؛ مہربانی کرکے اے گل پکی کرلو جے تسیں ہون والی کماں نوں جاندے اوہ تے ایدے نتاریاں نوں وی۔",
        "movepagetalktext": "ایس نال جڑیا ہویا گلاں باتاں آلا صفحہ خودبخود ہی ایدھے نال ٹر جاۓ گا\n'''اگر نئیں تے'''\n*اک لکھیا گیا گلاں باتاں والا صفحہ نۓ ناں توں پہلاں توں ہی موجود اے۔\n*تسی تھلے دتے گۓ ڈبے نوں مٹا دیو۔\n\nایوجیاں مسئلیاں چ توانوں دوویں صفحیاں نوں آپے ہی ملانے ہوۓ گا اگر تسی چاندے او۔",
-       "movearticle": "صفحہ لے چلو:",
        "moveuserpage-warning": "'''خبردار''' تسیں اک ورتن صفہ ہلا رۓ اوہ۔ مہربانی کرکے اے گل یادرکھو جے صفہ ہلایا جائیگا تے ورتن والے دا ناں نئیں بدلیا جائیگا۔",
        "movenologintext": "تواڈا لازمی رجسٹرڈ ورتنوالا ہونا چائیدا اے [[Special:UserLogin|لاگڈان]] صفے نوں ہلان لئی۔",
        "movenotallowed": "تواڈے کول صفحے لے چلن دی اجازت نئیں اے۔",
        "api-error-badaccess-groups": "تھوانوں ایس وکی تے فائلاں چڑھان دی اجازت نئیں۔",
        "api-error-badtoken": "اندر دی غلطی: برا ٹوکن",
        "api-error-copyuploaddisabled": "یو آر ایل نال فائل چڑھانا ایس سرور تے نکام",
-       "api-error-duplicate": "ایتھے {{PLURAL:$1|ہے [$2 اک ہور فائل]|ہین [$2 کچ ہور فائلاں]}} ایسے مواد نال ایس تھاں تے پہلے ای ہے۔",
-       "api-error-duplicate-archive": "ایتھے  {{PLURAL:$1|سی [$2 اک ہور فائل]|سن [$2 کج ہور فائلاں]}} پہلے ای ایس تھاں تے اے اکو جے مواد نال پر {{PLURAL:$1|اے سی|اوہ سن}} مٹایا گیا۔",
-       "api-error-duplicate-archive-popup-title": "دوجی {{PLURAL:$1|فائل|فائلاں}} جناں نوں پہلے ای مٹا دتا گیا اے۔",
-       "api-error-duplicate-popup-title": "دوجی {{PLURAL:$1|فائل|فائلاں}}",
+       "api-error-duplicate": "ایتھے {{PLURAL:$1|ہے اک ہور فائل|ہین کچ ہور فائلاں}} ایسے مواد نال ایس تھاں تے پہلے ای ہے۔",
+       "api-error-duplicate-archive": "ایتھے  {{PLURAL:$1|سی اک ہور فائل|سن کج ہور فائلاں}} پہلے ای ایس تھاں تے اے اکو جے مواد نال پر {{PLURAL:$1|اے سی|اوہ سن}} مٹایا گیا۔",
        "api-error-empty-file": "جیڑی فائل تسی دسی اے اوہ حالی اے۔",
        "api-error-emptypage": "نواں بناریا آن، خالی صفیاں دی اجازت نئیں۔",
        "api-error-fetchfileerror": "اندر دی غلطی: فائل لیندیاں کوئی غلطی ہوئی۔",
index e67d487..5cd6b7b 100644 (file)
@@ -4,7 +4,8 @@
                        "Kaganer",
                        "Nertiks",
                        "Peteris",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Autengīnsenin paglaubasnā",
        "mergehistory-go": "Waidinnais senlaīminans kitawīdinsnans",
        "mergehistory-submit": "Senlajjais istōrijans stēisan kitawīdinsnan",
        "mergehistory-empty": "Ni ast wersiōnis, kawīdas mazīlai būtwei senlaītan.",
-       "mergehistory-success": "$3 {{PLURAL:$3|kitawīdinsna|kitawīdinsnas}} en [[:$1]] pastāi senlaītan sen [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|kitawīdinsna|kitawīdinsnas}} en $1 pastāi senlaītan sen [[:$2]].",
        "mergehistory-fail": "Nimazīngi senlaītun istōrijans stēisan kitawīdinsnan. Kitawīdinais ensadīnsenins stēisan parāmeterin.",
        "mergehistory-no-source": "Appus pāusan $1 ni ekzistijja",
        "mergehistory-no-destination": "Kakīnslis pāusan $1 ni ekzistijja.",
        "filerevert-legend": "Etwārtai wartinnais pirzdauman zūrbrukes wersiōnin",
        "filerevert-intro": "Tu skatta etwārtai wartīntun zūrbrukin '''[[Media:$1|$1]]''' prei [$4 wersiōnin iz $3, $2].",
        "filerevert-comment": "Kumentārs",
-       "filerevert-defaultcomment": "Etwārtai wartinnā di wersiōnin iz $2, $1",
+       "filerevert-defaultcomment": "Etwārtai wartinnā di wersiōnin iz $2, $1 ($3)",
        "filerevert-submit": "Etwārtai wartinnais",
        "filerevert-success": "Zūrbrukis '''[[Media:$1|$1]]''' pastāi etwārtai wartīntan prei [$4 wersiōnin iz $3, $2].",
        "filerevert-badversion": "Nist pirzdauma lōkala wersiōni šisse zūrbrukin sen padātan dātan.",
        "mailnologin": "Ni ast adressi",
        "mailnologintext": "Tu turri [[Special:UserLogin|enēitwei]] be turītun aktuālin e-mail adressin en twajamans [[Special:Preferences|pirminiskwans]] kāi tengīnlai e-mailins kitēimans tērpautajans.",
        "emailuser": "Tenginnais e-mailin šismu tērpautajan",
-       "emailpage": "Tenginnais e-mailin tērpautaju",
        "emailpagetext": "Tu mazzi tērpautun zemmaisin fōrmularan kāi tengīntun e-mail waīstin šismu tērpautaju.\nE-mail adressi kawīdan tū enpeisāi en [[Special:Preferences|twajjans pirminiskwans]] wīrst tikkusi en \"Ezze\" lāuku be gauwiks wīrst mazīwuns ti etrātwei entikriskai.",
        "defemailsubject": "e-mail waīstis ezze {{SITENAME}}",
        "noemailtitle": "Ni ast e-mail adressi",
        "move-page-legend": "Praskajjinais pāusan",
        "movepagetext": "Tērpawintei šin fōrmularan mazīngi kitawīdintun pāusas tītelin, praskajināntei ainakīsmingiskai tenesse istōrijan en nāunan tītelin.\nWūrs tītels wīrst pastāwuns pāusan prawedāntin en nāunan tītelin.\nTū mazzi autōmatiskai aktualizītun prawessenins, kawīdai prawedda en wūran tītelin.\nIk tū etrīnklai ni segītun stan autōmatiskai, pamēnais izbandātun [[Special:DoubleRedirects|dwigbubans]] anga [[Special:BrokenRedirects|autēnstans prawessenins]].\nTwajā etrāwingisku ast izbandātun, anga autengīnsenei autenginna prei deīktans, kwēi tenēimans prawerru autengīntun.\n\nWaīdais, kāi pāusan '''ni''' wīrst būwusi praskajjintan, ik ekzistijja jāu kittan pāusan sen nāunan tītelin be ni ast pāustan anga ni ast prawessenis be ni turri istōrijan stēisan redigīsenin.\nSta zentli, kāi tū mazzi kitawīdintun etwārtai pāusas tītelin ik assei segīwuns(si) stan blāndas paggan be kāi tu ni mazzi kirsāi peisātun ekzistīntin pāusan.\n\n'''Ēmpirsergīsenis!'''\nSta mazzi būtwei drāstiska be niggeista kitawīdinsna per pōpularin pāusan;\nmadli seīs aušaudīwingi, kāi tū izpresta rīplins pirzdau tū ēilai tālis.",
        "movepagetalktext": "Sēitan diskusiōnis pāusan wīrst būwun autōmatiskai praskajjintan, ik tēr:\n*nipāustan diskusiōnis pāusan dabber ni ekzistijja sen nāunan tītelin\n*zemmaisis etrīnksnas laūks  ast pazentlitan\n\nEn kitēimans prēipalins tū mazzi praskajjintun anga senlaītun pāusan ter rānkiskai.",
-       "movearticle": "Praskajjinais pāusan:",
        "movenologintext": "Tu turri būtwei registrītan be [[Special:UserLogin|engūbun]] kāi praskajjinlai pāusan.",
        "movenotallowed": "Tū ni assei enwarīntan, kāi praskajjinlai pāusans.",
        "movenotallowedfile": "Tū ni assei enwarīntan, kāi praskajjinlai zūrbrukins.",
index 8f5e713..e415225 100644 (file)
        "versionrequired": "د ميډياويکي $1 بڼې ته اړتيا ده",
        "versionrequiredtext": "د دې مخ په ليدلو کې د مېډياويکي $1 بڼې ته اړتيا ده. \n[[Special:Version|د بڼې مخ وگورۍ]].",
        "ok": "ښه",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "\"$1\" نه اخيستل شوی",
        "youhavenewmessages": "تاسې $1 لری  ($2).",
        "youhavenewmessagesfromusers": "تاسې د {{PLURAL:$3|يو بل کارن|$3 کارنانو}} لخوا $1 لرۍ ($2).",
        "nstab-template": "کينډۍ",
        "nstab-help": "لارښود مخ",
        "nstab-category": "وېشنيزه",
+       "mainpage-nstab": "لومړی مخ",
        "nosuchaction": "هېڅ داسې کومه کړنه نشته",
        "nosuchactiontext": "کومه کړنه چې د URL لخوا ځانگړې شوې سمه نه ده.\nکېدای شي چې URL مو سم نه وي ټايپ کړی، او يا مو يوه ناسمه تړنه څارلې وي.\nدا د دې هم ښکارندويي کوي چې کېدای شي چې د {{SITENAME}} لخوا کارېدونکې ساوترې کې يوه تېروتنه وي.",
        "nosuchspecialpage": "داسې هېڅ کوم ځانگړی مخ نشته",
        "badtitletext": "ستاسې د غوښتل شوي مخ سرليک سم نه وو، يا مو د سرليک ځای تش وو او يا هم د ژبو خپلمنځي تړنې څخه يا د ويکي گانو خپلمنځي سرليکونو څخه يو ناسم توری مو پکې کارولی وي.\nکېدای شي چې ستاسې په ورکړ شوي سرليک کې يو يا څو داسې توري وي چې د سرليک په توگه بايد و نه کارېږي.",
        "title-invalid-interwiki": "په سرليک کې يوه ويکي خپلمنځي تړنه ده",
        "perfcached": "لاندينی اومتوک په حافظه کې ساتل شوی او کېدای شي اوسمهاله شوی نه وي.  اکثر بريد له مخې {{PLURAL:$1|يوه پايله|$1 پايلې}} په حافظه کې شته.",
+       "perfcachedts": "لاندې راغلی اومتوک په حافظه کې ساتل شوی او وروستی ځل په $1 هم مهاله شوی. په ساتلې حافظې کې ډېر تر ډېره {{PLURAL:$4|يوه پايله ده|$4 پايلې دي}}.",
        "querypage-no-updates": "د دې مخ اوسمهالېدنې ناچارن شوي.\nپه ښکاره توگه د دې ځای اومتوک به نه وي تازه شوي.",
        "viewsource": "سرچينه کتل",
        "viewsource-title": "د $1 سرچينه کتل",
        "welcomecreation-msg": "گڼون مو جوړ شو.\nد [[Special:Preferences|{{SITENAME}} غوره توبونه]] بدلول مو مه هېروۍ.",
        "yourname": "کارن-نوم:",
        "userlogin-yourname": "کارن-نوم",
-       "userlogin-yourname-ph": "کارن-نوم مو وليکۍ",
+       "userlogin-yourname-ph": "کارن-نوم مو وليکئ",
        "createacct-another-username-ph": "كارن نوم مو وركړۍ",
        "yourpassword": "پټنوم:",
        "userlogin-yourpassword": "پټنوم",
-       "userlogin-yourpassword-ph": "پټنوم مو وليکۍ",
-       "createacct-yourpassword-ph": "پټنوم مو وټاپۍ",
+       "userlogin-yourpassword-ph": "پټنوم مو وليکئ",
+       "createacct-yourpassword-ph": "پټنوم مو وټاپئ",
        "yourpasswordagain": "پټنوم بيا وليکه",
        "createacct-yourpasswordagain": "پټنوم مو تاييد کړۍ",
-       "createacct-yourpasswordagain-ph": "پټنوم مو بيا وټاپۍ",
+       "createacct-yourpasswordagain-ph": "پټنوم مو بيا وټاپئ",
        "remembermypassword": "زما پټنوم په دې کمپيوټر (تر $1 {{PLURAL:$1|ورځې|ورځو}}) په ياد وساته!",
        "userlogin-remembermypassword": "غونډال کې مې ننوتلی وساته",
        "userlogin-signwithsecure": "خوندي اړيکتيا کارول",
        "userlogin-createanother": "بل گڼون جوړول",
        "createacct-emailrequired": "برېښليک پته",
        "createacct-emailoptional": "برېښليک پته (اختياري)",
-       "createacct-email-ph": "برېښليک پته مو وټاپۍ",
+       "createacct-email-ph": "برېښليک پته مو وټاپئ",
        "createacct-another-email-ph": "برېښليک پته مو ورکړۍ",
        "createaccountmail": "يو لنډمهاله ناټاکلی پټنوم کارول او ځانگړې شوې برېښليک پتې ته ورلېږل",
        "createacct-realname": "آر نوم (اختياري)",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "ولې تاسې بل گڼون جوړول غوااړۍ",
        "createacct-captcha": "امنيتي تدبير",
-       "createacct-imgcaptcha-ph": "پورته تاسې ته ښکاره شوی متن وټاپۍ",
+       "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|مخ|مخونه}}",
        "nosuchusershort": "د \"$1\" په نوم هېڅ کوم گڼون نشته. لطفاً خپل د نوم ليکلې بڼې ته ځير شی چې پکې تېروتنه نه وي.",
        "nouserspecified": "تاسې ځان ته کوم کارن نوم نه دی ځانگړی کړی.",
        "login-userblocked": "په دې کارن بنديز لگېدلی. غونډال کې ننوتلو ته پرې نه ښودلی شو.",
-       "wrongpassword": "ناسم پټنوم مو ليکلی. لطفاً يو ځل بيا يې وليکۍ.",
+       "wrongpassword": "ناسم پټنوم مو ليکلی. لطفاً يو ځل بيا يې وليکئ.",
        "wrongpasswordempty": "تاسې پټنوم نه دی ليکلی. لطفاً سر له نوي يې وليکۍ.",
        "passwordtooshort": "بايد چې پټنوم مو لږ تر لږه {{PLURAL:$1|1 توری|$1 توري}} وي.",
        "passwordtoolong": "پټنوم مو بايد له {{PLURAL:$1|1 توري|$1 تورو}} څخه اوږد نه وي.",
        "mergehistory-list": "د اخږلو وړ سمون پېښليک",
        "mergehistory-go": "اخږلو وړ سمونونه ښکاره کول",
        "mergehistory-submit": "بڼې سره يوځای کول",
-       "mergehistory-success": "د [[:$1]] $3 {{PLURAL:$3|بڼه|بڼې}} په برياليتوب سره و [[:$2]] کې {{PLURAL:$3|واخږل شو|واخږل شول}}.",
+       "mergehistory-done": "د $1 $3 {{PLURAL:$3|بڼه|بڼې}} په برياليتوب سره و [[:$2]] کې {{PLURAL:$3|واخږل شو|واخږل شول}}.",
        "mergehistory-no-source": "د سرچينې مخ $1 نشته.",
        "mergehistory-no-destination": "د $1 موخنيز مخ نشته.",
        "mergehistory-invalid-source": "د سرچينې مخ بايد يو سم سرليک وي.",
        "prefs-namespaces": "نوم-تشيالونه",
        "default": "تلواليز",
        "prefs-files": "دوتنې",
-       "prefs-custom-css": "ځاني CSS",
+       "prefs-custom-css": "دوديزه سي اس اس",
        "prefs-custom-js": "ځاني جاواسکرېپټ",
        "prefs-common-css-js": "د ټولو پوښونو لپاره د CSS/جاواسکرېپټ دوتنه:",
        "prefs-emailconfirm-label": "د برېښليک باورتيا:",
        "prefs-registration": "د نومليکنې وخت:",
        "yourrealname": "اصلي نوم:",
        "yourlanguage": "ژبه:",
+       "yourvariant": "د ژبگړدود مېنځپانگه:",
        "yournick": "نوی لاسليک:",
        "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": "د برېښليک ورکړه ستاسې په خوښه ده، خو په ورکړې سره به يې د يوه نوي پټنوم د لېږلو چار آسانه کړي هغه هم کله چې تاسې نه خپل پټنوم هېر شوی وي.",
        "group-bot": "روباټونه",
        "group-sysop": "پازوالان",
        "group-bureaucrat": "بيوروکراټان",
-       "group-suppress": "Ú\85ارونکي",
+       "group-suppress": "Ú\81Ù¾Ù\88ونکي",
        "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|Ú\85ارÙ\86}}",
+       "group-suppress-member": "{{GENDER:$1|Ú\81Ù¾Ù\88Ù\88Ù\86Ú©Û\8c}}",
        "grouppage-user": "{{ns:project}}:کارنان",
        "grouppage-autoconfirmed": "{{ns:project}}:تاييد شوي کارنان",
        "grouppage-bot": "{{ns:project}}:روباټان",
        "grouppage-sysop": "{{ns:project}}:پازوالان",
        "grouppage-bureaucrat": "{{ns:project}}:بيوروکراټان",
-       "grouppage-suppress": "{{ns:project}}:Ú\85ارÙ\86",
+       "grouppage-suppress": "{{ns:project}}:Ú\81Ù¾Ù\84",
        "right-read": "مخونه لوستل",
        "right-edit": "مخونه سمول",
        "right-createpage": "مخونه جوړول (هغه چې د خبرو اترو مخونه نه دي)",
        "boteditletter": "ر",
        "number_of_watching_users_pageview": "[$1  {{PLURAL:$1|کتونکی کارن|کتونکي کارنان}}]",
        "rc_categories": "د وېشنيزو بريدونه (په \"|\" بېلول)",
-       "rc_categories_any": "هر يو",
+       "rc_categories_any": "Ù\84Ù\87 Ù¼Ø§Ú©Ù\84 Ø´Ù\88Ù\8aÙ\88 Ù\87ر Ù\8aÙ\88",
        "rc-change-size-new": "$1 {{PLURAL:$1|بايټ|بايټونه}} د بدلون وروسته",
        "newsectionsummary": "/* $1 */ نوې برخه",
        "rc-enhanced-expand": "تفصيل ښکاره کول",
        "upload-misc-error": "د پورته کېدنې نامالومه تېروتنه",
        "upload-http-error": "د HTTP يوه ستونزه رامېنځ ته شوې: $1",
        "upload-dialog-title": "دوتنه پورته کول",
-       "upload-dialog-error": "يوه ستونزه پېښه شوې",
-       "upload-dialog-warning": "يوه گواښنه رامېنځ ته شوه",
        "upload-dialog-button-cancel": "ناگارل",
        "upload-dialog-button-done": "ترسره شو",
        "upload-dialog-button-save": "خوندي کول",
        "upload-dialog-button-upload": "پورته کول",
-       "upload-dialog-label-select-file": "دوتنه ټاکل",
-       "upload-dialog-label-infoform-title": "ځانگړنې",
-       "upload-dialog-label-infoform-name": "نوم",
-       "upload-dialog-label-infoform-description": "څرگندونه",
-       "upload-dialog-label-usage-title": "کارېدنې",
-       "upload-dialog-label-usage-filename": "د دوتنې نوم",
+       "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": "د دوتنې نوم",
        "backend-fail-notexists": "د $1 په نوم دوتنه نشته.",
        "backend-fail-delete": "د \"$1\" دوتنه ړنګه نه شوه.",
        "backend-fail-alreadyexists": "د $1 دوتنه له پخوا نه شته.",
        "pageswithprop-submit": "ورځه",
        "doubleredirects": "دوه ځلي ورگرځېدنې",
        "brokenredirects": "ماتې ورگرځېدنې",
+       "brokenredirectstext": "لاندينۍ مخ گرځونې ناموجوده مخونو سره تړنې لري:",
        "brokenredirects-edit": "سمول",
        "brokenredirects-delete": "ړنگول",
        "withoutinterwiki": "د ژبې د تړنو بې برخې مخونه",
        "nmembers": "$1 {{PLURAL:$1|غړی|غړي}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|غړی|غړي}}",
        "nrevisions": "$1 {{PLURAL:$1|بڼه|بڼې}}",
-       "nimagelinks": "په $1 {{PLURAL:$1|کارېدلی مخ|کارېدلي مخونه}}",
+       "nimagelinks": "په $1 {{PLURAL:$1|مخ|مخونو}} کارېدلی",
        "ntransclusions": "په $1 {{PLURAL:$1|مخ|مخونو}} کارېدلی",
        "specialpage-empty": "د دې راپور لپاره کومې پايلې نشته.",
        "lonelypages": "يتيم مخونه",
        "nopagetext": "کوم مخ مو چې وښوده هغه نشته.",
        "pager-newer-n": "{{PLURAL:$1|نوی 1|نوي $1}}",
        "pager-older-n": "{{PLURAL:$1|زوړ 1|زاړه $1}}",
-       "suppress": "Ú\85ارÙ\86",
+       "suppress": "Ú\81Ù¾Ù\84",
        "apihelp": "API لارښود",
        "apihelp-no-such-module": "د \"$1\" ماډيول و نه موندل شو.",
        "booksources": "د کتاب سرچينې",
        "editcomment": "د سمون لنډيز دا و: \"''$1''\".",
        "changecontentmodel-title-label": "مخ سرليک",
        "changecontentmodel-reason-label": "سبب:",
+       "logentry-contentmodel-change-revertlink": "په څټ گرځول",
+       "logentry-contentmodel-change-revert": "په څټ گرځول",
        "protectlogpage": "د ژغورنې يادښت",
        "protectlogtext": "دلته لاندې د ژغورل شويو مخونو د بدلونونو لړليک راغلی.\nد دم گړۍ فعالو مخ ژغورنو لړليک لپاره د [[Special:ProtectedPages|ژغورل شويو مخونو لړليک]] وگورئ.",
        "protectedarticle": "\"[[$1]]\" وژغورل شو",
        "sp-contributions-search": "د ونډو پلټنه",
        "sp-contributions-username": "IP پته يا کارن-نوم:",
        "sp-contributions-toponly": "يوازې هغه سمونونه چې تر ټولو تازه بڼې لري ښکاره کول",
+       "sp-contributions-newonly": "يوازې د مخ جوړېدنې سمونونه ښکاره کول",
        "sp-contributions-submit": "پلټل",
        "whatlinkshere": "د دې مخ تړنې",
        "whatlinkshere-title": "هغه مخونه چې د \"$1\" سره تړنې لري",
        "expiringblock": "په $1 نېټه، $2 بجو پای ته رسېږي",
        "anononlyblock": "يواځې ورکنومی",
        "createaccountblock": "په گڼون جوړولو بنديز لگېدلی",
-       "emailblock": "پر Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ø¨Ù\86دÙ\8aز Ù\88Ù\84Ú«ېد",
+       "emailblock": "پر Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ø¨Ù\86دÙ\8aز Ù\88Ù\84Ú¯ېد",
        "blocklist-nousertalk": "د خبرواترو خپل مخ نه شی سمولای",
        "ipblocklist-empty": "د بنديز لړليک تش دی",
        "blocklink": "بنديز لگول",
        "ipb_already_blocked": "پر \"$1\" د پخوا نه بنديز دی",
        "ipb-needreblock": "پر $1 د پخوا نه بنديز لگېدلی.\nآيا تاسې د امستنو بدلول غواړۍ؟",
        "ipb-otherblocks-header": "{{PLURAL:$1|بل بنديز|نور بنديزونه}}",
+       "ip_range_invalid": "ناسم آی پي بريد.",
        "lockdb": "توکبنسټ تړل",
        "unlockdb": "توکبنسټ پرانيستل",
        "lockconfirm": "هو، زه د توکبنسټ تړل غواړم.",
        "movepagetext": "د لاندينۍ فورمې په کارولو سره تاسې د يوه مخ نوم بدلولی شی، چې په همدې توگه به د يوه مخ ټول پېښليک د هغه د نوي نوم سرليک ته ولېږدېږي.\nد يوه مخ، پخوانی نوم به د نوي نوم ورگرځونکی مخ وگرځي او نوي سرليک ته به وگرځولی شي.\nهغه تړنې چې په زاړه مخ کې دي په هغو کې به هېڅ کوم بدلون را نه شي;\n[[Special:BrokenRedirects|د ماتو مخ گرځونو]] يا [[Special:DoubleRedirects|دوه ځلي مخ گرځونو]] د ستونزو د پېښېدو په خاطر ځان ډاډه کړی چې ستاسې مخ گرځونې ماتې يا دوه ځله نه وي.\nدا ستاسې پازه ده چې ځان په دې هم ډاډمن کړی چې آيا هغه تړنې کوم چې د يو مخ سره پکار دي چې وي، همداسې په پرله پسې توگه پېيلي او خپل موخن ځايونو سره اړونده دي.\n\nپه ياد مو اوسه چې يو مخ به '''هېڅکله''' و نه لېږدېږي که چېرته د پخوا نه په هماغه نوم يو مخ شتون ولري، خو که چېرته يو مخ تش وه او يا هم يوه مخ گرځونه چې پېښليک کې يې بدلون نه وي راغلی. نو دا په دې مانا ده چې تاسې کولای شی چې د يو مخ نوم بېرته هماغه پخواني نوم ته بدل کړی چې د پخوا نه يې درلوده، که چېرته تاسې تېرووځۍ نو په داسې حال کې تاسې نه شی کولای چې د يوه مخ پر سر يو څه وليکۍ.\n\n'''گواښنه!'''\nيوه نوي نوم ته د مخونو د نوم بدلون کېدای شي چې په نامتو مخونو کې بنسټيزه او نه اټکل کېدونکی بدلونونه رامېنځ ته کړي;\nمخکې له دې نه چې پرمخ ولاړ شی، لطفاُ لومړی خپل ځان په دې ډاډه کړی چې تاسې ددغې کړنې په پايلو ښه پوهېږۍ.",
        "movepagetext-noredirectfixer": "د لاندينۍ فورمې په کارولو سره تاسې د يوه مخ نوم بدلولی شی، چې په همدې توگه به د يوه مخ ټول پېښليک د هغه د نوي نوم سرليک ته ولېږدېږي.\nد يوه مخ، پخوانی نوم به د نوي نوم ورگرځونکی مخ وگرځي او نوي سرليک ته به وگرځولی شي.\n\n[[Special:BrokenRedirects|د ماتو مخ گرځونو]] يا [[Special:DoubleRedirects|دوه ځلي مخ گرځونو]] د ستونزو د پېښېدو په خاطر ځان ډاډه کړی چې ستاسې مخ گرځونې ماتې يا دوه ځله نه وي.\nدا ستاسې پازه ده چې ځان په دې هم ډاډمن کړی چې آيا هغه تړنې کوم چې د يو مخ سره پکار دي چې وي، همداسې په پرله پسې توگه پېيلي او خپل د موخې ځايونو سره اړونده دي که نه.\n\nپه ياد مو اوسه چې يو مخ به '''هېڅکله''' و نه لېږدېږي که چېرته د پخوا نه په هماغه نوم يو بل مخ شتون ولري، خو که چېرته يو مخ تش وه او يا هم يوه مخ گرځونه چې پېښليک کې يې بدلون نه وي راغلی. نو دا په دې مانا ده چې تاسې کولای شی چې د يو مخ نوم بېرته هماغه پخواني نوم ته بدل کړی چې د پخوا نه يې درلوده، که چېرته تاسې تېرووځۍ نو په داسې حال کې تاسې نه شی کولای چې د يوه مخ پر سر يو څه وليکۍ.\n\n'''گواښنه!'''\nيوه نوي نوم ته د مخونو د نوم بدلون کېدای شي چې په نامتو مخونو کې بنسټيزه او نه اټکل کېدونکي بدلونونه رامېنځ ته کړي; مخکې له دې نه چې پرمخ ولاړ شی، لطفاُ لومړی خپل ځان په دې ډاډه کړی چې تاسې ددغې کړنې په پايلو ښه پوهېږۍ.",
        "movepagetalktext": "همدې مخ ته اړونده د خبرواترو مخ هم په اتوماتيک ډول لېږدول کېږي '''خو که چېرته:'''\n*په نوي نوم د پخوا نه د خبرواترو يو مخ شتون ولري، او يا هم\n*تاسې ته لاندې ورکړ شوی څلورڅنډی په نښه شوی وي.\n\nنو په هغه وخت کې پکار ده چې د خبرواترو د مخ لېږدونه او د نوي مخ سره د يوځای کولو کړنه په لاسي توگه ترسره کړی.",
-       "movearticle": "مخ لېږدول",
        "moveuserpage-warning": "'''گواښنه:''' تاسې د يو کارن مخ د لېږدولو په حال کې ياست. لطفاً دا مه هېروۍ چې يوازې همدا مخ به ولېږدول شي او د کارن نوم به ''نه'' بدلېږي.",
        "movenologintext": "ددې لپاره چې يو مخ ولېږدوی، نو تاسې بايد يو ثبت شوی کارن او غونډال کې [[Special:UserLogin|ننوتي]] اوسۍ.",
        "movenotallowed": "تاسې د مخونو د لېږدولو پرېښله نلرۍ.",
        "exif-unknowndate": "ناڅرگنده نېټه",
        "exif-orientation-1": "نورمال",
        "exif-componentsconfiguration-0": "نشته دی",
+       "exif-exposureprogram-1": "لاسي",
        "exif-exposureprogram-2": "نورماله پروګرام",
        "exif-subjectdistance-value": "$1 متره",
        "exif-meteringmode-0": "ناجوت",
        "feedback-useragent": "کارن پلاوی:",
        "searchsuggest-search": "پلټل",
        "api-error-badaccess-groups": "تاسې دې ويکي کې د دوتونو ورپورته کولو پرېښه نه لرۍ.",
-       "api-error-duplicate-popup-title": "غبرګونې {{PLURAL:$1|دوتنه|دوتنې}}.",
        "api-error-empty-file": "کومه دوتنه چې تاسې دلته سپارلې هغه تشه ده.",
        "api-error-emptypage": "د نوي تشو مخونو جوړولو پرېښنه نه شته.",
        "api-error-file-too-large": "کومه دوتنه چې تاسې دلته سپارلې ډېره لويه ده.",
index 8bf1aae..cfa52aa 100644 (file)
@@ -83,7 +83,8 @@
                        "TheEduGobi",
                        "Araceletorres",
                        "L",
-                       "Walesson"
+                       "Walesson",
+                       "Rhcastilhos"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "nstab-template": "Predefinição",
        "nstab-help": "Página de ajuda",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Página principal",
        "nosuchaction": "Ação inexistente",
        "nosuchactiontext": "A ação especificada pela URL é inválida.\nVocê deve ter se enganado ao digitar a URL, ou acessou um link incorreto.\nIsso também pode indicar um erro no software usado no sítio {{SITENAME}}.",
        "nosuchspecialpage": "Esta página especial não existe",
        "protectedinterface": "Esta página fornece texto de interface ao software deste wiki, se encontrando protegida para prevenir abusos.\n\nPara adicionar ou alterar traduções em todos os wikis, utilize o [//translatewiki.net/ translatewiki.net], projeto de traduções do MediaWiki.",
        "editinginterface": "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.\nAlterações nesta página irão afetar a aparência da interface de usuário para outros usuários deste wiki.\nPara alterar ou adicionar traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt-br translatewiki.net], um projeto destinado para a tradução do MediaWiki.",
        "translateinterface": "Para adicionar ou modificar traduções para todas as wikis, por favor use  [//translatewiki.net/ translatewiki.net], o projeto de localização do MediaWiki.",
-       "cascadeprotected": "Esta página foi protegida contra edições porque é transcluída na seguinte {{PLURAL: $1, | página, que é | páginas, que estão protegidas}} com a \"cascata\" opção ativada: $2",
+       "cascadeprotected": "Esta página foi protegida contra edições porque é transcluída {{PLURAL:$1| na seguinte página que está protegida|nas seguintes páginas que estão protegidas}} com a opção \"em cascata\" ativada: $2",
        "namespaceprotected": "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
        "customcssprotected": "Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.",
        "customjsprotected": "Você não tem permissão para editar esta página de JavaScript, porque ele contém configurações pessoais de outro usuário.",
        "createacct-captcha": "Verificação de segurança",
        "createacct-imgcaptcha-ph": "Digite o texto acima",
        "createacct-submit": "Crie sua conta",
-       "createacct-another-submit": "Criar outra conta",
+       "createacct-another-submit": "Criar conta",
        "createacct-benefit-heading": "{{SITENAME}} é feita por pessoas como você.",
        "createacct-benefit-body1": "{{PLURAL:$1|edição|edições}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuidor|contribuidores}} recentes",
        "badretype": "As senhas que você digitou não são iguais.",
-       "usernameinprogress": "Uma criação da conta para este nome de usuário já está em andamento. Por favor, aguarde.",
+       "usernameinprogress": "Uma criação da conta para este nome de usuário já está em andamento.\nPor favor, aguarde.",
        "userexists": "O nome de usuário fornecido já está em uso.\nEscolha um nome diferente.",
        "loginerror": "Erro de autenticação",
        "createacct-error": "Erro ao criar a conta",
        "changeemail-password": "Sua senha para o wiki {{SITENAME}}:",
        "changeemail-submit": "Alterar e-mail",
        "changeemail-throttled": "Você realizou demasiadas tentativas de se registrar.\nPor favor, aguarde $1 antes de tentar novamente.",
+       "changeemail-nochange": "Por favor insira um novo endereço de e-mail.",
        "resettokens": "Reiniciar os tokens",
        "resettokens-text": "Você pode reiniciar os tokens, que permitem o acesso a certos dados privados associados à sua conta, aqui.\n\nVocê só deve reiniciá-los se compartilhou-os com alguém ou se a sua conta foi comprometida.",
        "resettokens-no-tokens": "Não existem tokens para reiniciar.",
        "readonlywarning": "'''Aviso: O banco de dados foi bloqueado para manutenção, por isso você não poderá salvar a sua edição neste momento.'''\nTalvez você queira copiar o seu texto num editor externo e guardá-lo, para posterior envio.\n\nQuem bloqueou o banco de dados forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Atenção: Esta página foi protegida para que apenas usuários com privilégios de administrador possam editá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida, sendo que apenas usuários registrados poderão editá-la.\nA última entrada no histórico é fornecida abaixo para referência:",
-       "cascadeprotectedwarning": "<strong> Aviso: </ strong> Esta página foi protegida para que somente os usuários com privilégios de administrador pode editá-lo porque ele é transcluída na seguinte protegido por cascata {{PLURAL: $1 | página | páginas}}:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página foi protegida para que somente usuários com privilégios de administrador possam editá-la porque ela é transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} por cascata:",
        "titleprotectedwarning": "'''Atenção: esta página foi protegida; [[Special:ListGroupRights|privilégios específicos]] são necessários para criá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "templatesused": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta página:",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta previsão:",
        "mergehistory-go": "Exibir edições habilitadas a serem fundidas",
        "mergehistory-submit": "Fundir revisões",
        "mergehistory-empty": "Não existem edições habilitadas a serem fundidas.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisão|revisões}} de [[:$1]] fundidas em [[:$2]] com sucesso.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisão|revisões}} de $1 fundidas em [[:$2]] com sucesso.",
        "mergehistory-fail": "Não foi possível fundir os históricos; por gentileza, verifique a página e os parâmetros de tempo.",
        "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.",
        "mergehistory-no-source": "A página de origem ($1) não existe.",
        "search-category": "(categoria $1)",
        "search-file-match": "(coincide com o conteúdo do arquivo)",
        "search-suggest": "Você quis dizer: $1?",
-       "search-rewritten": "Mostrando resultados por $1. Pesquisar em vez de $2.",
+       "search-rewritten": "Mostrando resultados para $1. Pesquisar ao invés por $2.",
        "search-interwiki-caption": "Projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
        "rows": "Linhas:",
        "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
-       "stub-threshold": "Limiar para a formatação ligação stub (US $1):",
+       "stub-threshold": "Limite para a formatação de ligações para esboços ($1):",
        "stub-threshold-sample-link": "amostra",
        "stub-threshold-disabled": "Desabilitado",
        "recentchangesdays": "Dias a apresentar nas mudanças recentes:",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 usuário|$1 usuários}} vigiando]",
-       "rc_categories": "Limite para categorias (separar com \"|\"):",
-       "rc_categories_any": "Qualquer dos escolhidos",
+       "rc_categories": "Limitar às categorias (separar com \"|\"):",
+       "rc_categories_any": "Qualquer um dos escolhidos",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após alterações",
        "newsectionsummary": "/* $1 */ nova seção",
        "rc-enhanced-expand": "Exibir detalhes",
        "uploaddisabledtext": "O envio de arquivos encontra-se desativado.",
        "php-uploaddisabledtext": "O envio de arquivos via PHP está desativado.\nVerifique a configuração file_uploads.",
        "uploadscripted": "Este arquivo contém HTML ou código que pode ser erroneamente interpretado por um navegador web.",
-       "upload-scripted-pi-callback": "Não é possível fazer upload de um arquivo que contém a instrução de processamento XML-estilo.",
-       "uploaded-script-svg": "Elemento encontrado programável \"$1\" no arquivo SVG carregado.",
+       "upload-scripted-pi-callback": "Não é possível fazer upload de um arquivo que contém instruções de processamento de folha de estilo XML.",
+       "uploaded-script-svg": "Encontrado elemento de script \"$1\" no arquivo SVG carregado.",
        "uploaded-hostile-svg": "Encontrado CSS inseguro no elemento de estilo do arquivo SVG carregado.",
-       "uploaded-event-handler-on-svg": "Configuração de manipulador de eventos atribui <code> $1 = \"$2\" </ code> não é permitido em arquivos SVG.",
+       "uploaded-event-handler-on-svg": "Não é permitido configurar atributos que manipulem eventos  <code>$1=\"$2\"</code> em arquivos SVG.",
        "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"$1\"",
        "uploadinvalidxml": "O XML no arquivo enviado não pôde ser analisado.",
        "uploadvirus": "O arquivo contém vírus!\nDetalhes: $1",
        "upload-too-many-redirects": "A URL contém redirecionamentos demais",
        "upload-http-error": "Ocorreu um erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "Não é possível realizar envios remotos neste domínio.",
+       "upload-dialog-title": "Enviar arquivo",
        "upload-dialog-button-cancel": "Cancelar",
        "upload-dialog-button-done": "Feito",
        "upload-dialog-button-save": "Salvar",
        "upload-dialog-button-upload": "Enviar",
-       "upload-dialog-label-select-file": "Selecionar arquivo",
-       "upload-dialog-label-infoform-title": "Detalhes",
-       "upload-dialog-label-infoform-name": "Nome",
-       "upload-dialog-label-infoform-description": "Descrição",
-       "upload-dialog-label-usage-title": "uso",
-       "upload-dialog-label-usage-filename": "Nome do arquivo",
+       "upload-process-error": "Ocorreu um erro",
+       "upload-process-warning": "Ocorreu um aviso",
+       "upload-form-label-select-file": "Selecionar arquivo",
+       "upload-form-label-infoform-title": "Detalhes",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrição",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nome do arquivo",
        "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.",
        "filerevert-legend": "Reverter arquivo",
        "filerevert-intro": "<span class=\"plainlinks\">Você está revertendo '''[[Media:$1|$1]]''' para a [$4 versão de $2 - $3].</span>",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Revertido para a versão de $1 - $2",
+       "filerevert-defaultcomment": "Revertido para a versão de $2, $1 ($3)",
        "filerevert-submit": "Reverter",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' foi revertida para a [$4 versão de $2 - $3].</span>",
        "filerevert-badversion": "Não há uma versão local anterior deste arquivo no período de tempo especificado.",
        "unusedimages": "Arquivos não utilizados",
        "wantedcategories": "Categorias pedidas",
        "wantedpages": "Páginas pedidas",
-       "wantedpages-summary": "Lista de páginas não-existentes com mais links para eles, excluindo páginas que apenas têm redirecionamentos links para eles. Para obter uma lista de páginas não-existentes que têm redirecionamentos links para eles, veja [[{{#special: Brokenredirects}} | lista de redirecionamentos quebrados]].",
+       "wantedpages-summary": "Lista de páginas inexistentes com mais ligações para elas, excluindo páginas que têm apenas redirecionamentos ligando a elas. Para uma lista de páginas inexistentes mas que têm redirecionamentos que ligam a elas, veja [[{{#special:BrokenRedirects}}|a lista de redirecionamentos quebrados]].",
        "wantedpages-badtitle": "Título inválido no conjunto de resultados: $1",
        "wantedfiles": "Arquivos pedidos",
        "wantedfiletext-cat": "Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>. As páginas que incluem arquivos inexistentes são listadas em [[:$1]].",
        "nopagetext": "A página alvo especificada não existe.",
        "pager-newer-n": "{{PLURAL:$1|posterior|$1 posteriores}}",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
-       "suppress": "Supervisor",
+       "suppress": "Suprimir",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "apihelp": "Ajuda de API",
        "apihelp-no-such-module": "Modulo \"$1\" não foram achados.",
        "booksources-text": "É exibida a seguir uma listagem de links para outros sites que vendem livros novos e usados e que possam possuir informações adicionais sobre os livros que você está pesquisando:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique se houve erros ao copiar da fonte original.",
        "specialloguserlabel": "Executor:",
-       "speciallogtitlelabel": "Alvo (título ou {{ns: user}}: nome de usuário para usuário):",
+       "speciallogtitlelabel": "Alvo (título da página ou {{ns:user}}:'nomedeusuário' para usuários):",
        "log": "Registros",
        "all-logs-page": "Todos os registros públicos",
        "alllogstext": "Exibição combinada de todos registros disponíveis para o {{SITENAME}}.\nVocê pode diminuir a lista escolhendo um tipo de registro, um nome de usuário (sensível a maiúsculas e minúsculas), ou uma página afetada (também sensível a maiúsculas e minúsculas).",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detetados problemas com a sua sessão;\nEsta ação foi cancelada como medida de proteção contra a intercepção de sessões.\nExperimente usar o botão \"Voltar\" e atualizar a página de onde veio e tente novamente.",
-       "changecontentmodel": "Mudar modelo de conteúdo de uma página",
-       "changecontentmodel-legend": "Mudar modelo de conteúdo",
+       "changecontentmodel": "Alterar o modelo de conteúdo de uma página",
+       "changecontentmodel-legend": "Alterar o modelo de conteúdo",
        "changecontentmodel-title-label": "Título da página",
        "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-success-title": "O modelo de conteúdo foi alterado",
+       "changecontentmodel-success-text": "O tipo de conteúdo de [[:$1]] foi alterado.",
        "logentry-contentmodel-change-revertlink": "reverter",
+       "logentry-contentmodel-change-revert": "reverter",
        "protectlogpage": "Registro de proteção",
        "protectlogtext": "Encontra-se abaixo o registro de proteção e desproteção de páginas.\nConsulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as páginas que se encontram protegidas neste momento.",
        "protectedarticle": "protegeu \"[[$1]]\"",
        "protect-othertime": "Outra duração:",
        "protect-othertime-op": "outra duração",
        "protect-existing-expiry": "A proteção atual expirará às $3 de $2",
-       "protect-existing-expiry-infinity": "Existente tempo de expiração: infinito",
+       "protect-existing-expiry-infinity": "Tempo de expiração existente: infinito",
        "protect-otherreason": "Outro motivo/motivo adicional:",
        "protect-otherreason-op": "Outro motivo",
        "protect-dropdown": "*Motivos comuns para proteção\n** Vandalismo excessivo\n** Inserção excessiva de ''spams''\n** Guerra de edições improdutiva\n** Página bastante acessada",
        "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.",
-       "movearticle": "Mover página",
        "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.",
        "pageinfo-robot-index": "Autorizado",
        "pageinfo-robot-noindex": "Desautorizado",
        "pageinfo-watchers": "Número de vigilantes da página",
+       "pageinfo-visiting-watchers": "Número de vigilantes que consultaram as edições recentes da página",
        "pageinfo-few-watchers": "Menos de  $1  {{PLURAL:$1|vigilante|vigilantes}}",
        "pageinfo-redirects-name": "Número de redirecionamentos para esta página",
        "pageinfo-subpages-name": "Subpáginas desta página",
        "htmlform-cloner-create": "Adicionar mais",
        "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-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",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
        "logentry-delete-delete": "$1 apagou a página $3",
        "logentry-newusers-create2": "A conta de usuário $3 foi criada por $1",
        "logentry-newusers-byemail": "A conta de usuário $3 foi criada por $1, com a senha sendo enviada por e-mail",
        "logentry-newusers-autocreate": "A conta de usuário $1 foi criada automaticamente",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|removed}} proteção de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protected}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protected}} $3 $4 [cascading]",
        "logentry-rights-rights": "$1 alterou os grupos de usuário de $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi promovido automaticamente de $4 para $5",
        "api-error-badaccess-groups": "Você não tem permissão para enviar arquivos para este wiki.",
        "api-error-badtoken": "Erro interno: token inválido.",
        "api-error-copyuploaddisabled": "O upload por URL está desativado neste servidor.",
-       "api-error-duplicate": "Já {{PLURAL:$1|há [$2 outro arquivo]|existem [$2 outros arquivos]}} com o mesmo conteúdo",
-       "api-error-duplicate-archive": "Já {{PLURAL:$1|existiu [$2 outro arquivo]|existiram [$2 outros arquivos]}} neste site com o mesmo conteúdo que, no entanto, {{PLURAL:$1|foi removido|foram removidos}}.",
-       "api-error-duplicate-archive-popup-title": "Duplicata de {{PLURAL:$1|arquivo|arquivos}} que já {{PLURAL:$1|foi apagado|foram apagados}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Arquivo|Arquivos}} em duplicata",
+       "api-error-duplicate": "Já {{PLURAL:$1|há outro arquivo|existem outros arquivos}} com o mesmo conteúdo",
+       "api-error-duplicate-archive": "Já {{PLURAL:$1|existiu outro arquivo|existiram outros arquivos}} neste site com o mesmo conteúdo que, no entanto, {{PLURAL:$1|foi removido|foram removidos}}.",
        "api-error-empty-file": "O arquivo que você enviou está vazio.",
        "api-error-emptypage": "Não é permitido criar páginas novas vazias.",
        "api-error-fetchfileerror": "Erro interno: ocorreu um problema indeterminado ao acessar o arquivo.",
        "special-characters-title-endash": "traço",
        "special-characters-title-emdash": "travessão",
        "special-characters-title-minus": "sinal de menos",
+       "mw-widgets-dateinput-no-date": "Nenhuma data selecionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
-       "mw-widgets-titleinput-description-redirect": "Direto para $1"
+       "mw-widgets-titleinput-description-new-page": "a página ainda não existe",
+       "mw-widgets-titleinput-description-redirect": "redirecionar para $1"
 }
index 64f1e09..5df27d8 100644 (file)
        "nstab-template": "Predefinição",
        "nstab-help": "Ajuda",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Página principal",
        "nosuchaction": "Operação não existe",
        "nosuchactiontext": "A operação especificada pela URL é inválida.\nÉ possível que tenha escrito mal a URL ou seguido uma ligação incorreta.\nIsto pode também indicar um defeito no software da {{SITENAME}}.",
        "nosuchspecialpage": "Esta página especial não existe",
        "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 uma outra conta",
+       "createacct-another-submit": "Criar conta",
        "createacct-benefit-heading": "{{SITENAME}} é feito por pessoas como você.",
        "createacct-benefit-body1": "{{PLURAL:$1|edição|edições}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "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": "Foi enviado um correio eletrónico para recuperação da palavra-passe.",
+       "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-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 o endereço de correio eletrónico",
-       "changeemail-text": "Preencha este formulário para alterar o endereço de correio eletrónico. Para confirmar esta alteração terá de introduzir a sua palavra-passe.",
+       "changeemail": "Alterar ou remover o endereço de correio eletrónico",
+       "changeemail-text": "Preencha este formulário para alterar o endereço de correio eletrónico. Para confirmar esta alteração terá de introduzir a sua palavra-passe. Se pretender remover o endereço de correio eletrónico associado à sua conta, deixe vazio o campo do formulário para o novo endereço.",
        "changeemail-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
        "changeemail-newemail": "Novo endereço de correio eletrónico:",
+       "changeemail-newemail-help": "Este campo deve ser deixado em branco caso pretenda remover o seu endereço de correio eletrónico.\nNão será capaz de redefinir a sua palavra-passe nem receber mensagens eletrónicas desta wiki se efetuar esta operação.",
        "changeemail-none": "(nenhum)",
        "changeemail-password": "A sua palavra-passe em {{SITENAME}}:",
        "changeemail-submit": "Alterar correio eletrónico",
        "permissionserrorstext-withaction": "Não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "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.",
        "log-fulllog": "Ver registo detalhado",
        "edit-hook-aborted": "A edição foi abortada por um hook.\nNão foi dada nenhuma explicação.",
        "edit-gone-missing": "Não foi possível atualizar a página.\nEla parece ter sido eliminada.",
        "mergehistory-go": "Mostrar edições que podem ser fundidas",
        "mergehistory-submit": "Fundir edições",
        "mergehistory-empty": "Não existem revisões fundíveis.",
-       "mergehistory-success": "Foram fundidas $3 {{PLURAL:$3|edição|edições}} de [[:$1]] em [[:$2]].",
+       "mergehistory-done": "Foram fundidas $3 {{PLURAL:$3|edição|edições}} de $1 {{PLURAL:$3|em}} [[:$2]].",
        "mergehistory-fail": "Não foi possível fundir os históricos; verifique a página e os parâmetros de tempo, por favor.",
        "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.",
        "mergehistory-no-source": "A página de origem $1 não existe.",
        "prefs-watchlist-token": "Chave secreta da lista de páginas vigiadas:",
        "prefs-misc": "Diversos",
        "prefs-resetpass": "Alterar palavra-passe",
-       "prefs-changeemail": "Alterar correio eletrónico",
+       "prefs-changeemail": "Alterar ou remover correio eletrónico",
        "prefs-setemail": "Definir um endereço de correio eletrónico",
        "prefs-email": "Opções do correio eletrónico",
        "prefs-rendering": "Aparência",
        "group-bot": "Robôs",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burocratas",
-       "group-suppress": "Supervisores",
+       "group-suppress": "Supressores",
        "group-all": "(todos)",
        "group-user-member": "{{GENDER:$1|utilizador|utilizadora}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utilizador autoconfirmado|utilizadora autoconfirmada}}",
        "grouppage-bot": "{{ns:project}}:Robôs",
        "grouppage-sysop": "{{ns:project}}:Administradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burocratas",
-       "grouppage-suppress": "{{ns:project}}:Supervisores",
+       "grouppage-suppress": "{{ns:project}}:Suprimir",
        "right-read": "Ler páginas",
        "right-edit": "Editar páginas",
        "right-createpage": "Criar páginas (que não sejam páginas de discussão)",
        "uploaddisabledtext": "O carregamento de ficheiros está desativado.",
        "php-uploaddisabledtext": "O carregamento de ficheiros está desativado no PHP.\nVerifique a configuração file_uploads, por favor.",
        "uploadscripted": "Este ficheiro contém HTML ou código que pode ser erradamente interpretado por um navegador.",
+       "upload-scripted-pi-callback": "Não se podem carregar arquivos que contenham instruções de processamento de páginas de estilo XML",
+       "uploaded-script-svg": "Encontrou um elemento scriptable no ficheiro \"$1\" SVG carregado.",
+       "uploaded-hostile-svg": "Encontrou-se um código CSS não seguro no elemento de estilo do arquivo SVG carregado.",
+       "uploaded-event-handler-on-svg": "Não está permitido configurar atributos controladores de eventos <code>$1=\"$2\"</code> nos arquivos SVG.",
+       "uploaded-href-attribute-svg": "Não se permite que os arquivos SVG contenham os atributos de <code>&lt;$1 $2=\"$3\"&gt;</code> apontando a recursos não locais (p.ex. http://, javascript:,etc)",
        "uploadscriptednamespace": "Este ficheiro SVG contém um domínio que não é permitido \"$1\".",
        "uploadinvalidxml": "Erro detectado na análise do XML do ficheiro carregado.",
        "uploadvirus": "O ficheiro contém um vírus! \nDetalhes: $1",
        "upload-http-error": "Ocorreu um erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "Não é possível realizar carregamentos remotos neste domínio.",
        "upload-dialog-title": "Carregar ficheiro",
-       "upload-dialog-error": "Ocorreu um erro",
-       "upload-dialog-warning": "Ocorreu um aviso",
        "upload-dialog-button-cancel": "Cancelar",
        "upload-dialog-button-done": "Feito",
        "upload-dialog-button-save": "Gravar",
        "upload-dialog-button-upload": "Carregar",
-       "upload-dialog-label-select-file": "Selecionar ficheiro",
-       "upload-dialog-label-infoform-title": "Detalhes",
-       "upload-dialog-label-infoform-name": "Nome",
-       "upload-dialog-label-infoform-description": "Descrição",
-       "upload-dialog-label-usage-title": "Uso",
-       "upload-dialog-label-usage-filename": "Nome do ficheiro",
+       "upload-process-error": "Ocorreu um erro",
+       "upload-process-warning": "Ocorreu um aviso",
+       "upload-form-label-select-file": "Selecionar ficheiro",
+       "upload-form-label-infoform-title": "Detalhes",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrição",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nome do ficheiro",
+       "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 ficheiro \"$1\".",
        "backend-fail-backup": "Não foi possível fazer cópia de segurança do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro $1 não existe.",
        "filerevert-legend": "Reverter ficheiro",
        "filerevert-intro": "Está prestes a reverter o ficheiro '''[[Media:$1|$1]]''' para a [$4 versão de $2 às $3].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Revertido para a versão de $1 - $2",
+       "filerevert-defaultcomment": "Revertido para a versão de $2, $1 ($3)",
        "filerevert-submit": "Reverter",
        "filerevert-success": "'''[[Media:$1|$1]]''' foi revertida para a [$4 versão das $3 de $2].",
        "filerevert-badversion": "Não há uma versão local anterior deste ficheiro no período de tempo especificado.",
        "emailccsubject": "Cópia da sua mensagem para $1: $2",
        "emailsent": "Mensagem enviada",
        "emailsenttext": "A sua mensagem foi enviada.",
-       "emailuserfooter": "Esta mensagem foi enviada por $1 para $2 através da opção \"{{int:emailuser}}\" em {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi {{GENDER:$1|enviada}} por $1 para {{GENDER:$2|$2}} através da opção \"{{int:emailuser}}\" em {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Editor de mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "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 \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "o conteúdo antes de esvaziar era: \"$1\"",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "protect-othertime": "Outra duração:",
        "protect-othertime-op": "outra duração",
        "protect-existing-expiry": "A proteção atual expirará às $3 de $2",
-       "protect-existing-expiry-infinity": "Existente tempo de expiração: infinito",
+       "protect-existing-expiry-infinity": "Tempo de expiração existente: infinito",
        "protect-otherreason": "Outro motivo/motivo adicional:",
        "protect-otherreason-op": "Outro motivo",
        "protect-dropdown": "*Motivos comuns para proteção\n** Vandalismo excessivo\n** ''Spam'' excessivo\n** Guerra de edições improdutiva\n** Página muito visitada",
        "blockip-legend": "Bloquear utilizador",
        "blockiptext": "Utilize o formulário abaixo para bloquear o acesso de escrita a um endereço IP específico ou a um nome de utilizador.\nIsto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Indique a seguir um motivo de bloqueio específico (por exemplo, indicando as páginas que foram alvo de vandalismo).",
        "ipaddressorusername": "Endereço de IP ou utilizador(a):",
-       "ipbexpiry": "Validade:",
+       "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sítios externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
        "ipb-hardblock": "Impedir que utilizadores autenticados editem a partir deste endereço IP",
        "blocklist-rangeblocks": "Ocultar bloqueios de faixas",
        "blocklist-timestamp": "Data e hora",
        "blocklist-target": "Destinatário",
-       "blocklist-expiry": "Duração",
+       "blocklist-expiry": "Expira",
        "blocklist-by": "Administrador que realizou o bloqueio",
        "blocklist-params": "Parâmetros do bloqueio",
        "blocklist-reason": "Motivo",
        "block-log-flags-angry-autoblock": "ativado o bloqueio automático melhorado",
        "block-log-flags-hiddenname": "nome de utilizador oculto",
        "range_block_disabled": "A funcionalidade de administrador para o bloqueio de gamas de IP está desativada.",
-       "ipb_expiry_invalid": "Tempo de validade inválido.",
+       "ipb_expiry_invalid": "Tempo de expiração inválido.",
        "ipb_expiry_temp": "Bloqueios com nome de utilizador oculto devem ser permanentes.",
        "ipb_hide_invalid": "Não foi possível suprimir esta conta; ela possui mais de {{PLURAL:$1|uma edição|$1 edições}}.",
        "ipb_already_blocked": "\"$1\" já se encontra bloqueado",
        "move-page-legend": "Mover página",
        "movepagetext": "Usando o formulário abaixo pode mover esta página e todo o seu histórico de edições para uma página nova com outro nome.\nA página original será transformada num redirecionamento para a página nova.\nPode corrigir de forma automática os redirecionamentos existentes que apontam para a página original.\nCaso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade verificar que as ligações continuam a apontar para onde é suposto que apontem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redirecionamento sem qualquer histórico de edições.\nIsto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.\n\n'''CUIDADO!'''\nNuma página popular esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
        "movepagetext-noredirectfixer": "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.\nA página antiga é transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade certificar-se de que as ligações continuam a apontar para onde é suposto.\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 já existente esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto também significa que, se se tiver enganado, pode 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": "Se existir uma página de discussão associada, ela será automaticamente movida, '''a não ser que:'''\n*já exista uma página de discussão com o novo título que não esteja vazia, ou\n*desmarque a correspondente caixa de seleção abaixo.\n\nNestes casos, terá de mover a página de discussão manualmente, ou fundi-la com a existente, se assim desejar.",
-       "movearticle": "Mover página",
+       "movepagetalktext": "Se assinalar esta opção, e existir uma página de discussão associada, ela será automaticamente movida, a não ser que já exista uma página de discussão com o novo título que não esteja vazia.\n\nNeste caso, terá de mover a página de discussão manualmente, ou fundi-la com a existente, se assim desejar.",
        "moveuserpage-warning": "'''Aviso:''' Está prestes a mover uma página de utilizador. Note que a página será apenas movida, ''sem'' alterar o nome do utilizador.",
        "movecategorypage-warning": "<strong>Aviso:</strong> Está prestes a mover uma categoria. Por favor, note que apenas moverá a página da categoria e quaisquer páginas que estejam listadas <em>não</em> serão recategorizadas na nova.",
        "movenologintext": "Precisa de ser um utilizador registado e [[Special:UserLogin|ter sessão iniciada]] para poder mover uma página.",
        "cant-move-to-user-page": "Não tem permissão para mover uma página para uma página de utilizador (pode movê-la para uma subpágina de utilizador).",
        "cant-move-category-page": "Não possui permissão para mover categorias.",
        "cant-move-to-category-page": "Não possui permissão para mover uma página para uma categoria.",
-       "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",
        "confirmemail_sent": "Correio de confirmação enviado.",
        "confirmemail_oncreate": "Foi enviado um código de confirmação para o seu endereço de correio eletrónico.\nEste código não é necessário para se autenticar no sistema, mas será necessário para ativar qualquer funcionalidade baseada no uso de correio na wiki.",
        "confirmemail_sendfailed": "A {{SITENAME}} não conseguiu enviar a mensagem de confirmação.\nVerifique se o seu endereço de correio eletrónico tem caracteres inválidos.\n\nO sistema de correio devolveu o erro: $1",
-       "confirmemail_invalid": "Código de confirmação inválido. O código pode ter expirado.",
+       "confirmemail_invalid": "Código de confirmação inválido. O código pode ter expirado.",
        "confirmemail_needlogin": "Precisa de $1 para confirmar o seu endereço de correio eletrónico.",
        "confirmemail_success": "O seu endereço de correio eletrónico foi confirmado.\nPode agora [[Special:UserLogin|autenticar-se]] e desfrutar da wiki.",
        "confirmemail_loggedin": "O seu endereço de correio eletrónico foi confirmado.",
        "logentry-newusers-byemail": "A conta de utilizador $3 foi criada por $1 e a palavra-passe foi enviada por correio eletrónico",
        "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-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]",
        "logentry-rights-rights": "$1 modificou os privilégios do utilizador $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5",
        "api-error-badaccess-groups": "Não tem permissão para enviar ficheiros para esta wiki.",
        "api-error-badtoken": "Erro interno: Chave incorrecta.",
        "api-error-copyuploaddisabled": "O carregamento de ficheiros por URL não foi possibilitado neste servidor.",
-       "api-error-duplicate": "Já {{PLURAL:$1|existe [$2 outro ficheiro]|existem [$2 outros ficheiros]}} na wiki com o mesmo conteúdo.",
-       "api-error-duplicate-archive": "Já {{PLURAL:$1|existia no site [$2 outro ficheiro]|existiam no site [$2 alguns outros ficheiros]}} com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Ficheiro duplicado que já foi eliminado|Ficheiros duplicados que já foram eliminados}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ficheiro duplicado|Ficheiros duplicados}}",
+       "api-error-duplicate": "Já {{PLURAL:$1|existia outro ficheiro|existiam outros ficheiro}} na wiki com o mesmo conteúdo.",
+       "api-error-duplicate-archive": "Já {{PLURAL:$1|estava outro ficheiro|estavam outros ficheiros}} no  site com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.",
        "api-error-empty-file": "O ficheiro que enviou está vazio.",
        "api-error-emptypage": "Não é permitido criar páginas novas vazias.",
        "api-error-fetchfileerror": "Erro interno: Ocorreu um problema indeterminado ao aceder ao ficheiro.",
        "api-error-stashfailed": "Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.",
        "api-error-publishfailed": "Erro interno: Servidor não conseguiu publicar ficheiro temporário.",
        "api-error-stasherror": "Ocorreu um erro no carregamento do ficheiro escondido.",
-       "api-error-stashedfilenotfound": "O escondido ficheiro não foi encontrado ao tentar carregar a pasta do stash.",
+       "api-error-stashedfilenotfound": "O ficheiro do stash não foi encontrado ao tentar carregá-lo.",
        "api-error-stashpathinvalid": "O caminho no qual o ficheiro escondido deveria ter sido encontrado era inválido.",
        "api-error-stashfilestorage": "Ocorreu um erro no carregamento do ficheiro escondido.",
        "api-error-stashzerolength": "O servidor não pôde esconder o ficheiro, porque ele tinha de comprimento zero.",
        "expand_templates_generate_xml": "Mostrar a árvore de análise sintáctica do XML",
        "expand_templates_generate_rawhtml": "Mostrar o HTML puro",
        "expand_templates_preview": "Antevisão do resultado",
-       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong> Se não resultar, experimente [[Special:UserLogout|sair]] e iniciar sessão de novo.",
+       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques por JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong> Se ainda não funcionar, experimente [[Special:UserLogout|sair]] e iniciar sessão de novo.",
        "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de não ter sessão iniciada, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor [[Especial:UserLogin|inicie sessão]] e tente novamente.</strong>",
        "pagelanguage": "Seletor de idioma da página",
        "pagelang-name": "Página",
index 39ba6db..3893577 100644 (file)
        "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}}",
-       "changeemail": "Title of [[Special:ChangeEmail|special page]].",
+       "changeemail": "Title of [[Special:ChangeEmail|special page]]. This page also allows removing the user's email address.",
        "changeemail-summary": "{{ignored}}",
        "changeemail-text": "Text of [[Special:ChangeEmail]].",
        "changeemail-no-info": "Error message for [[Special:ChangeEmail]].\n\nParameters:\n* $1 (unused) - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
        "changeemail-oldemail": "Label for e-mail address field in [[Special:ChangeEmail]].",
-       "changeemail-newemail": "Label for e-mail address field in [[Special:ChangeEmail]].",
+       "changeemail-newemail": "Label for e-mail address field in [[Special:ChangeEmail]]. See also {{msg-mw|changeemail-newemail-help}}",
+       "changeemail-newemail-help": "Help message shown next to the new email address field. See also {{msg-mw|changeemail-newemail}}",
        "changeemail-none": "Probably appears in 'Current E-mail address' field when no address held, in [[Special:ChangeEmail]].\n\n{{Identical|None}}",
        "changeemail-password": "Label for password field in [[Special:ChangeEmail]].",
        "changeemail-submit": "Submit button on [[Special:ChangeEmail]]",
        "rev-suppressed-unhide-diff": "Parameters:\n* $1 - a HTML link to the diff\n{{Related|Rev-deleted-diff}}",
        "rev-deleted-diff-view": "{{Related|Rev-deleted-diff}}",
        "rev-suppressed-diff-view": "{{Related|Rev-deleted-diff}}",
-       "rev-delundel": "Link in page history for oversight (see also {{msg-mw|rev-showdeleted}})",
-       "rev-showdeleted": "Link in page history for oversight (see also {{msg-mw|rev-delundel}})\n{{Identical|Show}}",
+       "rev-delundel": "Link in page history for revdel (see also {{msg-mw|rev-showdeleted}})",
+       "rev-showdeleted": "Link in page history for revdel (see also {{msg-mw|rev-delundel}})\n{{Identical|Show}}",
        "revisiondelete": "{{RevisionDelete}}\n\n{{doc-special|RevisionDelete|unlisted=1}}",
        "revdelete-nooldid-title": "{{RevisionDelete}}",
        "revdelete-nooldid-text": "{{RevisionDelete}}",
        "revdelete-confirm": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.\n\nRefers to {{msg-mw|Policy-url}}.\n\nSee also:\n* {{msg-mw|Revdelete-suppress}}\n* {{msg-mw|Revdelete-suppress-text}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]",
        "revdelete-suppress-text": "Used as usage text in [[Special:RevisionDelete]].\n\nSee also:\n* {{msg-mw|Revdelete-suppress}}\n* {{msg-mw|Revdelete-confirm}}",
        "revdelete-legend": "{{RevisionDelete}}\nUsed as legend for the form.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n\nSee also:\n* {{msg-mw|Revdelete-log|label for dropdown}}\n* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}\n* {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}\n* {{msg-mw|Revdelete-otherreason|label for input box}}\n* {{msg-mw|Revdelete-submit|submit button}}",
-       "revdelete-hide-text": "Option for oversight. This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-image": "Option for <del>oversight</del> [[:mw:RevisionDelete|RevisionDelete]] feature.\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-name": "Option for oversight.\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-comment": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}\n{{Identical|Edit summary}}",
-       "revdelete-hide-user": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-restricted": "Option for oversight.\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-text": "Option for revdel. This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-image": "Option for revdel.\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-name": "Option for revdel.\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-comment": "Option for revdel. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}\n{{Identical|Edit summary}}",
+       "revdelete-hide-user": "Option for revdel. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-restricted": "Option for suppression.\n{{Related|Revdelete-hide}}",
        "revdelete-radio-same": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature. The message is a caption for a column of radioboxes inside a box with {{msg-mw|Revdelete-legend}} as a title.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\nThere are three radio buttons in each row, and the captions above each column read:\n* {{msg-mw|Revdelete-radio-same}}\n* {{msg-mw|Revdelete-radio-set}}\n* {{msg-mw|Revdelete-radio-unset}}",
        "revdelete-radio-set": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature. The message is a caption for a column of radioboxes inside a box with {{msg-mw|Revdelete-legend}} as a title.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\nThere are three radio buttons in each row, and the captions above each column read:\n* {{msg-mw|Revdelete-radio-same}}\n* {{msg-mw|Revdelete-radio-set}}\n* {{msg-mw|Revdelete-radio-unset}}\n{{Identical|Hidden}}",
        "revdelete-radio-unset": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature. The message is a caption for a column of radioboxes inside a box with {{msg-mw|Revdelete-legend}} as a title.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\nThere are three radio buttons in each row, and the captions above each column read:\n* {{msg-mw|Revdelete-radio-same}}\n* {{msg-mw|Revdelete-radio-set}}\n* {{msg-mw|Revdelete-radio-unset}}\n{{Identical|Visible}}",
-       "revdelete-suppress": "Option for oversight; used in [[Special:RevisionDelete]].\n\nSee also:\n* {{msg-mw|Revdelete-suppress-text}}\n* {{msg-mw|Revdelete-confirm}}",
+       "revdelete-suppress": "Option for suppression; used in [[Special:RevisionDelete]].\n\nSee also:\n* {{msg-mw|Revdelete-suppress-text}}\n* {{msg-mw|Revdelete-confirm}}",
        "revdelete-unsuppress": "{{RevisionDelete}}",
-       "revdelete-log": "{{Identical|Reason}}\n{{RevisionDelete}}\nUsed as log comment text for oversight.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n\nSee also:\n* {{msg-mw|Revdelete-legend|legend for the form}}\n* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}\n* {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}\n* {{msg-mw|Revdelete-otherreason|label for input box}}\n* {{msg-mw|Revdelete-submit|submit button}}",
+       "revdelete-log": "{{Identical|Reason}}\n{{RevisionDelete}}\nUsed as log comment text for revdel.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n\nSee also:\n* {{msg-mw|Revdelete-legend|legend for the form}}\n* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}\n* {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}\n* {{msg-mw|Revdelete-otherreason|label for input box}}\n* {{msg-mw|Revdelete-submit|submit button}}",
        "revdelete-submit": "{{RevisionDelete}}\nThis is the submit button on [[Special:RevisionDelete]]. Parameters:\n* $1 - number of revisions\nSee also:\n* {{msg-mw|Revdelete-legend|legend for the form}}\n* {{msg-mw|Revdelete-log|label for dropdown}}\n* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}\n* {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}\n* {{msg-mw|Revdelete-otherreason|label for input box}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]",
        "revdelete-success": "{{RevisionDelete}}\n\nPossible alternative text - 'Restrictions on the revision visibility were successfully changed.'",
        "revdelete-failure": "{{RevisionDelete}}\nPossible alternative text - \"Restrictions on the revision visibility could not be changed\"\n\nParameters:\n* $1 - ...",
        "mergehistory-go": "Used as the label for Submit button in the Merge form, in [[Special:MergeHistory]].\n\nSee also:\n* {{msg-mw|mergehistory-header}}\n* {{msg-mw|mergehistory-box}}\n* {{msg-mw|mergehistory-from}}\n* {{msg-mw|mergehistory-into}}",
        "mergehistory-submit": "Used as label for Submit button in [[Special:MergeHistory]].",
        "mergehistory-empty": "Used in [[Special:MergeHistory]].",
-       "mergehistory-success": "Used in [[Special:MergeHistory]].\n* $1 - target page title\n* $2 - destination page title\n* $3 - number of revisions which succeeded to merge",
+       "mergehistory-done": "Success message shown on [[Special:MergeHistory]].\n* $1 - link to target page\n* $2 - destination page title\n* $3 - number of revisions which succeeded to merge",
        "mergehistory-fail": "Used as error message in [[Special:MergeHistory]].",
        "mergehistory-fail-toobig": "Used as error message in [[Special:MergeHistory]].\n* $1 - maximum allowed number of revisions that can be moved",
        "mergehistory-no-source": "Used as error message in [[Special:MergeHistory]].\n* $1 - source page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "prefs-watchlist-token": "Used in [[Special:Preferences]], tab Watchlist.",
        "prefs-misc": "Tab used on the [[Special:Preferences|user preferences]] special page.",
        "prefs-resetpass": "Button on user data tab in user preferences. When you click the button you go to the special page [[Special:ResetPass]].\n\n{{Identical|Change password}}",
-       "prefs-changeemail": "Link on [[Special:Preferences]] to [[Special:ChangeEmail]].\n\nSee also:\n* {{msg-mw|prefs-help-email-required|help}}\n* {{msg-mw|prefs-help-email|help}}\n* {{msg-mw|prefs-help-email-others|help}}\n* {{msg-mw|prefs-setemail|link title}}",
+       "prefs-changeemail": "Link on [[Special:Preferences]] to [[Special:ChangeEmail]]. [[Special:ChangeEmail]] also allows removing email address. \n\nSee also:\n* {{msg-mw|prefs-help-email-required|help}}\n* {{msg-mw|prefs-help-email|help}}\n* {{msg-mw|prefs-help-email-others|help}}\n* {{msg-mw|prefs-setemail|link title}}",
        "prefs-setemail": "Used as link title in [[Special:Preferences]], if the user has not set E-mail address yet.\n\nSee also:\n* {{msg-mw|prefs-help-email-required|help}}\n* {{msg-mw|prefs-help-email|help}}\n* {{msg-mw|prefs-help-email-others|help}}\n* {{msg-mw|prefs-changeemail|link title}}",
        "prefs-email": "Used as section name in [[Special:Preferences]].",
        "prefs-rendering": "Title of tab in [[Special:Preferences]].\n{{Identical|Appearance}}",
        "group-bot": "{{doc-group|bot}}\n{{Identical|Bot}}",
        "group-sysop": "{{doc-group|sysop}}\n{{Identical|Administrator}}",
        "group-bureaucrat": "{{doc-group|bureaucrat}}",
-       "group-suppress": "{{doc-group|suppress}}\nThis is an optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
+       "group-suppress": "{{doc-group|suppress}}\nThis is an optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Suppress}}",
        "group-all": "The name of the user group that contains all users, including anonymous users\n\n{{Identical|All}}",
        "group-user-member": "{{doc-group|user|member}}\n{{Identical|User}}",
        "group-autoconfirmed-member": "{{doc-group|autoconfirmed|member}}",
        "group-bot-member": "{{doc-group|bot|member}}",
        "group-sysop-member": "{{doc-group|sysop|member}}\n{{Identical|Administrator}}",
        "group-bureaucrat-member": "{{doc-group|bureaucrat|member}}",
-       "group-suppress-member": "{{doc-group|suppress|member}}\nThis is a member of the optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
+       "group-suppress-member": "{{doc-group|suppress|member}}\nThis is a member of the optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Suppress}}",
        "grouppage-user": "{{doc-group|user|page}}\n{{Identical|User}}",
        "grouppage-autoconfirmed": "{{doc-group|autoconfirmed|page}}",
        "grouppage-bot": "{{doc-group|bot|page}}\n{{Identical|Bot}}",
        "grouppage-sysop": "{{doc-group|sysop|page}}",
        "grouppage-bureaucrat": "{{doc-group|bureaucrat|page}}",
-       "grouppage-suppress": "{{doc-group|suppress|page}}\n{{Identical|Oversight}}",
+       "grouppage-suppress": "{{doc-group|suppress|page}}\n{{Identical|Suppress}}",
        "right-read": "{{doc-right|read}}\nBasic right to read any page.",
        "right-edit": "{{doc-right|edit}}\nBasic right to edit pages that are not protected.\n{{Identical|Edit page}}",
        "right-createpage": "{{doc-right|createpage}}\nBasic right to create pages. The right to edit discussion/talk pages is {{msg-mw|right-createtalk}}.",
        "recentchangeslinked-summary": "Summary of [[Special:RecentChangesLinked]].",
        "recentchangeslinked-page": "{{Identical|Page name}}",
        "recentchangeslinked-to": "Checkbox in [[Special:RecentChangesLinked]].",
+       "recentchanges-page-added-to-category": "Comment message for pages added to a category\n\nParameters:\n* $1 - name of the page being added",
+       "recentchanges-page-added-to-category-bundled": "Comment message for template embedded by other pages added to a category\n\nParameters:\n* $1 - name of the page being added\n* $2 - number of additional pages being affected",
+       "recentchanges-page-removed-from-category": "Comment message for pages removed from a category\n\nParameters:\n* $1 - name of the page being removed",
+       "recentchanges-page-removed-from-category-bundled": "Comment message for templates embeddedby other pages removed from a category\n\nParameters:\n* $1 - name of the page being added\n* $2 - number of additional pages being affected",
+       "autochange-username": "Used as bot / unknown username.",
        "upload": "Display name for link to [[Special:Upload]] for uploading files to the wiki.\n\nSee also:\n* {{msg-mw|Upload}}\n* {{msg-mw|Accesskey-t-upload}}\n* {{msg-mw|Tooltip-t-upload}}\n{{Identical|Upload file}}",
        "uploadbtn": "Button name in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|Uploadbtn}}\n* {{msg-mw|Accesskey-upload}}\n* {{msg-mw|Tooltip-upload}}\n{{Identical|Upload file}}",
        "reuploaddesc": "Used as button text in the Upload form on [[Special:Upload]].\n\nSee also:\n* {{msg-mw|upload-tryagain|Submit button text}}\n* {{msg-mw|ignorewarning|button text}}",
        "upload-options": "Caption above a section of the [[Special:Upload]] page",
        "watchthisupload": "In [[Special:Upload]]",
        "filewasdeleted": "This warning is shown when trying to upload a file that does not exist, but has previously been deleted.\n\nParameters:\n* $1 - a link to the deletion log, with the text from {{msg-mw|deletionlog}}",
+       "filename-thumb-name": "Appears when thumbnail title is similar to \"22px-Example.jpg\" - the prefix is what MW adds when downloading pictures as thumbnails.",
        "filename-bad-prefix": "Used as warning in [[Special:Upload]]. Parameters:\n* $1 - prefix\nSee also:\n* {{msg-mw|fileexists}}\n* {{msg-mw|filepageexists}}\n* {{msg-mw|fileexists-extension}}\n* {{msg-mw|fileexists-thumbnail-yes}}\n* {{msg-mw|file-thumbnail-no}}\n* {{msg-mw|filewasdeleted}}",
        "filename-prefix-blacklist": "{{optional}}\nDo not translate the file name prefixes before the hash mark (#). Leave all the wiki markup, including the spaces, as is. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.",
        "upload-success-subj": "Used as message subject which is posted on the user talk page.\n\nSee also:\n* {{msg-mw|upload-success-subj|subject}}\n* {{msg-mw|upload-success-msg|message}}\n* {{msg-mw|upload-failure-subj|subject}}\n* {{msg-mw|upload-failure-msg|message}}",
        "upload-http-error": "Parameters:\n* $1 - error message",
        "upload-copy-upload-invalid-domain": "Error message shown if a user is trying to upload (i.e. copy) a file from a website that is not in $wgCopyUploadsDomains (if set).\n\nSee also:\n* {{msg-mw|http-invalid-url}}\n* {{msg-mw|tmp-create-error}}\n* {{msg-mw|tmp-write-error}}",
        "upload-dialog-title": "Title of the upload dialog box\n{{Identical|Upload file}}",
-       "upload-dialog-error": "Error message from upload",
-       "upload-dialog-warning": "Warning message from upload",
        "upload-dialog-button-cancel": "Button to cancel the dialog\n{{Identical|Cancel}}",
        "upload-dialog-button-done": "Button to close the dialog once upload is complete\n{{Identical|Done}}",
        "upload-dialog-button-save": "Button to save the file\n{{Identical|Save}}",
        "upload-dialog-button-upload": "Button to initiate upload\n{{Identical|Upload}}",
-       "upload-dialog-label-select-file": "Label for the select file widget\n{{Identical|Select file}}",
-       "upload-dialog-label-infoform-title": "Title for the information form\n{{Identical|Detail}}",
-       "upload-dialog-label-infoform-name": "Label for the file name input\n{{Identical|Name}}",
-       "upload-dialog-label-infoform-description": "Label for the file description input\n{{Identical|Description}}",
-       "upload-dialog-label-usage-title": "Title for the insert form showing how to use the uploaded item.\n{{Identical|Usage}}",
-       "upload-dialog-label-usage-filename": "Label for the file name input\n{{Identical|Filename}}",
+       "upload-process-error": "Error message from upload",
+       "upload-process-warning": "Warning message from upload",
+       "upload-form-label-select-file": "Label for the select file widget\n{{Identical|Select file}}",
+       "upload-form-label-infoform-title": "Title for the information form\n{{Identical|Detail}}",
+       "upload-form-label-infoform-name": "Label for the file name input\n{{Identical|Name}}",
+       "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-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-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. $1 is the name of the local wiki.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Legal message to show when the work is made by the uploader.",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Message to show when the work isn't owned by the uploader.",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Message suggesting the user might want to upload a file locally instead of to Wikimedia Commons. $1 is the name of the local wiki.",
        "backend-fail-stream": "Parameters:\n* $1 - a filename",
        "backend-fail-backup": "Parameters:\n* $1 - a filename",
        "backend-fail-notexists": "Parameters:\n* $1 - a filename",
        "filerevert-legend": "{{Identical|Revert}}",
        "filerevert-intro": "Message displayed when you try to revert a version of a file.\n* $1 is the name of the media\n* $2 is a date\n* $3 is a time\n* $4 is a URL and must follow square bracket: [$4\n{{Identical|Revert}}",
        "filerevert-comment": "{{Identical|Reason}}",
-       "filerevert-defaultcomment": "Parameters:\n* $1 - a date\n* $2 - a time\n{{Identical|Revert}}",
+       "filerevert-defaultcomment": "Parameters:\n* $1 - a date\n* $2 - a time\n* $3 - a timezone\n{{Identical|Revert}}",
        "filerevert-submit": "{{Identical|Revert}}",
        "filerevert-success": "Message displayed when you succeed in reverting a version of a file.\n* $1 is the name of the media\n* $2 is a date\n* $3 is a time\n* $4 is an URL and must follow square bracket: [$4\n{{Identical|Revert}}",
        "filerevert-badversion": "Used as error message.",
        "nopagetext": "Used as text on special pages like [[Special:MovePage]] (when the oldtitle does not exist) or [[Special:PermaLink]].\n\nThe title is {{msg-mw|nopagetitle}}.\n\nSee also:\n* {{msg-mw|Nopagetitle|title}}\n* {{msg-mw|Nopagetext|text}}",
        "pager-newer-n": "This is part of the navigation message on the top and bottom of Special pages which are lists of things in date order, e.g. the User's contributions page. It is passed as the second argument of {{msg-mw|Viewprevnext}}. $1 is the number of items shown per page.\n{{Identical|Newer}}",
        "pager-older-n": "This is part of the navigation message on the top and bottom of Special pages which are lists of things in date order, e.g. the User's contributions page. It is passed as the first argument of {{msg-mw|Viewprevnext}}. $1 is the number of items shown per page.",
-       "suppress": "{{Identical|Oversight}}",
+       "suppress": "{{Identical|Suppress}}",
        "querypage-disabled": "On special pages that use expensive database queries but are not cacheable, this message is displayed when 'miser mode' is on (i.e. no expensive queries allowed).",
        "apihelp": "{{doc-special|ApiHelp}}",
        "apihelp-summary": "{{doc-specialpagesummary|ApiHelp}}",
        "deletepage": "Used as Submit button text.\n{{Identical|Delete page}}",
        "confirm": "Submit button text for protection confirmation\n\n{{Identical|Confirm}}",
        "excontent": "Automated deletion reason when deleting a page for admins. Parameters:\n* $1 - content before deletion",
-       "excontentauthor": "Automated deletion reason when deleting a page for admins providing that the page has one author only.\n\nParameters:\n* $1 - content before deletion\n* $2 - username",
+       "excontentauthor": "Automated deletion reason when deleting a page for admins providing that the page has one author only.\n\nParameters:\n* $1 - content before deletion\n* $2 - username\n\nThe label of the link to the talk page should be consistent with {{msg-mw|Talkpagelinktext}}.",
        "exbeforeblank": "Automated deletion reason when deleting a page for admins providing that the page was blanked before deletion.\n\nParameters:\n* $1 - content before blanking",
        "delete-confirm": "Used as page title. Parameters:\n* $1 - the page title\n{{Identical|Delete}}",
        "delete-legend": "{{Identical|Delete}}",
        "logentry-contentmodel-change-revert": "Prefilled edit summary when reverting a content model change. {{identical|revertmove}}",
        "protectlogpage": "{{doc-logpage}}\n\nTitle of [[Special:Log/protect]].",
        "protectlogtext": "Text in [[Special:Log/protect]].",
-       "protectedarticle": "Text describing an action on [[Special:Log]]. $1 is a page title.",
-       "modifiedarticleprotection": "Text describing an action on [[Special:Log]]. $1 is a page title.",
-       "unprotectedarticle": "Used as action in the log. Parameters:\n* $1 - target page title",
+       "protectedarticle": "This is a ''logentry'' message only used on IRC.\nText describing an action. $1 is a page title.",
+       "modifiedarticleprotection": "This is a ''logentry'' message only used on IRC.\nText describing an action. $1 is a page title.",
+       "unprotectedarticle": "This is a ''logentry'' message only used on IRC.\nUsed as action. Parameters:\n* $1 - target page title",
        "movedarticleprotection": "This is a ''logentry'' message only used on IRC. It appears in the log if a protected page is renamed.\n\nExample:\n<code>00:51, 16 September 2010 Siebrand +(Talk • contribs • block) moved protection settings from \"User:Siebrand/prot-move\" to \"User:Siebrand/prot-moved\" ‎ (User:Siebrand/prot-move moved to User:Siebrand/prot-moved: prot_move test.)</code>\n\nParameters:\n* $1 - target page title\n* $2 - source page title",
        "protect-title": "Title for the protection form. $1 is the title of the page to be (un)protected.",
        "protect-title-notallowed": "Same as {{msg-mw|Protect-title}}, but when the user does not have the right to change protection levels.\n\nParameters:\n* $1 - page title",
        "protect-fallback": "This message is used as an option in the protection form on wikis were extra protection levels have been configured.\n\nParameters:\n* $1 - undefined protection level (not localized). Defined protection levels are: \"sysop\" and \"autoconfirmed\"\n\nSee also:\n* {{msg-mw|Protect-level-sysop}}\n* {{msg-mw|Protect-level-autoconfirmed}}",
        "protect-level-autoconfirmed": "Used as protect level.\n\nSee example: {{canonicalurl:Main_Page|action=info}}",
        "protect-level-sysop": "Used as protect level.\n\nSee example: {{canonicalurl:Main_Page|action=info}}",
-       "protect-summary-desc": "{{Optional}}\nUsed in edit summary for description of a protecting restriction.\n* $1 is action, taken from restriction-*\n* $2 is restriction, taken from protect-level-*\n* $3 is {{msg-mw|protect-expiring}} or {{msg-mw|protect-expiry-indefinite}}",
+       "protect-summary-desc": "{{Optional}}\nUsed in edit summary for description of a protecting restriction.\n* $1 is action, taken from restriction-*\n* $2 is restriction, taken from protect-level-*\n* $3 is {{msg-mw|protect-expiring}}, {{msg-mw|protect-expiring-local}} or {{msg-mw|protect-expiry-indefinite}}",
        "protect-summary-cascade": "Used in edit summary when cascade protecting a page. Appears in protection log. See [[Special:Log]] and [[m:Special:Log]].\n\nAlso used in [[Special:ProtectedPages]] when a page is cascade protected. See example: [[m:Special:ProtectedPages]].<br />\nSee also:\n*{{msg-mw|Restriction-level-sysop}}\n*{{msg-mw|Restriction-level-autoconfirmed}}",
-       "protect-expiring": "Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.\n* $1 - a date and time\n* $2 - a date (optional)\n* $3 - a time (optional)\nIf the expiry is indefinite, {{msg-mw|protect-expiry-indefinite}} is used.\n{{Identical|Expires $1 (UTC)}}",
-       "protect-expiring-local": "Parameter:\n* $1 - a timestamp like \"22:51, 23 July 2011 (UTC)\" depending on the wiki content language.\n{{Identical|Expire}}",
+       "protect-expiring": "Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.\n* $1 - a date and time\n* $2 - a date (optional)\n* $3 - a time (optional)\nIf the expiry is indefinite, {{msg-mw|protect-expiry-indefinite}} is used.\n{{Identical|Expires $1 (UTC)}}\n\n\nSimilar to {{msg-mw|protect-expiring-local}}",
+       "protect-expiring-local": "Parameter:\n* $1 - a timestamp like \"22:51, 23 July 2011 (UTC)\" depending on the wiki content language.\n* $2 - a date (optional)\n* $3 - a time (optional)\n{{Identical|Expire}}\n\nSimilar to {{msg-mw|protect-expiring}}",
        "protect-expiry-indefinite": "Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.\n\nIf the expiry is definite, {{msg-mw|protect-expiring}} is used.\n{{Identical|Indefinite}}",
        "protect-cascade": "See [[meta:Protect]] for more information.",
        "protect-cantedit": "Used as error message when changing the protection levels of the page.",
        "lockedbyandtime": "Used as part of the message when a database is locked through [[Special:LockDB]]. Parameters:\n* $1 is the user that locked the database.\n* $2 is the date on which the lock was made\n* $3 is the time at which the lock was made",
        "move-page": "Used as page title of [[Special:MovePage]] to move pages.\n\nSee example: [[Special:MovePage/Portal:En]].\n\nParameters:\n* $1 - the name of the page to be moved (without link)\n{{Identical|Move}}",
        "movepage-summary": "{{doc-specialpagesummary|movepage}}",
-       "move-page-legend": "Legend of the fieldset around the input form of [[Special:MovePage/testpage]].\n\nSee also:\n* {{msg-mw|movearticle|label for old title}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
+       "move-page-legend": "Legend of the fieldset around the input form of [[Special:MovePage/testpage]].\n\nSee also:\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
        "movepagetext": "Introduction shown when moving a page ([[Special:MovePage]]).\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext-noredirectfixer}}",
        "movepagetext-noredirectfixer": "A variant of the following message ''Movepagetext'' displayed when the automatic redirect fixer is not enabled.\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext}}",
        "movepagetalktext": "Text on the special 'Move page'. This text only appears if the talk page is not empty.",
-       "movearticle": "The text before the name of the page that you are moving. Can be translated as \"Page that is going to be moved\". Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
        "moveuserpage-warning": "Used as warning in [[Special:MovePage]], when moving a user page.",
        "movecategorypage-warning": "Used as warning in [[Special:MovePage]], when moving a category page.",
        "movenologintext": "Text of message on special page 'Permissions Errors', which appears when somebody tries to move a page without being logged in.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}",
        "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "cant-move-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "cant-move-to-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
-       "newtitle": "Used in the special page \"[[Special:MovePage]]\". The text for the inputbox to give the new page title.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
-       "move-watch": "The text of the checkbox to watch the pages you are moving from and to. If checked, both the destination page and the original page will be added to the watchlist, even if you decide not to leave a redirect behind.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}",
+       "newtitle": "Used in the special page \"[[Special:MovePage]]\". The text for the inputbox to give the new page title.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "move-watch": "The text of the checkbox to watch the pages you are moving from and to. If checked, both the destination page and the original page will be added to the watchlist, even if you decide not to leave a redirect behind.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}",
        "movepagebtn": "Button label on the special 'Move page'.\n\n{{Identical|Move page}}",
        "pagemovedsub": "Message displayed as aheader of the body, after successfully moving a page from source to target name.",
        "movepage-moved": "Message displayed after successfully moving a page from source to target name.\n\nParameters:\n* $1 - the source page as a link with display name\n* $2 - the target page as a link with display name\n* $3 - (optional) the source page name without a link\n* $4 - (optional) the target page name without a link\nSee also:\n* {{msg-mw|Movepage-moved-redirect}}\n* {{msg-mw|Movepage-moved-noredirect}}",
        "movepage-moved-noredirect": "The message is shown after pagemove if checkbox \"{{int:move-leave-redirect}}\" was unselected before moving.\n\nSee also:\n* {{msg-mw|Movepage-moved}}\n* {{msg-mw|Movepage-moved-redirect}}",
        "articleexists": "Used as error message when moving a page.\n\nSee also:\n* {{msg-mw|Badarticleerror}}\n* {{msg-mw|Bad-target-model}}",
        "cantmove-titleprotected": "Used as error message when moving a page.",
-       "movetalk": "The text of the checkbox to watch the associated talk page to the page you are moving. This only appears when the talk page is not empty. Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
-       "move-subpages": "The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any subpages will be moved with the main page to a new title.\n\nParameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
-       "move-talk-subpages": "The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any talk subpages will be moved with the talk page to a new title.\n\nParameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "movetalk": "The text of the checkbox to watch the associated talk page to the page you are moving. This only appears when the talk page is not empty. Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "move-subpages": "The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any subpages will be moved with the main page to a new title.\n\nParameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "move-talk-subpages": "The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any talk subpages will be moved with the talk page to a new title.\n\nParameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
        "movepage-page-exists": "Used as error message when moving page.\n* $1 - page title",
        "movepage-page-moved": "Used as success message when moving page.\n\nCan be followed by {{msg-mw|Movepage-max-pages}}.\n\nParameters:\n* $1 - old page title (with link)\n* $2 - new page title (with link)\nSee also:\n* {{msg-mw|Movepage-page-unmoved}}",
        "movepage-page-unmoved": "Used as error message when moving page. Parameters:\n* $1 - old page title (with link)\n* $2 - new page title (with link)\nSee also:\n* {{msg-mw|Movepage-page-moved}}",
        "movesubpage": "This is a section header on [[Special:MovePage]], below is a list of subpages.\n\nParameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
        "movesubpagetext": "Used in [[Special:MovePage]]. Parameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}",
        "movenosubpage": "See also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
-       "movereason": "Used in [[Special:MovePage]]. The text for the inputbox to give a reason for the page move.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}\n{{Identical|Reason}}",
+       "movereason": "Used in [[Special:MovePage]]. The text for the inputbox to give a reason for the page move.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}\n{{Identical|Reason}}",
        "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}}",
        "nonfile-cannot-move-to-file": "Used as error message.\n\nSee also:\n* {{msg-mw|Imagenocrossnamespace}}\n* {{msg-mw|Nonfile-cannot-move-to-file}}",
        "imagetypemismatch": "Used as error message.\n\nSee also:\n* {{msg-mw|imageinvalidfilename}}\n* {{msg-mw|imagenocrossnamespace}}",
        "imageinvalidfilename": "Used as error message.\n\nSee also:\n* {{msg-mw|imagetypemismatch}}\n* {{msg-mw|imagenocrossnamespace}}",
-       "fix-double-redirects": "This is a checkbox in [[Special:MovePage]] which allows to move all redirects from the old title to the new title. Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
-       "move-leave-redirect": "Used as label for checkbox in the Move Pages form on [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|move-page-legend|legend for the form}}\n* {{msg-mw|movearticle|label for old title}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}",
+       "fix-double-redirects": "This is a checkbox in [[Special:MovePage]] which allows to move all redirects from the old title to the new title. Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "move-leave-redirect": "Used as label for checkbox in the Move Pages form on [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}",
        "protectedpagemovewarning": "{{Related|Semiprotectedpagewarning}}",
        "semiprotectedpagemovewarning": "{{Related|Semiprotectedpagewarning}}",
        "move-over-sharedrepo": "Notice when a file with that filename already exists on a shared repository, such as Wikimedia Commons.\n\nParameters:\n* $1 - the destination page title",
        "htmlform-title-not-exists": "Error message shown if the page title provided by the user does not exist. $1 is the page title.",
        "htmlform-user-not-exists": "Error message shown if a user with the name provided by the user does not exist. $1 is the username.",
        "htmlform-user-not-valid": "Error message shown if the name provided by the user isn't a valid username. $1 is the username.",
+       "rawmessage": "{{notranslate}} Used to pass arbitrary text as a message specifier array",
        "sqlite-has-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "sqlite-no-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}",
        "logentry-newusers-byemail": "{{Logentry|[[Special:Log/newusers]]}}\n\n$4 is the name of the user that was created.",
        "logentry-newusers-autocreate": "{{Logentry|[[Special:Log/newusers]]}}\n\n$4 is the gender of the target user.",
        "logentry-protect-move_prot": "{{Logentry|[[Special:Log/protect]]}}\n* $4 - the old title",
+       "logentry-protect-unprotect": "{{Logentry|[[Special:Log/protect]]}}",
+       "logentry-protect-protect": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)",
+       "logentry-protect-protect-cascade": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)\nFor word \"cascading\" see {{msg-mw|protect-summary-cascade}}",
+       "logentry-protect-modify": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)",
+       "logentry-protect-modify-cascade": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)\nFor word \"cascading\" see {{msg-mw|protect-summary-cascade}}",
        "logentry-rights-rights": "* $1 - username\n* $2 - (see below)\n* $3 - username\n* $4 - list of user groups or {{msg-mw|Rightsnone}}\n* $5 - list of user groups or {{msg-mw|Rightsnone}}\n----\n{{Logentry|[[Special:Log/rights]]}}",
        "logentry-rights-rights-legacy": "* $1 - username\n* $2 - (see below)\n* $3 - username\n----\n{{Logentry|[[Special:Log/rights]]}}",
        "logentry-rights-autopromote": "* $1 - username\n* $2 - (see below)\n* $3 - (see below)\n* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $5 - comma separated list of new user groups\n----\n{{Logentry|[[Special:Log/rights]]}}",
index de2d53b..11b8cfc 100644 (file)
@@ -10,7 +10,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Fitoschido",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "T'inkikunata uranpi sikwiy",
        "mergehistory-go": "Huñunalla llamk'apusqakunata rikuchiy",
        "mergehistory-submit": "Llamk'apusqakunata huñuy",
        "mergehistory-empty": "Manam atinichu llamk'apusqakunata huñuyta.",
-       "mergehistory-success": "[[:$1]]-paq $3 {{PLURAL:$3|llamk'apusqaqa|llamk'apusqakunaqa}} aypalla [[:$2]]-man huñusqañam.",
+       "mergehistory-done": "$1-paq $3 {{PLURAL:$3|llamk'apusqaqa|llamk'apusqakunaqa}} aypalla [[:$2]]-man huñusqañam.",
        "mergehistory-fail": "Manam atinichu wiñay kawsaykunata huñuyta. Ama hina kaspa, p'anqata pacha kuskanachina tupukunatapas musuqmanta llanchiy.",
        "mergehistory-no-source": "Pukyu p'anqaqa $1 manam kanchu.",
        "mergehistory-no-destination": "Taripana p'anqaqa $1 manam kanchu.",
        "movepagetext": "Kay hunt'ana p'anqawanqa huk p'anqa tukuy wiñay kawsasqanpas astasqam kanqa. Mawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa. Akllaptiykiqa, mawk'a sutiman t'inkimuq pusapuna p'anqakuna kikinmanta allinchasqam kanqa. Mana hinaptiykiqa, paqtataq [[Special:DoubleRedirects|iskayllapas]] [[Special:BrokenRedirects|p'akisqapas]] pusapuna p'anqakunata llanchispa allinchallay. Qammi paqtachiq, t'inkimuqkuna allinraq kana hawam kanki. Ama panta t'inkimuqkunata saqiychu.\n\nNisqayki musuq sutiyuq wiñay kawsasqayuq p'anqaña kachkaptinqa, kay p'anqa '''manam''' astasqa kanqachu. Huklla kuti astasqa p'anqataqa mawk'a sutinman astayta atinkim, manataqmi huk mawk'a kachkaqña p'anqamanchu.\n\n'''Paqtataq!'''\nKay astayqa ancha riqsisqa p'anqata hatun mana suyapusqa hukchaymi kayta atinman;\nama hina kaspa, yuyarillay imachus kay astanayki saqispa tukunata atinman.",
        "movepagetext-noredirectfixer": "Kay hunt'ana p'anqawanqa huk p'anqam tukuy wiñay kawsasqanpas musuq sutiman astasqa kanqa.\nMawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa.\nPaqtataq [[Special:DoubleRedirects|iskaylla]] icha [[Special:BrokenRedirects|p'akisqa]] pusapuna p'anqakunata allinchallay.\nAma panta t'inkimuqkunata saqiychu. Qammi chay t'inkikunap allin taripananmanta paqtachiq.\n\nNisqayki musuq sutiyuq wiñay kawsasqayuq p'anqaña kachkaptinqa, kay p'anqa '''manam''' astasqa kanqachu.\nHuklla kuti astasqa p'anqataqa mawk'a sutinman astayta atinkim, manataq huk mawk'a kachkaqña p'anqamanchu.\n\n'''Paqtataq!'''\nKay astayqa ancha riqsisqa p'anqata hatun mana suyapusqa hukchaymi kayta atinman;\nama hina kaspa, yuyarillay imachus kay astanaykita saqispa tukunata atinman.",
        "movepagetalktext": "P'anqaman kapuq rimachina p'anqaqa - kachkaspaqa - kikinmanta astasqam kanqa. '''Manallam astasqachu kanqa,'''\n*p'anqa huk suti huñumanta huk suti huñuman astasqa kachkaptinqa;\n*huk wiñay kawsasqayuq musuq sutiyuq rimachina p'anqa kachkaptinqa;\n*\"Rimachinapas, atikuq hinaptin\" nisqa akllanaman ama niptiykiqa.\n\nHinaptinqa, kay rimachina p'anqap samiqninta makiykiwan astanaykim tiyanqa.",
-       "movearticle": "P'anqata astay",
        "moveuserpage-warning": "'''Paqtataq:''' Ruraqpa p'anqantam astaykachachkanki. Qhawariy, p'anqallam astasqa kanqa, ruraqpa sutintaq '''manam''' wakinchasqachu kanqa.",
        "movenologintext": "P'anqata astanaykipaqqa hallch'asqa ruraqmi kanayki [[Special:UserLogin|llamk'apuy tiyay qallarinaykipas]] tiyan.",
        "movenotallowed": "Manam saqillasunkichu p'anqata astayta.",
        "api-error-badaccess-groups": "Kay wikipiqa willañiqikunata manam churkuyta atinkichu.",
        "api-error-badtoken": "Ukhupi pantasqa: Mana allinta sananchasqa.",
        "api-error-copyuploaddisabled": "URL nisqawanqa kay sirwiqpi manam churkuyta atinki.",
-       "api-error-duplicate": "Kay tiyaypiqa huk {{PLURAL:$1|[$2 willañiqim]|[$2 willañiqikunam]}} kachkanñam kaqlla samiqniyuq kaq.",
-       "api-error-duplicate-archive": "Kay tiyaypiqa huk {{PLURAL:$1|[$2 willañiqim]|[$2 willañiqikunam]}} karqanñam kaqlla samiqniyuq kaq, kunantaq qullusqañam.",
-       "api-error-duplicate-archive-popup-title": "Qullusqaña iskaychasqa {{PLURAL:$1|willañiqi|willañiqikuna}}.",
-       "api-error-duplicate-popup-title": "Iskaychasqa {{PLURAL:$1|willañiqi|willañiqikuna}}.",
+       "api-error-duplicate": "Kay tiyaypiqa huk {{PLURAL:$1|willañiqim|willañiqikunam}} kachkanñam kaqlla samiqniyuq kaq.",
+       "api-error-duplicate-archive": "Kay tiyaypiqa huk {{PLURAL:$1|willañiqim|willañiqikunam}} karqanñam kaqlla samiqniyuq kaq, kunantaq qullusqañam.",
        "api-error-empty-file": "Kachasqayki willañiqiqa ch'usaqmi.",
        "api-error-emptypage": "Musuq ch'usaq p'anqakunata kamariyqa manam saqillasqachu.",
        "api-error-fetchfileerror": "Ukhupi pantasqa: Willañiqita chaskiykachachkaptiyki ima mana allin kaqpas tukurqan.",
index efc7a1f..aa29cac 100644 (file)
@@ -10,7 +10,8 @@
                        "לערי ריינהארט",
                        "Davent",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Suttastritgar colliaziuns:",
        "mergehistory-go": "Mussar versiuns che pon vegnir unidas",
        "mergehistory-submit": "Unir las versiuns",
        "mergehistory-empty": "Naginas versiuns pon vegnir unidas.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versiun|versiuns}} da [[:$1]] {{PLURAL:$3|è vegnida unida|èn vegnidas unidas}} a [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versiun|versiuns}} da $1 {{PLURAL:$3|è vegnida unida|èn vegnidas unidas}} a [[:$2]].",
        "mergehistory-fail": "Betg pussaivel dad unir la cronologia. Controllescha ils parameters da las paginas e datas.",
        "mergehistory-no-source": "La pagina d'origin $1 n'exista betg.",
        "mergehistory-no-destination": "La pagina da destinaziun $1 n'exista betg.",
        "filerevert-legend": "Reinizialisar la datoteca",
        "filerevert-intro": "Ti es londervi da reinizialisar la [$4 versiun dals $2 las $3] da la datoteca '''[[Media:$1|$1]]'''.",
        "filerevert-comment": "Motiv:",
-       "filerevert-defaultcomment": "Reinizialisà la versiun dals $1 las $2",
+       "filerevert-defaultcomment": "Reinizialisà la versiun dals $1 las $2 ($3)",
        "filerevert-submit": "Reinizialisar",
        "filerevert-success": "'''[[Media:$1|$1]]''' è vegnì reinizialisà a la [$4 versiun dals $2 las $3].",
        "filerevert-badversion": "I n'exista nagina versiun locala da la datoteca dal temp inditgà.",
        "movepagetext": "Cun il formular sutvart das ti in nov num ad in artitgel e spostas l'entira istorgia da l'artitgel al nov.\nL'artitgel vegl renviescha lura al nov.\nTi pos actualisar automaticamain paginas che renvieschan a l'artitgel original.\nSche ti na vuls betg quai, controllescha p. pl las paginas che renvieschan [[Special:DoubleRedirects|dublamain]] u [[Special:BrokenRedirects|incorrect]].\nTi ès responsabels che tut las colliaziuns mainan al lieu ch'els duessan.\n\nFa stim, che la pagina '''na vegn betg''' spustada sch'i exista gia in artitgel cun il nov titel, auter sche quel è vids u renviescha ad in'autra pagina e n'ha nagina istorgia.\n\n'''ATTENZIUN!'''\nQuai po esser ina midada drastica ed nunspetgada per in artitgel popular;\nsajas conscient da las consequenzas che quai process po avair.",
        "movepagetext-noredirectfixer": "Il formular sutvart po dar in nov num ad ina pagina e spustar l'entira cronologia ad nov num. \nIl titel vegl vegn a renviar al titel nov.\nControllescha silsuenter ils [[Special:DoubleRedirects|renviaments dubels]] u [[Special:BrokenRedirects|nuncorrects]]. \nTi es responsabel da controllar che las colliaziuns mussan en quest lieu nua ch'ellas duessan. \n\nFa stim, che la pagina na vegn '''betg''' spustada sch'ina pagina cun il nov num exista gia; danor sch'ella è vida u in renviament senza cronologia.\nQuai munta che ti pos en cas che ti fas in sbagl spustar anavos la pagina nua ch'ella era avon e che ti na pso betg surscriver ina pagina existenta.\n\n\n'''Attenziun!'''\nQuai po esser ina midada drastica ed nunspetgada per in artitgel popular;\nsajas conscient da las consequenzas che quai process po avair.",
        "movepagetalktext": "La pagina da discussiun che tutga tar l'artitgel vegn spustada automaticamain cun l'artitgel, '''sche betg''':\n*Ina pagina da discussiun betg vida exista gia sut il lemma nov\n*Ti prendas ora il crutschin dal champ sutvart\n\nEn quests cas as ti da spustar u colliar manualmain las paginas, sche giavischà.",
-       "movearticle": "Spustar artitgel:",
        "moveuserpage-warning": "'''Attenziun:''' Ti es londervi da spustar ina pagina d'utilisader. Considerescha che be la pagina vegn spustada ed il num da l'utilisader na vegn ''betg'' midà.",
        "movenologintext": "Ti stos [[Special:UserLogin|t'annunziar]] per spustar in artitgel.",
        "movenotallowed": "Ti n'has betg il dretg da spustar paginas.",
        "api-error-badaccess-groups": "Ti na dastgas betg chargiar datotecas en quest wiki.",
        "api-error-badtoken": "Errur interna: Token fauss.",
        "api-error-copyuploaddisabled": "La funcziun da transferir dad ina URL è deactivada sin quest server.",
-       "api-error-duplicate": "I dat gia {{PLURAL:$1|ina [$2 autra datoteca]|[$2 autras datotecas]}} cun il medem cuntegn.",
-       "api-error-duplicate-archive": "I deva gia {{PLURAL:$1|ina [$2 autra datoteca]|[$2 autras datotecas]}} cun il medem cuntegn, {{PLURAL:$1|quella è dentant vegnida stizzada|quellas èn dentant vegnidas stizzadas}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Datoteca dubla ch'è gia vegnida stizzada|Datotecas dublas ch'èn gia vegnidas stizzadas}}.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Datoteca dubla|Datotecas dublas}}.",
+       "api-error-duplicate": "I dat gia {{PLURAL:$1|ina autra datoteca|autras datotecas}} cun il medem cuntegn.",
+       "api-error-duplicate-archive": "I deva gia {{PLURAL:$1|ina autra datoteca|autras datotecas}} cun il medem cuntegn, {{PLURAL:$1|quella è dentant vegnida stizzada|quellas èn dentant vegnidas stizzadas}}.",
        "api-error-empty-file": "La datoteca tramessa è vida.",
        "api-error-emptypage": "Crear paginas novas e vidas n'è betg lubì.",
        "api-error-fetchfileerror": "Errur interna: Insatge n'ha betg funcziunà durant retschaiver la datoteca.",
index b80552f..9ca6211 100644 (file)
@@ -26,7 +26,9 @@
                        "XXN",
                        "Fitoschido",
                        "Macofe",
-                       "ImGelu"
+                       "ImGelu",
+                       "Wintereu",
+                       "Rsocol"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
        "nstab-template": "Format",
        "nstab-help": "Ajutor",
        "nstab-category": "Categorie",
+       "mainpage-nstab": "Pagina principală",
        "nosuchaction": "Această acțiune nu există",
        "nosuchactiontext": "Acțiunea specificată în URL este invalidă.\nS-ar putea să fi introdus greșit URL-ul, sau să fi urmat o legătură incorectă.\nAceasta s-ar putea să indice și un bug în programul folosit de {{SITENAME}}.",
        "nosuchspecialpage": "Această pagină specială nu există",
        "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ă un alt cont",
+       "createacct-another-submit": "Creează contul",
        "createacct-benefit-heading": "{{SITENAME}} este un proiect clădit de oameni ca dumneavoastră.",
        "createacct-benefit-body1": "{{PLURAL:$1|modificare|modificări|de modificări}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagină|pagini|de pagini}}",
        "changeemail-password": "Parola dumneavoastră la {{SITENAME}}:",
        "changeemail-submit": "Modifică adresa de e-mail",
        "changeemail-throttled": "Ați avut prea multe încercări de a vă autentifica.\nVă rugăm să așteptați $1 până să reîncercați.",
+       "changeemail-nochange": "Vă rugăm să introduceți o nouă adresă de e-mail diferită.",
        "resettokens": "Resetare jetoane",
        "resettokens-text": "Puteți reseta, aici, jetoanele care permit accesul la anumite date asociate contului dumneavoastră.\n\nAr trebui să faceți acest lucru numai dacă le-ați partajat accidental cu altcineva ori contul dumneavoastră a fost compromis.",
        "resettokens-no-tokens": "Nu există jetoane de resetat.",
        "permissionserrorstext-withaction": "Nu aveți permisiunea să $2, din {{PLURAL:$1|următorul motivul|următoarele motive}}:",
        "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.",
        "log-fulllog": "Vezi tot jurnalul",
        "edit-hook-aborted": "Modificarea a fost abandonată din cauza unui hook.\nNicio explicație furnizată.",
        "edit-gone-missing": "Pagina nu s-a putut actualiza.\nSe pare că a fost ștearsă.",
        "mergehistory-go": "Vezi modificările care pot fi combinate",
        "mergehistory-submit": "Unește versiunile",
        "mergehistory-empty": "Nicio versiune nu poate fi unită.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versiune|versiuni|de versiuni}} ale [[:$1]] {{PLURAL:$3|a fost unită|au fost unite|au fost unite}} cu succes în [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versiune|versiuni|de versiuni}} ale $1 {{PLURAL:$3|a fost unită|au fost unite|au fost unite}} cu succes în [[:$2]].",
        "mergehistory-fail": "Nu se poate executa combinarea istoricului, te rog verifică parametrii pagină și timp.",
        "mergehistory-fail-toobig": "Nu s-a putut efectua unirea istoricelor întrucât s-ar fi depășit limita de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}} mutat{{PLURAL:$1|ă|e}}.",
        "mergehistory-no-source": "Pagina sursă $1 nu există.",
        "recentchangeslinked-summary": "Aceasta este o listă a schimbărilor efectuate recent asupra paginilor cu legături de la o anumită pagină (sau asupra membrilor unei anumite categorii).\nPaginile pe care le [[Special:Watchlist|urmăriți]] apar cu <strong>aldine</strong>.",
        "recentchangeslinked-page": "Numele paginii:",
        "recentchangeslinked-to": "Afișează schimbările în paginile care se leagă de pagina dată",
+       "recentchanges-page-added-to-category": "[[:$1]] a fost adăugată în categorii",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost adăugate în categorii",
+       "recentchanges-page-removed-from-category": "[[:$1]] eliminată din categorii",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost eliminate din categorii",
        "upload": "Încărcare fișier",
        "uploadbtn": "Încarcă fișier",
        "reuploaddesc": "Revocare încărcare și întoarcere la formularul de trimitere.",
        "upload-http-error": "A avut loc o eroare HTTP: $1",
        "upload-copy-upload-invalid-domain": "Încărcarea copiilor nu este disponibilă pentru acest domeniu.",
        "upload-dialog-title": "Încărcare fișier",
-       "upload-dialog-error": "A apărut o eroare",
-       "upload-dialog-warning": "A apărut o atenționare",
        "upload-dialog-button-cancel": "Revocare",
        "upload-dialog-button-done": "Realizat",
        "upload-dialog-button-save": "Salvare",
        "upload-dialog-button-upload": "Încarcă",
-       "upload-dialog-label-select-file": "Selectează fișier",
-       "upload-dialog-label-infoform-title": "Detalii",
-       "upload-dialog-label-infoform-name": "Nume",
-       "upload-dialog-label-infoform-description": "Descriere",
-       "upload-dialog-label-usage-title": "Utilizare",
-       "upload-dialog-label-usage-filename": "Numele fișierului",
+       "upload-process-error": "A apărut o eroare",
+       "upload-process-warning": "A apărut o atenționare",
+       "upload-form-label-select-file": "Selectează fișier",
+       "upload-form-label-infoform-title": "Detalii",
+       "upload-form-label-infoform-name": "Nume",
+       "upload-form-label-infoform-description": "Descriere",
+       "upload-form-label-usage-title": "Utilizare",
+       "upload-form-label-usage-filename": "Numele fișierului",
        "backend-fail-stream": "Imposibil de citit fișierul $1.",
        "backend-fail-backup": "Imposibil de efectuat o copie de rezervă a fișierului $1.",
        "backend-fail-notexists": "Fișierul $1 nu există.",
        "filerevert-legend": "Revenirea la o versiune anterioară",
        "filerevert-intro": "Pentru a readuce fișierul '''[[Media:$1|$1]]''' la versiunea din [$4 $2 $3] apasă butonul de mai jos.",
        "filerevert-comment": "Motiv:",
-       "filerevert-defaultcomment": "Revenire la versiunea din $2, $1",
+       "filerevert-defaultcomment": "Revenire la versiunea din $2, $1 ($3)",
        "filerevert-submit": "Revenire",
        "filerevert-success": "'''[[Media:$1|$1]]''' a fost readus [la versiunea $4 din $3, $2].",
        "filerevert-badversion": "Nu există o versiune mai veche a fișierului care să corespundă cu data introdusă.",
        "emailccsubject": "O copie a mesajului la $1: $2",
        "emailsent": "E-mail trimis",
        "emailsenttext": "E-mailul dumneavoastră a fost trimis.",
-       "emailuserfooter": "Acest mesaj a fost trimis de $1 către $2 prin intermediul funcției „{{int:emailuser}}” de la {{SITENAME}}.",
+       "emailuserfooter": "Acest mesaj a fost {{GENDER:$1|trimis}} de $1 către {{GENDER:$2|$2}} prin intermediul funcției „{{int:emailuser}}” de la {{SITENAME}}.",
        "usermessage-summary": "a lăsat un mesaj de sistem",
        "usermessage-editor": "Mesager de sistem",
        "watchlist": "Pagini urmărite",
        "deletepage": "Șterge pagina",
        "confirm": "Confirmă",
        "excontent": "conținutul era: '$1'",
-       "excontentauthor": "conținutul era: „$1” (unicul contribuitor: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "conținutul era: „$1”, iar unicul contribuitor a fost „[[Special:Contributions/$2|$2]]” ([[User talk:$2|discuție]])",
        "exbeforeblank": "conținutul înainte de golire era: '$1'",
        "delete-confirm": "Şterge \"$1\"",
        "delete-legend": "Şterge",
        "movepagetext": "Puteți folosi formularul de mai jos pentru a redenumi o pagină, mutându-i tot istoricul sub noul nume.\nPagina veche va deveni o pagină de redirecționare către pagina nouă.\nLegăturile către pagina veche nu vor fi redirecționate către cea nouă;\nnu uitați să verificați dacă nu există redirecționări [[Special:DoubleRedirects|duble]] sau [[Special:BrokenRedirects|invalide]].\n\nVă rugăm să rețineți că sunteți responsabil(ă) pentru a face legăturile vechi să rămână valide.\n\nRețineți că pagina '''nu va fi redenumită''' dacă există deja o pagină cu noul titlu, în afara cazului în care cea din urmă este deja o redirecționare; în plus, aceasta nu trebuie să aibă un istoric de modificări.\nCu alte cuvinte, veți putea redenumi înapoi o pagină pe care ați redenumit-o greșit, dar nu veți putea suprascrie o pagină validă existentă prin redenumirea alteia.\n\n'''ATENȚIE!'''\nAceasta poate fi o schimbare drastică și neașteptată pentru o pagină populară;\nvă rugăm să vă asigurați că înțelegeți toate consecințele înainte de a continua.",
        "movepagetext-noredirectfixer": "Completând formularul de mai jos veți redenumi o pagină, mutând tot istoricul la noul nume.\nVechiul titlu va deveni o pagină de redirecționare către noul titlu.\nFiți sigur că ați verificat lista redirecționărilor [[Special:DoubleRedirects|duble]] sau [[Special:BrokenRedirects|nefuncționale]].\nVă rugăm să rețineți că aveți responsabilitatea de a verifica dacă nu cumva destinația inițială a vechilor legături s-a modificat.\n\nNu uitați că pagina '''nu va fi redenumită''' dacă o pagină cu noul titlul există deja, cu excepția cazurilor în care aceasta este complet goală și nu are istoric de modificări sau este o pagină de redirecționare.\nAcest lucru înseamnă că veți putea redenumi la titlul inițial o pagină greșit redenumită, dar nu veți putea suprascrie o pagină existentă.\n\n'''Atenție!'''\nAceastă acțiune poate determina o schimbare dramatică, neașteptată pentru o pagină cu trafic crescut;\nasigurați-vă că înțelegeți toate consecințele înainte de a continua.",
        "movepagetalktext": "Pagina de discuții asociată, dacă există, va fi redenumită\nautomat odată cu aceasta în '''afara următoarelor cazuri''':\n* există deja o pagină de discuții cu conținut (care nu este goală) sub noul nume, sau\n* nu bifați căsuța de mai jos.\n\nÎn oricare din cazurile de mai sus va trebui să redenumiți sau să unificați\nmanual paginile de discuții, dacă doriți acest lucru.",
-       "movearticle": "Pagina de redenumit:",
        "moveuserpage-warning": "'''Atenție''': sunteți pe cale să redenumiți o pagină de utilizator. Vă rugăm să rețineți că singura redenumită va fi pagina, nu și utilizatorul.",
        "movecategorypage-warning": "<strong>Atenție:</strong> Sunteți pe cale să redenumiți pagina unei categorii. Rețineți că doar pagina va fi redenumită, iar orice alte pagini conținute în vechea categorie <em>nu</em> vor fi transferate în cea nouă.",
        "movenologintext": "Trebuie să fiți un utilizator înregistrat și [[Special:UserLogin|autentificat]] pentru a redenumi o pagină.",
        "tooltip-t-contributions": "Vezi lista de contribuții ale acestui utilizator",
        "tooltip-t-emailuser": "Trimite un e-mail acestui utilizator",
        "tooltip-t-info": "Mai multe informații despre această pagină",
-       "tooltip-t-upload": "Încărcare de fișiere",
+       "tooltip-t-upload": "Încărcare fișiere",
        "tooltip-t-specialpages": "Lista tuturor paginilor speciale",
        "tooltip-t-print": "Versiunea de tipărit a acestei pagini",
        "tooltip-t-permalink": "Legătura permanentă către această versiune a paginii",
        "logentry-newusers-byemail": "Contul de utilizator $3 a fost {{GENDER:$2|creat}} de către $1, iar parola a fost trimisă prin e-mail",
        "logentry-newusers-autocreate": "Contul de utilizator $1 a fost {{GENDER:$2|creat}} în mod automat",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|a mutat}} setările de protecție de la $4 la $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|a eliminat}} protecția pentru $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|a protejat}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|a protejat}} $3 $4 [protecție în cascadă]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|a modificat}} nivelul protecției pentru $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|a modificat}} nivelul protecției pentru $3 $4 [protecție în cascadă]",
        "logentry-rights-rights": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3 de la $4 la $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a fost promovat|a fost promovată}} în mod automat de la $4 la $5",
        "api-error-badaccess-groups": "Nu aveți dreptul să încărcați fișiere pe acest wiki.",
        "api-error-badtoken": "Eroare internă: jeton greșit.",
        "api-error-copyuploaddisabled": "Încărcarea prin URL este dezactivată pe acest server.",
-       "api-error-duplicate": "Există {{PLURAL:$1|un [$2 alt fișier]|[$2 alte fișiere]}} deja încărcate cu același conținut.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|A existat [$2 un alt fișier]|Au existat [$2 alte fișiere]}} cu același conținut pe site, dar {{PLURAL:$1|a fost|au fost}} șterse.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fișierul|Fișierele}} {{PLURAL:$1|duplicat|duplicate}} care {{PLURAL:$1|a|au}} fost deja {{PLURAL:$1|șters|șterse}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fișier|Fișiere}} {{PLURAL:$1|duplicat|duplicate}}",
+       "api-error-duplicate": "Există {{PLURAL:$1|un alt fișier deja încărcat|alte fișiere deja încărcate}} cu același conținut.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|A existat un alt fișier|Au existat alte fișiere}} cu același conținut pe site, dar {{PLURAL:$1|a fost|au fost}} șterse.",
        "api-error-empty-file": "Fișierul încărcat de dumneavoastră este gol.",
        "api-error-emptypage": "Crearea paginilor noi, goale nu este permisă.",
        "api-error-fetchfileerror": "Eroare internă: ceva nu a funcționat corect la prelucrarea fișierului.",
index 6538d68..7b89801 100644 (file)
        "nstab-template": "Template",
        "nstab-help": "Pàgene d'ajute",
        "nstab-category": "Categorije",
+       "mainpage-nstab": "Pàgena Prengepàle",
        "nosuchaction": "Non ge stonne otre azione",
        "nosuchactiontext": "L'aziona specifichete da l'URL non g'è canusciute da Uicchi.\nTu puè avè scritte male 'a URL, o quidde ca è scritte jè 'nu collegamende sbagliete.\nPò essere pure ca quiste jè 'nu bochere jndr'à 'u software de {{SITENAME}}.",
        "nosuchspecialpage": "Non ge stonne pàggene speciele",
        "viewsource": "Vide 'u sorgende",
        "viewsource-title": "Vide 'a sorgende pe $1",
        "actionthrottled": "Azione inderrotte",
-       "actionthrottledtext": "Cumme 'na mesure andi-spam, tu è state limitete da fà st'azione troppe vote jndr'à 'nu timbe piccinne e tu è subranete stu limite.\nPe piacere prueve cchiù tarde.",
+       "actionthrottledtext": "Cumme 'na mesure andi-abbuse, tu è state limitate da fà st'azione troppe vote jndr'à 'nu tiembe curte e tu è subranate stu limite.\nPe piacere pruéve cchiù tarde.",
        "protectedpagetext": "Sta pàgene ha state prutette pe no fa fà cangiaminde o otre aziune a uecchje.",
        "viewsourcetext": "Tu puè 'ndrucà e cupià 'a sorgente de sta pàgene.",
        "viewyourtext": "Tu puè 'ndrucà e copià 'a sorgende de <strong>le cangiaminde tune</strong> a sta pàgene.",
        "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 'n'otre cunde",
+       "createacct-another-submit": "Ccreje 'nu cunde utende",
        "createacct-benefit-heading": "{{SITENAME}} jè fatte da crestiane cumme a te.",
        "createacct-benefit-body1": "{{PLURAL:$1|cangiamende|cangiaminde}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgene|pàggene}}",
        "createacct-benefit-body3": "{{PLURAL:$1|condrebbutore}} recende",
        "badretype": "Le passuord ca è scritte non ge sonde uguale.",
+       "usernameinprogress": "'Na ccrejazzione de 'nu cunde pe stu nome utende ste già in esecuzione.\nPe piacere, aspitte.",
        "userexists": "'U nome de l'utende ca è scritte jè già ausate.\nPe piacere scacchiane n'otre.",
        "loginerror": "Errore de collegamende",
        "createacct-error": "Errore sus 'a ccrejazione d'u cunde",
        "passwordreset-emailtext-ip": "Quacchedune (pò essere tu, da 'u 'ndirizze IP $1) ha richieste 'na mail pe arrecurdarse de le dettaglie d'u cunde sue pe {{SITENAME}} ($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}} 'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailtext-user": "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}\n($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}}  'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailelement": "Nome utende: \n$1\n\nPassuord temboranèe: \n$2",
-       "passwordreset-emailsent": "'N'e-mail pe arrecurdarte ha state mannate.",
+       "passwordreset-emailsent": "Ce quiste jè 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
        "passwordreset-emailsent-capture": "'Na e-mail pe azzeramende d'a passuord ha state mannate, ca jè fatte vedè aqquà sotte.",
        "passwordreset-emailerror-capture": "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a {{GENDER:$2|l'utende}} ha fallite: $1",
        "changeemail": "Cange 'u 'ndirizze e-mail",
        "mergehistory-go": "Fà vedè le cangiaminde ca se ponne squagghià 'nzieme",
        "mergehistory-submit": "Scuagghije 'nzieme le revisiune",
        "mergehistory-empty": "Nisciuna revisione pò essere scuagghiate.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisione|revisiune}} de [[:$1]] onne state scuagghiate jndr'à [[:$2]] correttamende.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisione|revisiune}} de $1 onne state scuagghiate jndr'à [[:$2]] correttamende.",
        "mergehistory-fail": "Non ge se pò fa vedè 'a storie d'u scuagghiamende, pe piacere verifiche 'n'otra vota a pàgene e le parametre de l'orarie.",
        "mergehistory-fail-toobig": "Non ge pozze combletà 'u scuagghiamende s'u cunde purcé supranesce 'u limite de $1 {{PLURAL:$1|revisione|revisiune}} ca onna essere spustate.",
        "mergehistory-no-source": "'A pàgena sorgende $1 non g'esiste.",
        "group-bot": "Bot",
        "group-sysop": "Sysop",
        "group-bureaucrat": "Burocrate",
-       "group-suppress": "Supervisionature",
+       "group-suppress": "Suppressore",
        "group-all": "(tutte)",
        "group-user-member": "{{GENDER:$1|utende}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utende autoconfermate}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|amministratore}}",
        "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
-       "group-suppress-member": "{{GENDER:$1|supervisionatore}}",
+       "group-suppress-member": "{{GENDER:$1|soppressore}}",
        "grouppage-user": "{{ns:project}}:Utinde",
        "grouppage-autoconfirmed": "{{ns:project}}:Utinde Autoconfermete",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Amministratore",
        "grouppage-bureaucrat": "{{ns:project}}:Burocrate",
-       "grouppage-suppress": "{{ns:project}}:Supervisionatore",
+       "grouppage-suppress": "{{ns:project}}:Soppresse",
        "right-read": "Ligge le pàggene",
        "right-edit": "Cange le pàggene",
        "right-createpage": "Ccreje le pàggene (ca non ge tènene le pàggene de le 'ngazzaminde)",
        "upload-http-error": "S'a verificate 'n'errore HTTP: $1",
        "upload-copy-upload-invalid-domain": "'A copie de le carecaminde non g'è disponibbile da stu dominie.",
        "upload-dialog-title": "Careche 'u file",
-       "upload-dialog-error": "Ave assute 'n'errore",
-       "upload-dialog-warning": "Ha assute 'n'avvise",
        "upload-dialog-button-cancel": "Annulle",
        "upload-dialog-button-done": "Fatte",
        "upload-dialog-button-save": "Reggìstre",
        "upload-dialog-button-upload": "Careche",
-       "upload-dialog-label-select-file": "Scacchie 'u file",
-       "upload-dialog-label-infoform-title": "Dettaglie",
-       "upload-dialog-label-infoform-name": "Nome",
-       "upload-dialog-label-infoform-description": "Descrizione",
-       "upload-dialog-label-usage-title": "Ause",
-       "upload-dialog-label-usage-filename": "Nome d'u file",
+       "upload-process-error": "Ave assute 'n'errore",
+       "upload-process-warning": "Ha assute 'n'avvise",
+       "upload-form-label-select-file": "Scacchie 'u file",
+       "upload-form-label-infoform-title": "Dettaglie",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrizione",
+       "upload-form-label-usage-title": "Ause",
+       "upload-form-label-usage-filename": "Nome d'u file",
        "backend-fail-stream": "Non ge pozze trasmettere 'u file $1.",
        "backend-fail-backup": "Non ge pozze cupià 'u file $1.",
        "backend-fail-notexists": "'U file $1 non g'esiste.",
        "filerevert-legend": "'Nvirte 'u file",
        "filerevert-intro": "Tu ste converte 'u file '''[[Media:$1|$1]]''' jndr'à [$4 versione cumme $3, $2].",
        "filerevert-comment": "Mutive:",
-       "filerevert-defaultcomment": "Convertite a 'a versione a le $2 d'u $1",
+       "filerevert-defaultcomment": "Repristinate a 'a versione a le $2 d'u $1 ($3)",
        "filerevert-submit": "'Nvirte",
        "filerevert-success": "'''[[Media:$1|$1]]''' ha state convertite a 'a versiona [$4 de le $3 d'u $2].",
        "filerevert-badversion": "Non ge stè 'na versiona locale precedende de stu file cu l'orarie richieste.",
        "nopagetext": "'A pàgene de destinazione ca tu è specificate non g'esiste.",
        "pager-newer-n": "{{PLURAL:$1|cchiù nueve 1|cchiù nueve $1}}",
        "pager-older-n": "{{PLURAL:$1|cchiù vecchie 1|cchiù vicchie $1}}",
-       "suppress": "Supervisione",
+       "suppress": "Sopprime",
        "querypage-disabled": "Sta pàgena speciale jè desabbilitate pe mutive de prestaziune.",
        "apihelp": "Aijute de l'API",
        "apihelp-no-such-module": "Module \"$1\" none acchiate.",
        "emailccsubject": "Copie de le messàgge tue a $1: $2",
        "emailsent": "E-mail mannete",
        "emailsenttext": "'U messagge email tue ha state mannete.",
-       "emailuserfooter": "Sta e-mail ha state mannate da $1 a $2 da 'a funziona \"{{int:emailuser}}\" de {{SITENAME}}.",
+       "emailuserfooter": "Sta e-mail ha state {{GENDER:$1|mannate}} da $1 a {{GENDER:$2|$2}} da 'a funziona \"{{int:emailuser}}\" de {{SITENAME}}.",
        "usermessage-summary": "Lassanne 'nu messagge de sisteme.",
        "usermessage-editor": "Messaggiatore de sisteme",
        "usermessage-template": "MediaWiki:UserMessage",
        "movepagetext": "Ausanne 'u form aqquà sotte ste cange 'u nome d'a pàgene, spustanne tutte 'a storia soje sus a 'u nome nuéve.\nU' vecchie titole devènde 'nu ridirezionamende sus 'a pàgena nove.\nTu puè aggiornà 'u ridirezionamende ca apponde a 'u titole origgenale automaticamende.\nCe tu no ste scacchie, sta secure de condrollà [[Special:DoubleRedirects|doppie ridirezionaminde]] o [[Special:BrokenRedirects|ridirezionaminde scuasciate]].\nTu si 'u responsabbile de quidde ca cumbine, assicurate ca 'u collegamende condinue a appondà addò avessa scè.\n\nVide Bbuene ca 'a pàgene '''non''' g'avène spustate ce esiste n'otra pàgene cu 'u titole nuéve, a mene ca jè vacande o jè 'na pàgene de ridirezionamende senza storie.\nQuieste significhe ca tu puè fà turnà 'u vecchie nome 'a pàgene ce jedde ha state renomenate e t'è rese conde ca è fatte 'na studecarije sovrascrevènne 'na pàgene esistende.\n\n'''ATTENZIONE!'''\nQuiste pò essere 'nu cangiamende drastiche e inaspettate de 'na pàgene famose assaje;\npe piacere a essere secure-secure de le conseguenze apprime de condinuà.",
        "movepagetext-noredirectfixer": "Ausanne 'u module aqquà sotte puè renomenà 'na pàgene, spustanne tutte 'a storia soje sotte a 'u nome nuève.\n'U titele vecchie addevende 'na pàgene de ridirezionamende a 'u titele nuève.\nMe raccomande condrolle le redirezionaminde [[Special:DoubleRedirects|a doppie]] o [[Special:BrokenRedirects|scuasciate]].\nTu si responsabbele de assicurarte ca le collagaminde appondene a 'u punde giuste.\n\nVide ca 'a pàgene '''non''' g'avene spustate ce già stè 'na pàgene cu 'u titele nuève, a meno che non g'è vacande o jè 'nu ridirezionamende e non ge tène 'na storie de cangiaminde.\nQuiste signifeche ca jè possibbele renominà 'na pàgene accume se chiamave apprime addò tu è fatte 'n'errore e non g'è possibbele sovrascirevere 'na pàgene esistende.\n\n'''Fà Attenziò!'''\nQuiste pò essere 'nu cangiamende inaspettate pe 'na pàgene popolare;\nPe piacere ha essere secure secure de avere capite le conzeguenze apprime de scè nnande.",
        "movepagetalktext": "'A pagene de le 'ngazzaminde associete avène spustete automaticamende ce però:\n\n* Ste 'na pàgene de 'ngazzaminde chiena sotte 'a vôsce nova, o\n* Non ge signe 'u cieck box de sotte.\n\nJndr'à ste case, 'a pàgene non g'avène spustete e pò t'a cupià a màne 'u codenute sue.",
-       "movearticle": "Spuèste:",
        "moveuserpage-warning": "'''Attenziò:''' Tu stè spuèste 'na pàgene utende. Vide bbuène ca sulamende 'a pàgene avène spustate ma l'utende ''non'' g'avene renomenate.",
        "movecategorypage-warning": "<strong>Attenziò:</strong> Tu vuè ccu spuéste 'na pàgene categorije. Vide ca sulamende 'a pàgene avène spustate ma tutte le pàggene ca stonne jndr'à categorije <em>non</em> g'avène spustate sotte a quedda nove.",
        "movenologintext": "Tu a essere 'n'utende reggistrete e [[Special:UserLogin|colleghete]] pe spustà 'na pàgene.",
        "api-error-badaccess-groups": "Tu non ge puè carecà file sus a sta Uicchi.",
        "api-error-badtoken": "Errore inderne: Gettone errate.",
        "api-error-copyuploaddisabled": "'U carecamende da URL jè disabbilitate sus a stu server.",
-       "api-error-duplicate": "{{PLURAL:$1|Stè [$2 'n'otre file]|Stonne [$2 otre file]}} sus a 'u site cu 'u stesse condenute.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Stave [$2 'n'otre file]|Stavane [$2 otre file]}} già sus a 'u site cu 'u stesse condenute, ma {{PLURAL:$1|ha state|onne state}} scangellate.",
-       "api-error-duplicate-archive-popup-title": "Dupliche {{PLURAL:$1|'u file ca ha state|le file ca onne state}} scangellate.",
-       "api-error-duplicate-popup-title": "Dupleche {{PLURAL:$1|file|file}}",
+       "api-error-duplicate": "{{PLURAL:$1|Stè 'n'otre file|Stonne otre file}} sus a 'u site cu 'u stesse condenute.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Stave 'n'otre file|Stavane otre file}} già sus a 'u site cu 'u stesse condenute, ma {{PLURAL:$1|ha state|onne state}} scangellate.",
        "api-error-empty-file": "'U file ca tu è confermate ere vacande.",
        "api-error-emptypage": "Quanne se ne ccreje une, le pàggene vacande non ge sò permesse.",
        "api-error-fetchfileerror": "Errore inderne: Quacchecose ha sciute stuèrte quanne ste analizzave 'u file.",
index de75b96..0afec04 100644 (file)
@@ -83,7 +83,8 @@
                        "Marina Melik-Adamyan",
                        "Normalex",
                        "WindEwriX",
-                       "Nzeemin"
+                       "Nzeemin",
+                       "INS Pirat"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "newwindow": "&nbsp;(в новом окне)",
        "cancel": "Отменить",
        "moredotdotdot": "Далее…",
-       "morenotlisted": "Этот список не является полным.",
+       "morenotlisted": "Этот список неполон.",
        "mypage": "Страница",
        "mytalk": "Обсуждение",
        "anontalk": "Обсуждение для этого IP-адреса",
        "nstab-template": "Шаблон",
        "nstab-help": "Справка",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Заглавная",
        "nosuchaction": "Такого действия нет",
        "nosuchactiontext": "Указанное в URL действие ошибочно.\nВозможно, вы допустили опечатку при наборе URL или перешли по ошибочной ссылке.\nЭто может также указывать на ошибку в проекте {{SITENAME}}.",
        "nosuchspecialpage": "Нет такой служебной страницы",
        "no-null-revision": "Не удалось создать новую нулевую правку для страницы «$1»",
        "badtitle": "Недопустимое название",
        "badtitletext": "Запрашиваемое название страницы неправильно, пусто, либо неверно указано межъязыковое или интервики название. Возможно, в названии используются недопустимые символы.",
-       "title-invalid-empty": " Заголовок запрошенной страницы пуст или является названием пространства имен.",
+       "title-invalid-empty": "Заголовок запрошенной страницы пуст или содержит только название пространства имён.",
        "title-invalid-utf8": "Запрашиваемое название страницы содержит некорректную последовательность символов UTF-8.",
        "title-invalid-interwiki": "Запрашиваемое название страницы содержит интервики-ссылку, которая не может быть использована в названиях.",
        "title-invalid-talk-namespace": "Запрашиваемое название страницы ссылается на страницу обсуждения, которая не может существовать.",
        "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|статья|статьи|статей}}",
        "passwordreset-emailsent": "Отправлено электронное письмо с информацией о сбросе пароля.",
        "passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
        "passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
-       "changeemail": "Изменить адрес электронной почты",
-       "changeemail-text": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Вам нужно будет ввести пароль, чтобы подтвердить изменение.",
+       "changeemail": "Ð\98змениÑ\82Ñ\8c Ð¸Ð»Ð¸ Ñ\83далиÑ\82Ñ\8c Ð°Ð´Ñ\80еÑ\81 Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b",
+       "changeemail-text": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Вам нужно будет ввести пароль, чтобы подтвердить изменение. Если вы хотите отвязать свой адрес электронной почты от учётной записи, оставить поле нового адреса электронной почты пустым при заполнении формы.",
        "changeemail-no-info": "Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.",
        "changeemail-oldemail": "Текущий адрес электронной почты:",
        "changeemail-newemail": "Новый адрес электронной почты:",
+       "changeemail-newemail-help": "Это поле должно быть оставлено пустым, если вы хотите удалить свой адрес электронной почты. Но после его удаления Вы не сможете сбросить забытый пароль и не будете получать письма из этого вики-проекта.",
        "changeemail-none": "(нет)",
        "changeemail-password": "Ваш пароль для проекта «{{SITENAME}}»:",
        "changeemail-submit": "Изменить адрес",
        "permissionserrorstext-withaction": "У вас нет прав на $2 по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
        "recreate-moveddeleted-warn": "'''Внимание. Вы пытаетесь воссоздать страницу, которая ранее удалялась.'''\n\nПроверьте, действительно ли вам нужно воссоздавать эту страницу.\nНиже приведены журналы удалений и переименований этой страницы.",
        "moveddeleted-notice": "Эта страница была удалена.\nДля справки ниже показаны соответствующие записи из журналов удалений и переименований.",
+       "moveddeleted-notice-recent": "К сожалению, эта страница была недавно удалена (в течение последних 24 часов).\nНиже для справки приведены журналы удаления и перемещения для этой страницы.",
        "log-fulllog": "Просмотреть журнал целиком",
        "edit-hook-aborted": "Правка отменена процедурой-перехватчиком.\nДополнительных разъяснений не приведено.",
        "edit-gone-missing": "Невозможно обновить страницу.\nВероятно, она была удалена.",
        "mergehistory-go": "Показать объединяемые правки",
        "mergehistory-submit": "Объединить правки",
        "mergehistory-empty": "Не найдены правки для объединения.",
-       "mergehistory-success": "$3 {{PLURAL:$3|правка|правок|правки}} из [[:$1]] успешно {{PLURAL:$3|перенесена|перенесены}} в [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|правка|правок|правки}} из $1 {{PLURAL:$3|была перенесена|были перенесены}} в [[:$2]].",
        "mergehistory-fail": "Не удалось произвести объединение историй страниц, пожалуйста, проверьте параметры страницы и времени.",
        "mergehistory-fail-toobig": "Не удаётся выполнить слияние истории, так как необходимо перенести больше допустимого лимита в $1 {{PLURAL:$1|версию|версии|версий}}.",
        "mergehistory-no-source": "Исходная страница «$1» не существует.",
        "prefs-watchlist-token": "Токен списка наблюдения:",
        "prefs-misc": "Другие настройки",
        "prefs-resetpass": "Изменить пароль",
-       "prefs-changeemail": "Изменить адрес электронной почты",
+       "prefs-changeemail": "Ð\98змениÑ\82Ñ\8c Ð¸Ð»Ð¸ Ñ\83далиÑ\82Ñ\8c Ð°Ð´Ñ\80еÑ\81 Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b",
        "prefs-setemail": "Установка адреса эл. почты",
        "prefs-email": "Параметры электронной почты",
        "prefs-rendering": "Внешний вид",
        "userrights-groups-help": "Вы можете изменить группы, в которые входит этот участник.\n* Если около названия группы стоит отметка, значит участник входит в эту группу.\n* Если отметка не стоит — участник не относится к соответствующей группе.\n* Знак * отмечает, что вы не сможете удалить участника из группы, если добавите его в неё, или наоборот.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нет разрешения изменять права участников на других вики.",
-       "userrights-nodatabase": "База данных $1 не существует или не является локальной.",
+       "userrights-nodatabase": "База данных $1 не существует или расположена не локально.",
        "userrights-nologin": "Вы должны [[Special:UserLogin|представиться системе]] с учётной записи администратора, чтобы присваивать права участникам.",
        "userrights-notallowed": "У вас нет разрешения добавлять и удалять права участников.",
        "userrights-changeable-col": "Группы, которые вы можете изменять",
        "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": "Автоматическое изменение MediaWiki",
        "upload": "Загрузить файл",
        "uploadbtn": "Загрузить файл",
        "reuploaddesc": "Вернуться к форме загрузки",
        "fileexists": "Файл с этим именем уже существует, пожалуйста, проверьте <strong>[[:$1]]</strong>, если {{GENDER:|вы}} не уверены, что хотите заменить его.\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": "Файл, Ð²ÐµÑ\80оÑ\8fÑ\82но, Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\83менÑ\8cÑ\88енной ÐºÐ¾Ð¿Ð¸ÐµÐ¹ (миниаÑ\82Ñ\8eÑ\80ой). [[$1|thumb]]\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ñ\80овеÑ\80Ñ\8cÑ\82е Ñ\84айл <strong>[[:$1]]</strong>.\nÐ\95Ñ\81ли Ñ\83казаннÑ\8bй Ñ\84айл Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\82ем Ð¶Ðµ Ð¸Ð·Ð¾Ð±Ñ\80ажением, не стоит загружать отдельно его уменьшенную копию.",
+       "fileexists-thumbnail-yes": "Ð\92еÑ\80оÑ\8fÑ\82но, Ñ\8dÑ\82оÑ\82 Ñ\84айл â\80\94 Ñ\83менÑ\8cÑ\88еннаÑ\8f ÐºÐ¾Ð¿Ð¸Ñ\8f <em>(миниаÑ\82Ñ\8eÑ\80а)</em> Ñ\83же Ð¸Ð¼ÐµÑ\8eÑ\89егоÑ\81Ñ\8f Ñ\84айла. \n[[$1|thumb]]\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ñ\80овеÑ\80Ñ\8cÑ\82е Ñ\84айл <strong>[[:$1]]</strong>.\nÐ\95Ñ\81ли Ñ\8dÑ\82о Ñ\82о Ð¶Ðµ Ñ\81амое Ð¸Ð·Ð¾Ð±Ñ\80ажение, не стоит загружать отдельно его уменьшенную копию.",
        "file-thumbnail-no": "Название файла начинается с <strong>$1</strong>.\nВероятно, это уменьшенная копия изображения ''(миниатюра)''.\nЕсли у вас есть данное изображение в полном размере, пожалуйста, загрузите его или измените имя файла.",
        "fileexists-forbidden": "Файл с этим именем уже существует и не может быть перезаписан.\nЕсли всё равно хотите загрузить данный файл, пожалуйста, вернитесь назад и загрузите его под другим именем. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Файл с этим именем уже существует в общем хранилище файлов.\nЕсли вы всё-таки хотите загрузить этот файл, пожалуйста, вернитесь назад и измените имя файла. [[File:$1|thumb|center|$1]]",
-       "file-exists-duplicate": "Этот файл является дубликатом {{PLURAL:$1|1=следующего файла|следующих файлов}}:",
+       "file-exists-duplicate": "Этот файл — дубликат {{PLURAL:$1|1=следующего файла|следующих файлов}}:",
        "file-deleted-duplicate": "Подобный файл ([[:$1]]) уже удалялся. Пожалуйста, ознакомьтесь с историей удаления файла, прежде чем загружать его снова.",
        "file-deleted-duplicate-notitle": "Файл, идентичный этому файлу, был ранее удалён, а имя файла было запрещено.\nВам следует попросить кого-нибудь с правами просмотра данных по запрещённым файлам, чтобы он проанализировал ситуацию перед тем, как загружать файл снова.",
        "uploadwarning": "Предупреждение",
        "upload-options": "Параметры загрузки",
        "watchthisupload": "Следить за этим файлом",
        "filewasdeleted": "Файл с таким именем уже существовал ранее, но был удалён. Пожалуйста, проверьте $1 перед повторной загрузкой.",
-       "filename-bad-prefix": "Имя загружаемого файла начинается с «'''$1'''» и, вероятно, является одним из шаблонных имён, которые цифровые фотокамеры дают снимкам. Пожалуйста, выберите имя, лучше описывающее содержание файла.",
+       "filename-thumb-name": "Название файла похоже на название уменьшенной версии изображения. Пожалуйста, не загружайте подобные миниатюры обратно вики-проект. Если вам всё-таки необходим этот файл, пожалуйста, исправить имя файла, чтобы оно не содержало префикс миниатюры.",
+       "filename-bad-prefix": "Имя загружаемого файла начинается с «<strong>$1</strong>» и, вероятно, представляет собой одно из шаблонных имён, генерируемых цифровыми фотокамерами. Пожалуйста, выберите имя, лучше описывающее содержание файла.",
        "filename-prefix-blacklist": " #<!-- оставьте эту строчку как есть --> <pre>\n# Синтаксис следующий:\n#   * Всё, что начинается с символа «#», считается комментарием (до конца строки)\n#   * Каждая непустая строка — префикс стандартного названия файла, которое обычно даёт цифровая камера\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # некоторые мобильные телефоны\nIMG # общее\nJD # Jenoptik\nMGP # Pentax\nPICT # различные\n #</pre> <!-- оставьте эту строчку как есть -->",
        "upload-success-subj": "Загрузка успешно завершена",
        "upload-success-msg": "Ваша загрузка [$2] прошла успешно. Вы можете посмотреть результат здесь: [[:{{ns:file}}:$1]]",
        "upload-http-error": "Произошла ошибка HTTP: $1",
        "upload-copy-upload-invalid-domain": "Копирование загрузок не доступно в этом домене.",
        "upload-dialog-title": "Загрузить файл",
-       "upload-dialog-error": "Произошла ошибка",
-       "upload-dialog-warning": "Появилось предупреждение",
        "upload-dialog-button-cancel": "Отменить",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Сохранить",
        "upload-dialog-button-upload": "Загрузить",
-       "upload-dialog-label-select-file": "Выбрать файл",
-       "upload-dialog-label-infoform-title": "Подробности",
-       "upload-dialog-label-infoform-name": "Имя",
-       "upload-dialog-label-infoform-description": "Описание",
-       "upload-dialog-label-usage-title": "Использование",
-       "upload-dialog-label-usage-filename": "Имя файла",
+       "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": "Дата",
+       "foreign-structured-upload-form-label-own-work-message-default": "Я понимаю, что загружаю этот файл в общий репозиторий. Я подтверждаю, что я делаю это в соответствии с пользовательским соглашением и лицензионной политикой.",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Если вы не являетесь владельцем авторских прав на этот файл, или вы хотите выпустить его под другой лицензией, рассмотрите возможность использования [https://commons.wikimedia.org/wiki/Special:UploadWizard Мастера загрузки на Викисладе].",
        "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-invalidpath": "$1 — некорректный путь к хранилищу.",
        "backend-fail-delete": "Не удалось удалить файл  $1.",
        "backend-fail-describe": "Не удалось изменить метаданные файла «$1».",
        "backend-fail-alreadyexists": "Файл $1 уже существует.",
        "lockmanager-fail-svr-acquire": "Не удалось получить блокировку на сервере  $1.",
        "lockmanager-fail-svr-release": "Не удалось снять блокировки на сервере $1 .",
        "zip-file-open-error": "Произошла ошибка при открытии файла для проверки архива.",
-       "zip-wrong-format": "Указанный файл не является файлом ZIP.",
+       "zip-wrong-format": "Указанный файл — не ZIP-архив.",
        "zip-bad": "ZIP-файл повреждён или не может быть прочитан.\nОн не может быть должным образом проверен.",
        "zip-unsupported": "Этот ZIP-файл использует возможности, не поддерживаемые MediaWiki.\nОн не может быть должным образом проверен.",
        "uploadstash": "Скрытная загрузка",
        "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-public": "Назначение img_auth.php — вывод файлов из закрытой вики.\nЭта вики настроена как общедоступная.\nДля оптимизации безопасности img_auth.php отключена.",
        "img-auth-noread": "Участник не имеет доступа на чтение «$1».",
        "http-invalid-url": "Ошибочный URL: $1",
        "http-invalid-scheme": "Не поддерживаются адреса со схемой «$1»",
        "filerevert-legend": "Возвратить версию файла",
        "filerevert-intro": "<span class=\"plainlinks\">Вы возвращаете '''[[Media:$1|$1]]''' к [$4 версии от $3, $2].</span>",
        "filerevert-comment": "Причина:",
-       "filerevert-defaultcomment": "Возврат к версии от $2, $1",
+       "filerevert-defaultcomment": "Возврат к версии от $2, $1 ($3)",
        "filerevert-submit": "Возвратить",
        "filerevert-success": "'''[[Media:$1|$1]]''' был возвращён к [$4 версии от $3, $2].",
        "filerevert-badversion": "Не существует предыдущей локальной версии этого файла с указанной меткой времени.",
        "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": "Удаление",
        "rollbacklinkcount": "откатить $1 {{PLURAL:$1|правку|правки|правок}}",
        "rollbacklinkcount-morethan": "откатить больше, чем $1 {{PLURAL:$1|правку|правки|правок}}",
        "rollbackfailed": "Ошибка при совершении отката",
-       "cantrollback": "Ð\9dевозможно Ð¾Ñ\82каÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f. Ð\9fоÑ\81ледний, ÐºÑ\82о Ð²Ð½Ð¾Ñ\81ил Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f ÐµÐ´Ð¸Ð½Ñ\81Ñ\82веннÑ\8bм Ð°Ð²Ñ\82оÑ\80ом этой страницы.",
+       "cantrollback": "Ð\9dевозможно Ð¾Ñ\82каÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f. Ð\9fоÑ\81ледним, ÐºÑ\82о Ð²Ð½Ð¾Ñ\81ил Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, Ð±Ñ\8bл ÐµÐ´Ð¸Ð½Ñ\81Ñ\82веннÑ\8bй Ð°Ð²Ñ\82оÑ\80 этой страницы.",
        "alreadyrolled": "Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),\nпоскольку кто-то другой уже успел откатить эти правки или отредактировать страницу.\n\nПоследние изменения {{GENDER:$3|внёс|внесла}} [[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]]",
        "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Пожалуйста, прежде чем продолжать, убедитесь, что понимаете все возможные последствия.",
-       "movepagetext-noredirectfixer": "Воспользовавшись формой ниже, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.\nСтарое название станет перенаправлением на новое название.\nПожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].\nВы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.\n\nОбратите внимание, что страница <strong>не будет</strong> переименована, если страница с новым названием уже существует, кроме случаев, если она является перенаправлением или пуста и не имеет истории правок.\nЭто означает, что вы можете переименовать страницу обратно в то название, которое у него только что было, если вы переименовали по ошибке, но вы не можете случайно затереть существующую страницу.\n\n<strong>ПРЕДУПРЕЖДЕНИЕ!</strong>\nПереименование может привести к масштабным и неожиданным изменениям для популярных страниц.\nПожалуйста, прежде чем вы продолжите, убедитесь, что вы понимаете все возможные последствия.",
+       "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": "Присоединённая страница обсуждения будет также автоматически переименована, '''кроме случаев, когда:'''\n\n*Не пустая страница обсуждения уже существует под таким же именем или\n*Вы не поставили галочку в поле ниже.\n\nВ этих случаях, вы будете вынуждены переместить или объединить страницы вручную, если это нужно.",
-       "movearticle": "Переименовать страницу",
        "moveuserpage-warning": "'''Внимание.''' Вы собираетесь переименовать страницу участника. Пожалуйста, обратите внимание, что переименована будет только страница, участник '''не''' будет переименован.",
        "movecategorypage-warning": "<strong>Предупреждение:</strong> Вы собираетесь переименовать страницу категории. Пожалуйста, обратите внимание, что будет переименована только эта страница, а все страницы старой категории <em>не</em> будут перекатегоризованы в новую.",
        "movenologintext": "Вы должны [[Special:UserLogin|представиться системе]],\nчтобы иметь возможность переименовать страницы.",
        "cant-move-to-user-page": "У вас нет прав переименовывать страницу в страницу участника (можно переименовать в подстраницу).",
        "cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
        "cant-move-to-category-page": "У вас нет разрешения переименовывать страницы в страницу категории.",
-       "newtitle": "Новое название",
+       "newtitle": "Новое название:",
        "move-watch": "Включить эту страницу в список наблюдения",
        "movepagebtn": "Переименовать страницу",
        "pagemovedsub": "Страница переименована",
        "version-poweredby-others": "другие",
        "version-poweredby-translators": "переводчики translatewiki.net",
        "version-credits-summary": "Хотим поблагодарить следующих участников за их вклад в развитие [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki является свободным программным обеспечением, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить [{{SERVER}}{{SCRIPTPATH}}/COPYING копию GNU General Public License] вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочтите её онлайн].",
+       "version-license-info": "MediaWiki — свободное программное обеспечение, которое вы можете распространять и/или изменять в соответствии с условиями опубликованной Фондом свободного программного обеспечения лицензии GNU General Public License второй или любой более поздней версии (по вашему выбору).\n\nMediaWiki распространяется в надежде, что она будет полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить [{{SERVER}}{{SCRIPTPATH}}/COPYING копию GNU General Public License] вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочтите её онлайн].",
        "version-software": "Установленное программное обеспечение",
        "version-software-product": "Продукт",
        "version-software-version": "Версия",
        "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-warning": "Это действие <strong>необратимо</strong> и <strong>не может быть отменено</strong> даже администраторами базы данных. Вы должны быть уверены, что это действительно метка, которую вы хотите удалить.",
        "tags-delete-explanation-active": "<strong>Метка «$1» по-прежнему активна и будет по-прежнему применяться в будущем.</strong> Чтобы этого не происходило, перейдите туда, где установлено использование метки, и отключить её там.",
        "tags-delete-reason": "Причина:",
        "tags-delete-submit": "Безвозвратно удалить эту метку",
        "dberr-outofdate": "Но имейте в виду, что его индекс может оказаться устаревшим.",
        "dberr-cachederror": "Ниже представлена закэшированная версия запрашиваемой страницы, возможно, она не отражает последних изменений.",
        "htmlform-invalid-input": "Часть введённых вами данных вызвала проблемы",
-       "htmlform-select-badoption": "Указанное Ð²Ð°Ð¼Ð¸ Ð·Ð½Ð°Ñ\87ение Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имÑ\8bм.",
-       "htmlform-int-invalid": "Указанное вами значение не является целым числом.",
-       "htmlform-float-invalid": "Указанное Ð²Ð°Ð¼Ð¸ Ð·Ð½Ð°Ñ\87ение Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\87иÑ\81лом.",
+       "htmlform-select-badoption": "Указано Ð½ÐµÐ´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имое Ð·Ð½Ð°Ñ\87ение.",
+       "htmlform-int-invalid": "Указанное вами значение — не целое число.",
+       "htmlform-float-invalid": "Указано Ð½ÐµÑ\87иÑ\81ловое Ð·Ð½Ð°Ñ\87ение.",
        "htmlform-int-toolow": "Указанное вами значение ниже минимального — $1",
        "htmlform-int-toohigh": "указанное вами значение выше максимального — $1",
        "htmlform-required": "это значение необходимо",
        "htmlform-cloner-delete": "Удалить",
        "htmlform-cloner-required": "Требуется по крайней мере одно значение.",
        "htmlform-title-badnamespace": "[[:$1]] находится не в пространстве имён «{{ns:$2}}».",
-       "htmlform-title-not-creatable": "«$1» не является создаваемым заголовком страницы",
+       "htmlform-title-not-creatable": "«$1» — заголовок страницы, которая не может быть создана",
        "htmlform-title-not-exists": "[[:$1]] не существует.",
        "htmlform-user-not-exists": "<strong>$1</strong> не существует.",
-       "htmlform-user-not-valid": "<strong>$1</strong> не является допустимым именем пользователя.",
+       "htmlform-user-not-valid": "<strong>$1</strong> — недопустимое имя учётной записи.",
        "sqlite-has-fts": "$1 с поддержкой полнотекстового поиска",
        "sqlite-no-fts": "$1 без поддержки полнотекстового поиска",
        "logentry-delete-delete": "$1 {{GENDER:$2|удалил|удалила}} страницу $3",
        "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||а}} автоматически переведен{{GENDER:$2||а}} из $4 в $5",
        "api-error-badaccess-groups": "Вам не разрешено загружать файлы в эту вики.",
        "api-error-badtoken": "Внутренняя ошибка:  некорректный токен.",
        "api-error-copyuploaddisabled": "Загрузка по URL-адресу отключена на этом сервере.",
-       "api-error-duplicate": "Уже {{PLURAL:$1|1=существует [$2 другой файл]|существуют [$2 другие файлы]}} с таким же содержимым",
-       "api-error-duplicate-archive": "Раньше на сайте {{PLURAL:$1|1=уже был [$2 файл]|были [$2 файлы]}} с точно таким же содержанием, но {{PLURAL:$1|1=он был удалён|они были удалены}}.",
-       "api-error-duplicate-archive-popup-title": "Дубликаты {{PLURAL:$1|1=файла|файлов}}, которые уже были удалены.",
-       "api-error-duplicate-popup-title": "Дубликат {{PLURAL:$1|1=файла|файлов}}.",
+       "api-error-duplicate": "Уже {{PLURAL:$1|существует другой файл|существуют другие файлы}} с таким же содержимым.",
+       "api-error-duplicate-archive": "Раньше на сайте {{PLURAL:$1|1=уже был файл|были файлы}} с точно таким же содержанием, но {{PLURAL:$1|1=он был удалён|они были удалены}}.",
        "api-error-empty-file": "Отправленный вами файл пуст.",
        "api-error-emptypage": "Не допускается создание новых пустых страниц.",
        "api-error-fetchfileerror": "Внутренняя ошибка: что-то пошло не так при получении файла.",
index 68cd2e9..ca68fa2 100644 (file)
@@ -10,7 +10,8 @@
                        "Tkalyn",
                        "아라",
                        "Dicto23456",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Підкреслёвати одказы:",
        "mergehistory-go": "Вказати злучітельны едітації",
        "mergehistory-submit": "Споїти ревізії",
        "mergehistory-empty": "Не дають ся споїти жадны ревізії.",
-       "mergehistory-success": "$3 {{PLURAL:$3|ревізія|ревізії|ревізійí}} сторінкы [[:$1]] {{PLURAL:$3|была успішно злучена|были успішно злучены|было успішно злуґено}} до сторінкы [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ревізія|ревізії|ревізійí}} сторінкы $1 {{PLURAL:$3|была успішно злучена|были успішно злучены|было успішно злуґено}} до сторінкы [[:$2]].",
        "mergehistory-fail": "Злучіня історій ся не дасть зробити. Перевірте заданы сторінкы і їх історії",
        "mergehistory-no-source": "Жрідлова сторінка $1 не існує.",
        "mergehistory-no-destination": "Цілёва сторінка «$1» не екзістує.",
        "filerevert-legend": "Вернути назад файл",
        "filerevert-intro": "Вертате назад '''[[Media:$1|$1]]''' на [$4 верзію з $3 $2].",
        "filerevert-comment": "Причіна:",
-       "filerevert-defaultcomment": "Навернута верзії з $2 дня $1.",
+       "filerevert-defaultcomment": "Навернута верзії з $2 дня $1 ($3)",
        "filerevert-submit": "Вернути назад",
        "filerevert-success": "Файл '''[[Media:$1|$1]]''' быв вернутый назад на [$4 верзію з $3 $2].",
        "filerevert-badversion": "Не є доступна попередня верзія того файлу з одоповідаючов часовов значков.",
        "movepagetext": "Хоснувчі форму ниже, можете переменовати сторінку, такой перемістивши на нове місце і лоґ єй едітовань.\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": "Асоціована діскузна сторінка буде автоматічно переменована, '''окрем:'''\n* Непорожня сторінка діскузії з таков назвов уж екзістує або\n* Не означіли сьте в полічку ниже.\n\nВ тых припадох будете мусити переменовати ці злучіти сторінкы ручнї кідь желаєте єй переменованя.",
-       "movearticle": "Переменовати сторінку",
        "moveuserpage-warning": "'''Увага:''' Рихтуєте ся переменовати сторінку хоснователя. Усвідомте собі, же буде переменована лем тота сторінка, а хоснователь  ''не буде'' переменованый.",
        "movenologintext": "Про переменованя сторінок ся мусите [[Special:UserLogin|приголосити]].",
        "movenotallowed": "Не маєте права переменовати сторінкы.",
        "api-error-badaccess-groups": "Не мате дозволено наладововати файлы на тоту вікі.",
        "api-error-badtoken": "Внутрїшня хыба: планый знак.",
        "api-error-copyuploaddisabled": "Наладовованя з URL є на тім сервері заказане.",
-       "api-error-duplicate": "На тій вікі уж {{PLURAL:$1|екзістує [$2 другый файл]|екзістують [$2 іншы файлы]}} з такым самым обсягом.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|быв [$2 другый файл]|были [$2 даякы другы файлы]}} з такым самым обсягом уж гев оперед {{PLURAL:$1|быв|были}}, але {{PLURAL:$1|быв змазаный|были змазаны}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|дупліцітный файл, якый быв|дупліцітны файл, як были}} змазаны",
-       "api-error-duplicate-popup-title": "Дупліцітны {{PLURAL:$1|файл|файлы}}",
+       "api-error-duplicate": "На тій вікі уж {{PLURAL:$1|екзістує другый файл|екзістують іншы файлы}} з такым самым обсягом.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|быв другый файл|были даякы другы файлы}} з такым самым обсягом уж гев оперед {{PLURAL:$1|быв|были}}, але {{PLURAL:$1|быв змазаный|были змазаны}}.",
        "api-error-empty-file": "Наладованый файл є порожнїй.",
        "api-error-emptypage": "Створїня новых, порожнїх сторінк неслободно.",
        "api-error-fetchfileerror": "Внутрїшня хыба: трафила ся хыба під час обтриманя файлу.",
index c2a9b0b..b3b6185 100644 (file)
@@ -21,7 +21,8 @@
                        "Vibhijain",
                        "రాకేశ్వర",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "परिसन्धेः अधो रेखाङ्कनम्:",
        "mergehistory-go": "विलीनयोग्यसम्पादनानि दर्शयतु",
        "mergehistory-submit": "संस्करणानि विलीनीकरोतु ।",
        "mergehistory-empty": "अवतरणानि संयोजयितुं न शक्यते ।",
-       "mergehistory-success": "[[:$1]] इत्यस्य $3 {{PLURAL:$3|संस्करणं|संस्करणानि}} [[:$2]] इत्यत्र स्वस्ति (successfully) विलिनीकृतानि ।",
+       "mergehistory-done": "$1 इत्यस्य $3 {{PLURAL:$3|संस्करणं|संस्करणानि}} [[:$2]] इत्यत्र स्वस्ति (successfully) विलिनीकृतानि ।",
        "mergehistory-fail": "इतिहासविलीनता नैव शक्यते । पृष्ठसम्बद्धानि, कालसम्बद्धानि विकल्पानि पुनः पश्यतु ।",
        "mergehistory-fail-toobig": "इतिहासस्य विलयः असम्भवः अस्ति, यतः संस्करणसीमायाः $1 अधिक{{PLURAL:$1|संस्करणं स्थानान्तरितं करिणीयं भविष्यति|संस्करणानि स्थानान्तरितकरणीयानि भविष्यन्ति}} ।",
        "mergehistory-no-source": "$1 इति स्रोतपृष्ठं न विद्यते ।",
        "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अस्मिन् विषये यदि इच्छति तर्हि भवता पुटानि चालनीयानि अथवा संयोजनीयानि ।",
-       "movearticle": "शीर्षकं परिवर्त्यताम् :",
        "moveuserpage-warning": "पूर्वसूचना : योजकपृष्ठं चालयितुम् उद्युक्तः । स्मरतु केवलं पृष्ठं स्थानान्तरितं भवति न तु योजकनाम परिवर्तनं न भविष्यति ।",
        "movecategorypage-warning": "<strong>पूर्वसूचना :</strong> भवान्/भवती वर्गं स्थानान्तरितं कर्तुम् इच्छति । अतः जानातु यत्, केवलं पृष्ठं स्थानान्तरितं भविष्यति पृष्ठे विद्यमानानि पुरातनवर्गाः परिवर्तिताः <em>न</em> भविष्यन्ति ।",
        "movenologintext": " [[Special:UserLogin|logged in]] पञ्जीकृतयोजकः भवता नामाभिलेखनं करणीयं भवति ।",
        "api-error-badaccess-groups": "भवान् अस्यां वीक्यां सञ्चिकाः उत्तारयितुम् नानुमतः ।",
        "api-error-badtoken": "आन्तरिकदोषः : दुष्टप्रतीकः ।",
        "api-error-copyuploaddisabled": "अस्मिन् वितारके युआर् एल् द्वारा उत्तारणं निष्क्रियम् ।",
-       "api-error-duplicate": "{{PLURAL:$1| [ $2 अन्यसञ्चिकाः] | सन्ति [ $2 काश्चन अन्यसञ्चिकाः]}} एकस्मिन् एव ।",
-       "api-error-duplicate-archive": "तत्र {{PLURAL:$1|आसीत् [$2 काश्चन अन्यसञ्चिकाः] |  [$2काचन अन्यसञ्चिकाः]}}, पूर्वमेव {{PLURAL:$1|यह was|they आसन्}} किन्तु अपनीताः ।",
-       "api-error-duplicate-archive-popup-title": "द्विप्रतिः {{PLURAL:$1| सञ्चिका |सञ्चिकाः}} पूर्वमेव अपमर्जिताः ।",
-       "api-error-duplicate-popup-title": "द्विप्रतिः {{PLURAL:$1| सञ्चिका| सञ्चिकाः}}",
+       "api-error-duplicate": "{{PLURAL:$1| अन्यसञ्चिकाः | सन्ति काश्चन अन्यसञ्चिकाः}} एकस्मिन् एव ।",
+       "api-error-duplicate-archive": "तत्र {{PLURAL:$1|आसीत् काश्चन अन्यसञ्चिकाः|काचन अन्यसञ्चिकाः}}, पूर्वमेव {{PLURAL:$1|यह was|they आसन्}} किन्तु अपनीताः ।",
        "api-error-empty-file": "समर्पिता सञ्चिका रिक्ता आसीत् ।",
        "api-error-emptypage": "नूतनस्य रिक्तस्य पृष्ठस्य सर्जनं निषिद्धम् ।",
        "api-error-fetchfileerror": "आन्तरिकदोषः : सञ्चिकायाः प्राप्त्यवसरे कश्चन दोषः जातः ।",
index a99505a..2e4da2c 100644 (file)
@@ -12,7 +12,8 @@
                        "아라",
                        "Purodha",
                        "Krivoshapkina",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Сигэлэри аннынан тардыы:",
        "nstab-template": "Халыып",
        "nstab-help": "Көмө",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Сүрүн сирэй",
        "nosuchaction": "Маннык дьайыы суох",
        "nosuchactiontext": "Бу URL-га баар дьайыы сыыһалаах.\nБаҕар URL суруйарга алҕаһаабытыҥ буолуо эбэтэр сыыһалаах сигэннэн тахсыбытыҥ буолуо.\n{{SITENAME}} бэйэтин сыыһата эмиэ буолуон сөп.",
        "nosuchspecialpage": "Маннык анал сирэй суох",
        "createacct-captcha": "Куттал суох буолуутун тургутуу",
        "createacct-imgcaptcha-ph": "Үөһэ көстөрү хатылаа",
        "createacct-submit": "Бэлиэтэнии",
-       "createacct-another-submit": "Ð\90Ñ\82Ñ\8bн Ð°Ð°Ñ\82Ñ\8bнан Ð±элиэтэн",
+       "createacct-another-submit": "Ð\91элиэтэн",
        "createacct-benefit-heading": "{{SITENAME}} ситим-сири эн курдук дьон оҥороллор.",
        "createacct-benefit-body1": "{{PLURAL:$1|уларытыы|уларытыы}}",
        "createacct-benefit-body2": "{{PLURAL:$1|сирэй|сирэй}}",
        "passwordreset-emailsent": "Киирии тылы уларытар туһунан сурук барда.",
        "passwordreset-emailsent-capture": "Киирии тылы уларытар туһунан сурук аллара эмиэ көрдөрүлүннэ.",
        "passwordreset-emailerror-capture": "Манна киирии тылы уларытар туһунан сурук көрдөрүлүннэ. Ол эрэн сурук бу төрүөттэн $2 кыттааччыга сатаан барбата: $1",
-       "changeemail": "Ð\90аадÑ\8bÑ\80Ñ\8bÒ»Ñ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82",
-       "changeemail-text": "Ð\91Ñ\83 Ñ\84оÑ\80манÑ\8b Ñ\82олоÑ\80он Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÑ\81кÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82. Ð£Ð»Ð°Ñ\80Ñ\8bÑ\82Ñ\8bÑ\8bнÑ\8b Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82Ñ\8dÑ\80гÑ\8d ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн ÐºÐ¸Ð»Ð»Ñ\8dÑ\80иÑ\8dÑ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин.",
+       "changeemail": "Ð\90адÑ\8bÑ\80Ñ\8bÒ»Ñ\8b Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ñ\83онна Ñ\81оÑ\82Ñ\83Ñ\83",
+       "changeemail-text": "Ð\91Ñ\83 Ñ\84оÑ\80манÑ\8b Ñ\82олоÑ\80он Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÑ\81кÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82. Ð£Ð»Ð°Ñ\80Ñ\8bÑ\82Ñ\8bÑ\8bнÑ\8b Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82Ñ\8dÑ\80гÑ\8d Ð°Ò»Ð°Ñ\80Ñ\8bккÑ\8bн ÐºÐ¸Ð»Ð»Ñ\8dÑ\80иÑ\8dÑ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин. Ð\9fоÑ\87Ñ\82аҥ Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8bÑ\82Ñ\82ан Ð±Ñ\8dлиÑ\8d-ааккÑ\8bÑ\82Ñ\82ан Ð°Ñ\80ааÑ\80Ñ\8bаÑ\85Ñ\85Ñ\8bн Ð±Ð°Ò\95аÑ\80аÑ\80 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Ñ\81оÑ\82он Ð±Ð°Ñ\80ан Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82Ñ\8dн ÐºÑ\8dбиһÑ\8dÑ\8dÑ\80.",
        "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": "Сотуллар токен суох эбит.",
        "mergehistory-go": "Силлэһиилэр уларыйыыларын көрдөр",
        "mergehistory-submit": "Силлэһии барыллара",
        "mergehistory-empty": "Биир да барыл силлиһэр кыаҕа суох.",
-       "mergehistory-success": "$3 {{PLURAL:$3|барыл|барыллар}} [[:$1]] биир [[:$2]] барылга силлистилэр.",
+       "mergehistory-done": "$3 {{PLURAL:$3|барыл|барыллар}} $1 биир [[:$2]] барылга силлистилэр.",
        "mergehistory-fail": "Сирэй устуоруйалара кыайан холбоспотулар, өссө биирдэ торумнар бириэмэлэрин уонна сирэй параметрдарын бэрэбиэркэлээ.",
        "mergehistory-fail-toobig": "Устуоруйаны холбуур табыллыбата, тоҕо диэтэххэ $1  барылга көҥүллэнэр лимииттэн элбэҕи көһөрөр наада эбит.",
        "mergehistory-no-source": "Бастакы $1 сирэй суох.",
        "upload-dialog-button-done": "Оҥоһулунна",
        "upload-dialog-button-save": "Бигэргэт",
        "upload-dialog-button-upload": "Киллэрии",
-       "upload-dialog-label-select-file": "Билэни тал",
-       "upload-dialog-label-infoform-title": "Сиһилии",
-       "upload-dialog-label-infoform-name": "Аата",
-       "upload-dialog-label-infoform-description": "Быһаарыыта",
-       "upload-dialog-label-usage-title": "Туһаныы",
-       "upload-dialog-label-usage-filename": "Билэ аата",
+       "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": "Билэ аата",
        "backend-fail-stream": "$1 билэни ыытар табыллыбата.",
        "backend-fail-backup": "Бу билэ $1 резервнэй куопуйатын оҥорор табыллыбата.",
        "backend-fail-notexists": "Маннык $1 билэ суох эбит.",
        "filerevert-legend": "Билэни төннөр",
        "filerevert-intro": "Эн бу билэни  '''[[Media:$1|$1]]'''  [$4 торумҥа от $3, $2] төннөрөҕүн.",
        "filerevert-comment": "Төрүөтэ:",
-       "filerevert-defaultcomment": "Торумҥа төннүү $2, $1",
+       "filerevert-defaultcomment": "Торумҥа төннүү $2, $1 ($3)",
        "filerevert-submit": "Төннөрүү",
        "filerevert-success": "'''[[Media:$1|$1]]''' бу торумҥа төннөрүлүннэ [$4 торум Filetype-missingот $3, $2].",
        "filerevert-badversion": "Бу билэ этиллибит күҥҥэ-ыйга/кэмҥэ оҥоһуллубут урукку торума суох.",
        "booksources-text": "Манна кинигэ туһунан атын саайтарга ыйынньыктар хомулуннулар, онно баҕар эбии информация көстүөҕэ.",
        "booksources-invalid-isbn": "ISBN, арааһа, сыыһалаах. Нүөмэр көһөрөргө алҕас тахсыбатаҕын хат көр эрэ.",
        "specialloguserlabel": "Толорооччу:",
-       "speciallogtitlelabel": "Сорук (тиэкис эбэтэр киһи аата)",
+       "speciallogtitlelabel": "Сыал (тиэкис эбэтэр {{ns:user}}:кыттааччы аата):",
        "log": "Сурунааллар",
        "all-logs-page": "Көстөр сурунааллар барыта",
        "alllogstext": "{{SITENAME}} сурунаалларын уопсай испииһэгэ.\nСурунаал көрүҥүнэн, кыттааччы аатынан (улахан-кыра буукубата учуоттанар) эбэтэр сирэй аатынан (эмиэ улахана-кырата учуоттанар) наардыаххытын сөп.",
        "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": "Холбонуллубут ырытыы (баар буоллаҕына) эмиэ аатын уларытыа. Ол сатаммат түбэлтэлэрэ:\n*Маннык ааттаах кураанах буолбатах ырытыы баар буоллаҕына\n*Манна бэлиэ туруорбатаххына.\n\nИти түгэннэргэ сирэйдэри бэйэҥ көһөрүөхтээххин эбэтэр холбуохтааххын.",
-       "movearticle": "Бу аатын уларыт:",
        "moveuserpage-warning": "'''Болҕой:''' Эн кыттааччы тус сирэйин аатын уларытаары гынныҥ. Инньэ гыннаххына сирэй аата эрэ уларыйыа, кыттааччы бэйэтин аата уларыйыа '''суоҕа'''.",
        "movecategorypage-warning": "<strong>Сэрэтии:</strong> Категория сирэйин көһөрөөрү гынныҥ. Бука диэн, өйдөө, бу эрэ сирэй көһүө, эргэ категория атын сирэйдэрэ саҥа категорияҕа <em>киириэхтэрэ суоҕа</em>.",
        "movenologintext": "Эн аакын [[Special:UserLogin|билиһиннэрдэххинэ]] эрэ сирэй аатын уларытар кыахтаныаҥ.",
        "api-error-badaccess-groups": "Эн бу биикигэ билэ киллэрэриҥ хааччахтаммыт.",
        "api-error-badtoken": "Ис алҕас: Омсолоох токен.",
        "api-error-copyuploaddisabled": "URL көмөтүнэн киллэрии бу сиэрбэргэ араарыллыбыт.",
-       "api-error-duplicate": "Маннык иһинээҕилээх {{PLURAL:$1|[$2 атын билэ] баар эбит}}",
-       "api-error-duplicate-archive": "Урут ситим-сиргэ маннык иһинээҕилээх {{PLURAL:$1|[$2 билэ] баар |[$2 билэлэр] бааллар}} этэ, ол гынан баран {{PLURAL:$1|сотуллубута|сотуллубуттара}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Билэ|Билэлэр}} сотуллубут дубликааттара",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Билэ|Билэлэр}} дубликааттара.",
+       "api-error-duplicate": "Маннык иһинээҕилээх {{PLURAL:$1|атын билэ баар эбит}}",
+       "api-error-duplicate-archive": "Урут ситим-сиргэ маннык иһинээҕилээх {{PLURAL:$1|билэ баар|билэлэр бааллар}} этэ, ол гынан баран {{PLURAL:$1|сотуллубута|сотуллубуттара}}.",
        "api-error-empty-file": "Ыыппыт билэҥ кураанах.",
        "api-error-emptypage": "Саҥа кураанах сирэйи оҥорор табыллыбат.",
        "api-error-fetchfileerror": "Ис алҕас: билэни ыларга туох эрэ сатаммата.",
        "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": "JSON иһиттэн $1 ордук соппутуой сотуллубут",
+       "json-error-unknown": "JSON моһуогурбут. Алҕас: $1",
+       "json-error-depth": "Стек муҥутуур дириҥэ аһарыллыбыт",
+       "json-error-state-mismatch": "Сатаммат эбэтэр алҕастаах JSON",
+       "json-error-ctrl-char": "Салайар бэлиэ алҕастаах, баҕар кодировката сыыһа буолуо",
+       "json-error-syntax": "Синтаксис алҕаһа",
+       "json-error-utf8": "UTF-8 бэлиэлэрэ алҕастаахтар, баҕар сыыһа кодировка буолуо",
+       "json-error-recursion": "Суолтаҕа биир дуу, хас да дуу рекурс сигэ куодтаныахтаах",
+       "json-error-inf-or-nan": "NAN эбэтэр INF биир дуу, хас да дуу суолталара куодтаныахтаах",
+       "json-error-unsupported-type": "Куодтаммат көрүҥнээх суолта ыйыллыбыт эбит",
        "headline-anchor-title": "Бу салааҕа сигэнии",
        "special-characters-group-latin": "Латыынныы",
        "special-characters-group-latinextended": "Латыынныы кэтирэтиллибиттэр",
        "special-characters-group-khmer": "Кхмер",
        "special-characters-title-endash": "орто тире",
        "special-characters-title-emdash": "уһун тире",
-       "special-characters-title-minus": "минус бэлиэтэ"
+       "special-characters-title-minus": "минус бэлиэтэ",
+       "mw-widgets-dateinput-no-date": "Күнэ-дьыла ыйыллыбатах",
+       "mw-widgets-titleinput-description-new-page": "сирэй суох эбит",
+       "mw-widgets-titleinput-description-redirect": "манна $1 утаарыы"
 }
index e4bc1dc..cc47cc0 100644 (file)
@@ -20,7 +20,7 @@
        "tog-underline": "Suttalìnia li lijami:",
        "tog-hideminor": "Ammuccia li canciamenti nichi nta l'ùrtimi canciamenti",
        "tog-hidepatrolled": "Ammuccia li canciamenti virificati nta l'ùrtimi canciamenti",
-       "tog-newpageshidepatrolled": "Ammuccia li pàggini battugghiati di l'alencu dî pàggini cchiu' novi",
+       "tog-newpageshidepatrolled": "Ammuccia li pàggini virificati di l'elencu dî pàggini cchiù novi",
        "tog-extendwatchlist": "Ammustra tutti li canciamenti ntâ lista taliata, nun sulu lu cchiù ricenti",
        "tog-usenewrc": "Raggruppa li canciamenti pi pàggina ntâ lista dî canciamenti ricenti e ntâ lista taliata",
        "tog-numberheadings": "Nummirazzioni autumàtica dî tìtuli di paràgrafu",
@@ -42,7 +42,7 @@
        "tog-shownumberswatching": "Ammustra lu nùmmiru d'utenti ca talìanu la pàggina",
        "tog-oldsig": "Firma attuali:",
        "tog-fancysig": "Ntèrprita la firma comu wikitestu (senza liami automàticu)",
-       "tog-uselivepreview": "Attiva l'antiprima in diretta",
+       "tog-uselivepreview": "Attiva l'antiprima n diretta",
        "tog-forceeditsummary": "Addumanna cunferma siddu lu riassuntu dûn canciamentu è vacanti",
        "tog-watchlisthideown": "Ammuccia li mè canciamenti ntâ lista taliata",
        "tog-watchlisthidebots": "Ammuccia li canciamenti dî bot ntâ lista taliata",
        "tog-ccmeonemails": "Mànnami na copia dî missaggi spiduti a l'àutri utenti",
        "tog-diffonly": "Nun ammustrari lu cuntinutu dî pàggini sutta dî cunfrunti tra virsioni",
        "tog-showhiddencats": "Ammustra li catigurìi ammucciati",
-       "tog-norollbackdiff": "Nun ammustrari u cunfruntu tra virsioni doppu aviri fattu nu canciu n'arreri",
-       "tog-useeditwarning": "Avvèrtimi quannu mi nni vaju di na pàggina cu' canciamenti nun sarvati",
+       "tog-norollbackdiff": "Nun ammustrari lu cunfruntu tra virsioni doppu aviri fattu nu canciu n'arreri",
+       "tog-useeditwarning": "Avvèrtimi quannu mi nni vaiu di na pàggina cu canciamenti nun sarvati",
        "tog-prefershttps": "Adòpira sempri na cunnissioni sicura quannu trasisti",
        "underline-always": "Sempri",
        "underline-never": "Mai",
        "underline-default": "Mpustazzioni pridifinuta dâ peddi o dû browser",
        "editfont-style": "Stili dû caràttiri dâ casedda di canciamentu:",
        "editfont-default": "Pridifinutu dô browser",
-       "editfont-monospace": "Tipu di caràttiri a' larghizza fissa",
+       "editfont-monospace": "Tipu di caràttiri a larghizza fissa",
        "editfont-sansserif": "Tipu di caràttiri senza grazzî",
-       "editfont-serif": "Tipu di caràttiri cu' grazzî",
+       "editfont-serif": "Tipu di caràttiri cu grazzî",
        "sunday": "Duminicadìa",
        "monday": "Lunidìa",
        "tuesday": "Martidìa",
        "moredotdotdot": "Àutru...",
        "morenotlisted": "Sta lista è ncumpreta",
        "mypage": "Pàggina",
-       "mytalk": "La me pàggina di discussioni",
+       "mytalk": "La mè pàggina di discussioni",
        "anontalk": "Discussioni di stu nnirizzu IP",
        "navigation": "Navigazzioni",
        "and": "&#32;e",
        "help": "Guida",
        "search": "Arricerca",
        "searchbutton": "Va arricerca",
-       "go": "Trova",
+       "go": "Attrova",
        "searcharticle": "Vai",
        "history": "Crunuluggìa dâ pàggina",
        "history_short": "Crunuluggìa",
        "viewhelppage": "Talìa la pàggina dâ guida",
        "categorypage": "Talìa la catigurìa",
        "viewtalkpage": "Talìa la discussioni",
-       "otherlanguages": "Nta autri lingui",
-       "redirectedfrom": "(Rimannu a' pàrtiri di $1)",
+       "otherlanguages": "Nta àutri lingui",
+       "redirectedfrom": "(Rimannu a pàrtiri di $1)",
        "redirectpagesub": "Pàggina di rimannu",
        "redirectto": "Rimanna a:",
        "lastmodifiedat": "Sta pàggina fu canciata l'ùrtima vota a li $2 di lu $1.",
        "protectedpage": "Pàggina prutetta",
        "jumpto": "Vai a:",
        "jumptonavigation": "navigazzioni",
-       "jumptosearch": "cerca",
+       "jumptosearch": "arricerca",
        "view-pool-error": "Ni dispiaci, ma li server nta stu mumentu sunnu troppu càrrichi.\nTroppi utenti stannu circannu di taliari sta pàggina.\nPi favuri aspetta n'anticchia prima di pruvari n'àutra vota a taliari sta pàggina.\n\n$1",
        "generic-pool-error": "Ni dispiaci, ma li server nta stu mumentu sunnu troppu càrrichi.\nTroppi utenti stannu circannu di taliari sta risorsa.\nPi favuri aspetta n'anticchia prima di pruvari n'àutra vota a taliari sta risorsa.",
        "pool-timeout": "Tempu scadutu aspittannu lu sbloccu",
        "pool-errorunknown": "Erruri scanusciutu",
        "pool-servererror": "Lu sirvizziu di cuntaturi dî pool nun è dispunìbbili ($1)",
        "poolcounter-usage-error": "Erruri d'utilizzu: $1",
-       "aboutsite": "Nfurmazzioni supra a' {{SITENAME}}",
-       "aboutpage": "Project:Àutri nformazzioni",
+       "aboutsite": "Nfurmazzioni supra a {{SITENAME}}",
+       "aboutpage": "Project:Àutri nfurmazzioni",
        "copyright": "Lu cuntinutu è utilizzàbbili secunnu la $1, sarvu minzioni cuntraria.",
        "copyrightpage": "{{ns:project}}:Copyright",
        "currentevents": "Nutizzî",
        "privacy": "Pulìtica supra la privacy",
        "privacypage": "Project:Pulìtica rilativa â privacy",
        "badaccess": "Erruri di pirmissu",
-       "badaccess-group0": "Nun hai lu pirmissu p'esèquiri l'azzioni chi' hai addumannatu.",
+       "badaccess-group0": "Nun hai lu pirmissu p'esèquiri l'azzioni chi addumannasti.",
        "badaccess-groups": "La funzioni addumannata è risirvata a l'utenti ca appartèninu {{PLURAL:$2|ô gruppu|a unu dî gruppi siquenti}}: $1.",
        "versionrequired": "È nicissaria la virsioni $1 dû software MediaWiki",
        "versionrequiredtext": "P'usari sta pàggina ci voli la virsioni $1 dû software MediaWiki. Talìa [[Special:Version|sta pàggina]]",
        "ok": "Va bonu",
        "retrievedfrom": "Estrattu di \"$1\"",
-       "youhavenewmessages": "Arricivisti $1 ($2).",
-       "youhavenewmessagesfromusers": "Arricivisti $1 di {{PLURAL:$3|n'àutru utenti|$3 utenti}} ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Arricivisti}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Arricivisti}} $1 di {{PLURAL:$3|n'àutru utenti|$3 utenti}} ($2).",
        "youhavenewmessagesmanyusers": "Arricivisti $1 di tanti utenti ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|nu missaggiu novu|999=missaggi novi}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtimu canciamentu|999=ùrtimi canciamenti}}",
        "hidetoc": "ammuccia",
        "collapsible-collapse": "Strinci",
        "collapsible-expand": "Allarga",
-       "confirmable-confirm": "Si' {{GENDER:$1|sicuru|sicura}}?",
+       "confirmable-confirm": "Sî {{GENDER:$1|sicuru|sicura}}?",
        "confirmable-yes": "Sì",
        "confirmable-no": "No",
        "thisisdeleted": "Vidi e/o riprìstina $1?",
        "nstab-template": "Template",
        "nstab-help": "Pàggina di guida",
        "nstab-category": "Catigurìa",
+       "mainpage-nstab": "Pàggina principali",
        "nosuchaction": "Opirazzioni nun ricanusciuta",
        "nosuchactiontext": "L'azzioni spicificata nâ URL nun è vailida.\nPoi aviri sbagghiatu a digitari â URL, o cliccatu supra nu link sbagghiatu.\nChistu putissi ndicari nu bug nô software usatu da {{SITENAME}}.",
        "nosuchspecialpage": "Sta pàggina spiciali nun è dispunìbbili",
-       "nospecialpagetext": "<strong>Hai cercatu na pàggina spiciali nun vàlida.</strong>\n\nL'alencu dî pàggini spiciali vàlidi s'attrova 'n [[Special:SpecialPages|Alencu dî pàggini spiciali]].",
+       "nospecialpagetext": "<strong>Arricircasti na pàggina spiciali nun vàlida.</strong>\n\nL'elencu dî pàggini spiciali vàlidi s'attrova n [[Special:SpecialPages|Elencu dî pàggini spiciali]].",
        "error": "Erruri",
        "databaseerror": "Erruri dû database",
        "databaseerror-text": "Si virificau n'erruri nti na dimanna dû databbasi.\nPutissi siri ca c'è nu bacu ntô prugramma.",
        "filerenameerror": "Nun fu pussìbbili canciari lu nomu dû file di \"$1\" a \"$2\".",
        "filedeleteerror": "Nun fu pussìbbili cancillari lu file \"$1\".",
        "directorycreateerror": "Nun fu pussìbbili criari la cartella \"$1\".",
-       "directoryreadonlyerror": "La cartella \"$1\" è a' sula littura.",
+       "directoryreadonlyerror": "La cartella \"$1\" è n littura sula.",
        "directorynotreadableerror": "La cartella \"$1\" nun è liggìbbili.",
        "filenotfound": "Nun fu pussìbbili attruvari lu file \"$1\".",
        "unexpected": "Valuri nun privistu: \"$1\"=\"$2\".",
        "title-invalid-magic-tilde": "Lu tìtulu addumannatu pâ pàggina cunteni na siguenza màggica di tildi nun vàlida(<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Lu tìtulu addumannatu pâ pàggina è troppu longu. Nun havi a èssiri cchiù longu di {{PLURAL:$1|byte}} sutta cudìfica UTF-8.",
        "title-invalid-leading-colon": "Lu tìtulu addumannatu pâ pàggina cunteni nu signu di dui punti ô principiu, chi nun è vàlidu.",
-       "perfcached": "Li dati ca sèquinu sunnu stratti di na ''cache'' e putissiru nun èssiri aggiurnati. Ntâ ''cache'' {{PLURAL:$1|capi un risultatu|càpunu $1 risultati}} massimu.",
-       "perfcachedts": "Li dati ca sèquinu sunnu stratti di na ''cache'', e furu aggiurnati l'ultima vota ô $1. Ntâ ''cache'' {{PLURAL:$4|capi un risultatu|capunu $4 risultati}} massimu.",
+       "perfcached": "Li dati ca sèquinu sunnu stratti di na ''cache'' e putìssiru nun èssiri aggiurnati. Ntâ ''cache'' {{PLURAL:$1|capi un risurtatu|càpinu $1 risurtati}} màssimu.",
+       "perfcachedts": "Li dati ca sèquinu sunnu stratti di na ''cache'', e foru aggiurnati l'ùrtima vota ô $1. Ntâ ''cache'' {{PLURAL:$4|capi un risurtatu|càpinu $4 risurtati}} màssimu.",
        "querypage-no-updates": "L'aggiurnamenti dâ pàggina sunnu timpuraniamenti suspisi. Li dati 'n chidda cuntinuti nun vèninu aggiurnati.",
-       "viewsource": "Talìa lu surgenti",
-       "viewsource-title": "Talìa lu surgenti di $1",
+       "viewsource": "Talìa la surgenti",
+       "viewsource-title": "Talìa la surgenti di $1",
        "actionthrottled": "Azzioni ritardata",
        "actionthrottledtext": "Comu misura di sicurezza contru lu spam, l'esecuzioni di alcuni azzionu è limitata a nu nùmmuru massimu di voti ni nu determinatu piriudu du tempu, limiti ca ni stu casu fu supiratu. Si prega di ripruvari tra qualchi minutu.",
-       "protectedpagetext": "Sta pàggina fu bluccata pi privèniri canciamenti o autri opirazzioni.",
+       "protectedpagetext": "Sta pàggina fu bluccata pi privèniri canciamenti o àutri opirazzioni.",
        "viewsourcetext": "Poi taliari e cupiari lu còdici surgenti di sta pàggina.",
        "viewyourtext": "Poi taliari e cupiari lu còdici surgenti dî <strong>tò canciamenti</strong> nti sta pàggina.",
        "protectedinterface": "Sta pàggina cunteni un elementu ca fà parti dâ nterfaccia utenti dû software eggh'è  prutetta p'evitari pussìbbili abbusi. Pi jùnciri o canciari li traduzzioni pi tutti li wiki usari [//translatewiki.net/translatewiki.net] lu pruggettu di lucalizzazzioni di Mediawiki.",
-       "editinginterface": "<strong>Accura:</strong> Lu testu di sta pàggina fà parti di l'interfaccia utenti dû situ.\nTutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti di sta wiki.",
-       "translateinterface": "Pi' agghiunciri o canciari traduzzioni pi' tutti i wiki, pi' favuri adupirati [//translatewiki.net/ translatewiki.net], lu pruggettu di lucalizzazzioni di MediaWiki.",
+       "editinginterface": "<strong>Accura:</strong> Lu testu di sta pàggina fa parti dâ nterfaccia utenti dû situ.\nTutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti di sta wiki.",
+       "translateinterface": "Pi agghiùnciri o canciari traduzzioni pi tutti li wiki, pi favuri adòpira [//translatewiki.net/ translatewiki.net], lu pruggettu di lucalizzazzioni di MediaWiki.",
        "cascadeprotected": "Sta pàggina è prutetta dî canciamenti pirchì veni nclusa {{PLURAL:$1|ntâ pàggina siquenti, ca fu prutiggiuta|ntê pàggini siquenti, ca foru prutiggiuti}} cu l'opzioni «a cascata»:\n$2",
        "namespaceprotected": "Nun hai lu pirmissu pi canciari li pàggini ntô namespace '''$1'''.",
-       "customcssprotected": "Nun hai lu pirmissu pi' canciari sta pàggina CSS picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
-       "customjsprotected": "Nun hai lu pirmissu pi' canciari sta pàggina JavaScript picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
-       "mycustomcssprotected": "Nun hai lu pirmissu pi' canciari sta paggina CSS.",
-       "mycustomjsprotected": "Nun hai lu pirmissu pi' canciari sta pàggina JavaScript.",
-       "myprivateinfoprotected": "Nun hai lu pirmissu pi' canciari li to nfurmazzioni risirvati.",
-       "mypreferencesprotected": "Nun hai lu pirmissu pi' canciari li to prifirenzi.",
+       "customcssprotected": "Nun hai lu pirmissu pi canciari sta pàggina CSS pirchì cunteni li mpustazzioni pirsunali di n'àutru utenti.",
+       "customjsprotected": "Nun hai lu pirmissu pi canciari sta pàggina JavaScript pirchì cunteni li mpustazzioni pirsunali di n'àutru utenti.",
+       "mycustomcssprotected": "Nun hai lu pirmissu pi canciari sta pàggina CSS.",
+       "mycustomjsprotected": "Nun hai lu pirmissu pi canciari sta pàggina JavaScript.",
+       "myprivateinfoprotected": "Nun hai lu pirmissu pi canciari li tò nfurmazzioni risirvati.",
+       "mypreferencesprotected": "Nun hai lu pirmissu pi canciari li tò prifirenzi.",
        "ns-specialprotected": "Li pàggini ntô namespace {{ns:special}} non ponnu èssiri canciati.",
        "titleprotected": "La criazzioni di sta pàggina cu stu tìtulu fu bluccata da [[User:$1|$1]].\nLa mutivazzioni è chista: ''$2''.",
-       "filereadonlyerror": "Nun fu pussìbbili canciari lu file \"$1\" pirchì lu repository di file \"$2\" è 'n mudalitati di sula littura.\n\nL'amministraturi chi' lu bluccau desi sta spiegazzioni: \"$3\".",
-       "invalidtitle-knownnamespace": "Tìtulu nun vàlidu cu' spazziu dî nomi \"$2\" e testu \"$3\"",
-       "invalidtitle-unknownnamespace": "Tìtulu nun vàlidu cu' nùmmiru di spazziu dî nomi scanusciutu $1 e testu \"$2\"",
+       "filereadonlyerror": "Nun fu pussìbbili canciari lu file \"$1\" pirchì lu repository di file \"$2\" è n mudalità di littura sula.\n\nL'amministraturi chi lu bluccau desi sta spigazzioni: \"$3\".",
+       "invalidtitle-knownnamespace": "Tìtulu nun vàlidu cu spazziu dî nomi \"$2\" e testu \"$3\"",
+       "invalidtitle-unknownnamespace": "Tìtulu nun vàlidu cu nùmmiru di spazziu dî nomi scanusciutu $1 e testu \"$2\"",
        "exception-nologin": "Nun trasutu",
-       "exception-nologin-text": "Pi' favuri trasi pi' putiri accèdiri a' sta pàggina o a' st'azzioni.",
-       "exception-nologin-text-manual": "Pi' favuri $1 pi' putiri accèdiri a' sta pàggina o a' st'azziòni.",
+       "exception-nologin-text": "Pi favuri trasi pi putiri accèdiri a sta pàggina o a st'azzioni.",
+       "exception-nologin-text-manual": "Pi favuri $1 pi putiri accèdiri a sta pàggina o a st'azzioni.",
        "virus-badscanner": "Sbagghiu di cunfigurazzioni: antivirus scanusciutu: ''$1''",
        "virus-scanfailed": "scanzioni nun arrinisciuta (còdici $1)",
        "virus-unknownscanner": "antivirus scanusciutu:",
-       "logouttext": "<strong>Nisciuta. Ora siti fora.</strong>\n\nAccura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avissi nisciutu nzinu a quannu tu nun scancelli tutta la mimoria dû tò browser.",
+       "logouttext": "<strong>Nisciuta. Ora sî fora.</strong>\n\nAccura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun s'avissi nisciutu nzinu a quannu tu nun cancelli tutta la mimoria dû tò browser.",
        "welcomeuser": "Bommegna, $1!",
-       "welcomecreation-msg": "U to cuntu fu' criatu.\nPoi canciari li to [[Special:Preferences|prifirenzi]] di {{SITENAME}} si' voi.",
+       "welcomecreation-msg": "Lu tò cuntu fu criatu.\nPoi canciari li tò [[Special:Preferences|prifirenzi]] di {{SITENAME}} si voi.",
        "yourname": "Nomu utenti:",
        "userlogin-yourname": "Nomu utenti",
        "userlogin-yourname-ph": "Nzirìsci lu tò nomu utenti",
        "remembermypassword": "Arricorda la password supra stu computer (pi ô massimu $1 {{PLURAL:$1|jornu|jorna}})",
        "userlogin-remembermypassword": "Mantènimi culligatu",
        "userlogin-signwithsecure": "Adòpira na cunnissioni sicura",
-       "yourdomainname": "Lu to duminiu:",
+       "yourdomainname": "Lu tò duminiu:",
        "password-change-forbidden": "Nun poi canciari li password nta sta wiki.",
        "externaldberror": "S'havi virificatu n'erruri cû server d'autinticazzioni sternu, oppuru nun si disponi di l'auturizzazzioni nicissari p'aggiurnari lu propiu accessu sternu.",
        "login": "Trasi",
        "gotaccountlink": "Trasi",
        "userlogin-resetlink": "Ti scurdasti li dittagghî pâ trasuta?",
        "userlogin-resetpassword-link": "Ti scurdasti la password?",
-       "userlogin-helplink2": "Ajutu pâ trasuta",
+       "userlogin-helplink2": "Aiutu pâ trasuta",
        "userlogin-loggedin": "Già trasisti comu {{GENDER:$1|$1}}.\nAdòpira lu mòdulu ccassutta pi tràsiri comu n'àutru utenti.",
-       "userlogin-createanother": "Crea n'autru cuntu",
+       "userlogin-createanother": "Crea n'àutru cuntu",
        "createacct-emailrequired": "Nnirizzu di posta elittrònica",
        "createacct-emailoptional": "Nnirizzu di posta elittrònica (facurtativu)",
-       "createacct-email-ph": "Nzirisci lu to nnirizzu di posta elittrònica",
-       "createacct-another-email-ph": "Nzirisci u nnirizzu di posta elittrònica",
-       "createaccountmail": "Adòpira na password timpurania casuali e mànnila ô nnirizzu di posta elittrònica spicificatu",
+       "createacct-email-ph": "Nzirisci lu tò nnirizzu di posta elittrònica",
+       "createacct-another-email-ph": "Nzirisci lu nnirizzu di posta elittrònica",
+       "createaccountmail": "Adòpira na password timpurània casuali e mànnala ô nnirizzu di posta elittrònica spicificatu",
        "createacct-realname": "Nomu veru (facurtativu)",
        "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 to cuntu",
-       "createacct-another-submit": "Crea n'autru cuntu",
-       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a' tìa.",
+       "createacct-submit": "Crea lu tò cuntu",
+       "createacct-another-submit": "Crea un cuntu",
+       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a tìa.",
        "createacct-benefit-body1": "{{PLURAL:$1|cuntribbutu|cuntribbuti}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàggina|pàggini}}",
        "createacct-benefit-body3": "{{PLURAL:$1|cuntribbuturi ricenti|cuntribbutura ricenti}}",
        "badretype": "Li password chi mittisti nun currispùnninu tra d'iddi.",
        "usernameinprogress": "Un cuntu cu stu nomu utenti già si sta criannu.\nPi favuri aspetta.",
-       "userexists": "Lu nomu utenti nziritu è già usatu.\nTi prijamu pirciò di vuliri scègghîri nu nomu utenti diffirenti.",
+       "userexists": "Lu nomu utenti nzirutu è già usatu.\nTi prijamu pirciò di vuliri scègghiri nu nomu utenti diffirenti.",
        "loginerror": "Erruri ntâ trasuta",
        "createacct-error": "Erruri ntâ criazzioni dû cuntu",
        "createaccounterror": "Nun fu pussìbbili criari lu cuntu: $1",
-       "nocookiesnew": "Lu cuntu utenti fu' criatu, ma nun si' trasutu.\n{{SITENAME}} adòpira li cookie pi' gistiri li trasuti.\nTu hai i cookie disattivati.\nPi' favuri attìvili, e appoi trasi chî to nomu utenti e password novi.",
-       "nocookieslogin": "{{SITENAME}} adòpira li cookie pi' gistiri li trasuti.\nTu hai i cookie disattivati.\nPi' favuri attìvili e prova n'autra vota.",
-       "nocookiesfornew": "Lu cuntu utenti nun fu' criatu, picchì nun pòttimu cunfirmari la so orìggini.\nAssicuriti chi' hai i ''cookie'' attivati, ricarrica sta pàggina e prova n'autra vota.",
+       "nocookiesnew": "Lu cuntu utenti fu criatu, ma nun trasisti.\n{{SITENAME}} adòpira li cookie pi gistiri li trasuti.\nTu hai li cookie disattivati.\nPi favuri attìvali, e appoi trasi chî tò nomu utenti e password novi.",
+       "nocookieslogin": "{{SITENAME}} adòpira li cookie pi gistiri li trasuti.\nTu hai li cookie disattivati.\nPi favuri attìvali e prova n'àutra vota.",
+       "nocookiesfornew": "Lu cuntu utenti nun fu criatu, pirchì nun pòttimu cunfirmari la sò orìggini.\nAssicùrati chi hai li ''cookie'' attivati, ricàrrica sta pàggina e prova n'àutra vota.",
        "noname": "Nun spicificasti nu nomu utenti vàlidu.",
        "loginsuccesstitle": "Trasuta rinisciuta",
-       "loginsuccess": "<strong>Ora si' trasutu nta {{SITENAME}} comu \"$1\".</strong>",
+       "loginsuccess": "<strong>Ora trasisti nta {{SITENAME}} comu \"$1\".</strong>",
        "nosuchuser": "Nun è riggistratu nuddu utenti di nomu \"$1\".\nLi nomi di l'utenti fannu diffirenza tra maiùsculi e minùsculi.\nCuntrolla chi scrivisti lu nomu bonu, o puru [[Special:UserLogin/signup|crea un cuntu novu]].",
        "nosuchusershort": "Nun è riggistratu nuddu utenti di nomu \"$1\".\nCuntrolla chi scrivisti lu nomu bonu.",
-       "nouserspecified": "Hâ' spicificari un nomu utenti.",
+       "nouserspecified": "Hai a spicificari un nomu utenti.",
        "login-userblocked": "St'utenti è bluccatu. Nun è pussìbbili di tràsiri.",
-       "wrongpassword": "La password chi' mittisti nun è giusta.\nPi' favuri prova n'àutra vota.",
-       "wrongpasswordempty": "La password chi' mittisti era vacanti.\nPi' favuri prova n'àutra vota.",
-       "passwordtooshort": "I password hannu a' èssiri longhi almenu {{PLURAL:$1|1 caràttiri|$1 caràttiri}}.",
+       "wrongpassword": "La password chi mittisti nun è giusta.\nPi favuri prova n'àutra vota.",
+       "wrongpasswordempty": "La password chi mittisti era vacanti.\nPi favuri prova n'àutra vota.",
+       "passwordtooshort": "Li password hannu a èssiri longhi armenu {{PLURAL:$1|1 caràttiri|$1 caràttiri}}.",
        "passwordtoolong": "Li password nun ponnu èssiri cchiù longhi di {{PLURAL:$1|1 caràttiri|$1 caràttiri}}.",
-       "password-name-match": "La tò password havi a' èssiri diversa dû tò nomu utenti.",
-       "password-login-forbidden": "L'usu di stu nomu utenti e password fu' pruibbitu.",
+       "password-name-match": "La tò password havi a èssiri diversa dû tò nomu utenti.",
+       "password-login-forbidden": "L'usu di stu nomu utenti e password fu pruibbitu.",
        "mailmypassword": "Azzera la password",
-       "passwordremindertitle": "Password nova timpurania pi' {{SITENAME}}",
+       "passwordremindertitle": "Password nova timpurània pi {{SITENAME}}",
        "passwordremindertext": "Quarchidunu (prubbabbirmenti tu, cu nnirizzu IP $1) addumannau d'aviri mannata na password d'accessu nova a {{SITENAME}} ($4). La password pi l'utenti \"$2\" vinni mpustata a \"$3\".\nTi cummeni fari n'accessu quantu prima e canciari la password pi sùbbitu. La tò password timpuranea scadrà dopu {{PLURAL:$5|nu jornu|$5 jorna}}.\nSiddu nun fusti tu a fari la dumanna, oppuru arrittruvasti la password e nun addisìi cchiù canciàrila, poi non tèniri cuntu di stu missaggiu e cuntinuari a usari la password vecchia.",
        "noemail": "Nuddu ndirizzu e-mail riggistratu pi l'utenti \"$1\".",
        "noemailcreate": "Aviti a dari nu nnirizzu e-mail validu",
        "passwordsent": "Na password nova hà statu mannata a lu ndirizzu e-mail riggistratu pi l'utenti \"$1\". Pi favuri, effèttua un accessu nun appena l'arricevi.",
        "blocked-mailpassword": "Pi privèniri abbusi, nun è cunzititu usari la funzioni \"Nvia nova password\" d'un ndirizzu IP bluccatu.",
-       "eauthentsent": "Nu missaggiu e-mail di cunfirma fu' spidutu a lu nnirizzu nnicatu.\nPrima chi' ponnu èssiri mannati autri missaggi e-mail a' stu cuntu, è nicissariu sèquiri li struzzioni ca vi sunnu scritti, 'n modu di cunfirmari di èssiri li liggìttimi prupietarî di lu cuntu.",
-       "throttled-mailpassword": "Nu missaggiu e-mail di azziramentu dâ password già havi statu mannatu nta {{PLURAL:$1|l'ultima ura|l'ultimi $1 uri}}. Pi' privèniri abbusi, si po' mannari nu missaggiu e-mail di azziramentu dâ password na vota sula ogni {{PLURAL:$1|ura|$1 uri}}.",
+       "eauthentsent": "Nu missaggiu e-mail di cunferma fu spidutu a lu nnirizzu nnicatu.\nPrima chi ponnu èssiri mannati àutri missaggi e-mail a stu cuntu, è nicissariu sèquiri li struzzioni ca vi sunnu scritti, n modu di cunfirmari d'èssiri li prupitarî liggìttimi di lu cuntu.",
+       "throttled-mailpassword": "Nu missaggiu e-mail di azziramentu dâ password già fu mannatu nta {{PLURAL:$1|l'ùrtima ura|l'ùrtimi $1 uri}}. Pi privèniri abbusi, si pò mannari nu missaggiu e-mail d'azziramentu dâ password na vota sula ogni {{PLURAL:$1|ura|$1 uri}}.",
        "mailerror": "Erruri nta lu mannu dû missaggiu: $1",
        "acct_creation_throttle_hit": "Visitaturi di sta wiki cû tò stissu nnirizzu IP già criaru {{PLURAL:$1|un cuntu|$1 cunti}} nta sta jurnata, chi è lu màssimu pirmissu pi stu pirìudu di tempu.\nPirciò, com'a ora li visitaturi ca ùsanu stu nnirizzu IP nun ponnu criari àutri cunti.",
        "emailauthenticated": "Lu tò nnirizzu di posta elittrònica fu cunfirmatu lu $2 ê $3.",
        "emailnotauthenticated": "Lu tò nnirizzu di posta elittrònica ancora nun fu cunfirmatu.\nNun ti sunnu mannati missaggi di posta elittrònica pi sti funzioni.",
        "noemailprefs": "Nnicari nu nnirizzu di posta elittrònica p'attivari sti funzioni.",
-       "emailconfirmlink": "Cunfirmari lu to nnirizzu di posta elittrònica",
+       "emailconfirmlink": "Cunfirmari lu tò nnirizzu di posta elittrònica",
        "invalidemailaddress": "Lu nnirizzu di posta elittrònica nun pò èssiri accittatu pirchì pari chi havi un furmatu nun vàlidu.\nPi favuri nzirisci nu nnirizzu vàlidu o puru svacanta la casedda.",
        "cannotchangeemail": "Li nnirizzi di posta elittrònica nun ponnu èssiri canciati nta sta wiki.",
-       "emaildisabled": "Stu situ nun po' mannari missaggi di posta elittrònica.",
+       "emaildisabled": "Stu situ nun pò mannari missaggi di posta elittrònica.",
        "accountcreated": "Cuntu criatu",
-       "accountcreatedtext": "Fu' criatu un cuntu novu pi' l'utenti [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]).",
+       "accountcreatedtext": "Fu criatu un cuntu novu pi l'utenti [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]).",
        "createaccount-title": "Criazzioni di nu cuntu pi {{SITENAME}}",
        "createaccount-text": "Qualcuno criau n'accessu a {{SITENAME}} ($4) a nomu di $2, associatu cu stu ndirizzu di posta elettronica. La password pi l'utenti \"$2\" è mpustata a \"$3\". È opportunu trasiri quantu prima e canciari la password subbutu.\n\nSi l'accessu fu criatu pi sbagghiu, si può gnurari stu missaggiu.",
-       "login-throttled": "Hai fattu troppi tintativi di trasuta.\nPi' favuri spetta $1 prima di pruvari n'autra vota.",
+       "login-throttled": "Facisti troppi tintativi di trasuta.\nPi favuri aspetta $1 prima di pruvari n'àutra vota.",
        "login-abort-generic": "La trasuta nun arriniscìu - Annullata",
-       "login-migrated-generic": "Lu to cuntu fu' migratu, e lu to nomu utenti nun esisti cchiù' nta sta wiki.",
+       "login-migrated-generic": "Lu tò cuntu fu migratu, e lu tò nomu utenti nun esisti cchiù nta sta wiki.",
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "La tò dumanna di discunnissioni fu niàta prichì pari ca veni di nu browser nun funziunanti o nu proxy di caching.",
-       "createacct-another-realname-tip": "U nomu veru è opziunali.\nSi scegghî di furnìrilu, veni adupiratu pi' dari crèditu a' l'utenti pû so travagghiu.",
+       "createacct-another-realname-tip": "Lu nomu veru è opziunali.\nSi scegghi di furnìrilu, veni adupiratu pi dari crèditu a l'utenti pû sò travagghiu.",
        "pt-login": "Trasi",
        "pt-login-button": "Trasi",
        "pt-createaccount": "Crea un cuntu novu",
        "changepassword-success": "La tò password fu canciata!",
        "changepassword-throttled": "Facisti troppi tintativi di trasuta.\nPi favuri aspetta $1 prima di pruvari n'àutra vota.",
        "resetpass_forbidden": "Li password nun si ponnu canciari",
-       "resetpass-no-info": "Pi tràsiri nta sta pàggina hà' èssiri riggistratu.",
+       "resetpass-no-info": "Pi tràsiri nta sta pàggina hai a èssiri riggistratu.",
        "resetpass-submit-loggedin": "Cancia la password",
        "resetpass-submit-cancel": "Annulla",
        "resetpass-wrong-oldpass": "La password timpurània o attuali nun è giusta.\nPo èssiri ca già arriniscisti a canciari la tò password, o puru ca già nn'addumannasti n'àutra timpurània ancora.",
-       "resetpass-recycled": "Pi' favuri cancia a to password a' na cosa diffirenti dâ to password attuali.",
+       "resetpass-recycled": "Pi favuri cancia la tò password a na cosa diffirenti dâ tò password attuali.",
        "resetpass-temp-emailed": "Trasisti cûn codici timpuràniu mannatu pi posta elittrònica.\nPi cumplitari la trasuta, hai a mpustari na password nova ccà:",
        "resetpass-temp-password": "Password timpurània:",
-       "resetpass-abort-generic": "U canciu dâ password fu' annullatu di n'estinsioni.",
-       "resetpass-expired": "A to password scadìu. Pi' favuri mposta na password nova pi' trasiri.",
-       "resetpass-expired-soft": "A to password scadìu e s'havi a' azzirari. Pi' favuri scegghî na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'autra vota.",
-       "resetpass-validity-soft": "A to password nun è vàlida: $1\n\nPi' favuri scegghî na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'autra vota.",
+       "resetpass-abort-generic": "Lu canciu dâ password fu annullatu di n'estinzioni.",
+       "resetpass-expired": "La tò password scadìu. Pi favuri mposta na password nova pi tràsiri.",
+       "resetpass-expired-soft": "La tò password scadìu e s'havi a azzirari. Pi favuri scegghi na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'àutra vota.",
+       "resetpass-validity-soft": "La tò password nun è vàlida: $1\n\nPi favuri scegghi na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'àutra vota.",
        "passwordreset": "Azziramentu dâ password",
        "passwordreset-text-one": "Jinchi stu mòdulu p'arricèviri na password timpurània pi posta elittrònica.",
        "passwordreset-text-many": "{{PLURAL:$1|Jinchi unu dî campi p'arricèviri na password timpurània pi posta elittrònica.}}",
        "passwordreset-disabled": "L'azziramentu dî password fu disattivatu nta sta wiki.",
-       "passwordreset-emaildisabled": "Li funzionalità di e-mail furu disattivati nta sta wiki.",
+       "passwordreset-emaildisabled": "Li funziunalità di e-mail foru disattivati nta sta wiki.",
        "passwordreset-username": "Nomu utenti:",
        "passwordreset-domain": "Duminiu:",
-       "passwordreset-capture": "Ammustrari u missaggiu e-mail chi' veni cumpostu?",
+       "passwordreset-capture": "Ammustrari lu missaggiu e-mail chi veni cumpostu?",
        "passwordreset-capture-help": "Si attivi sta casedda, lu missaggiu e-mail (câ password timpurània) veni ammustratu a tìa sparti chi veni mannatu a l'utenti.",
        "passwordreset-email": "Nnirizzu di posta elittrònica:",
-       "passwordreset-emailtitle": "Dittagghî dû cuntu supra a' {{SITENAME}}",
+       "passwordreset-emailtitle": "Dittagghî dû cuntu supra a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quarchidunu (prubbabbilmenti tu, dô nnirizzu IP $1) fici n'addumannata pi l'azziramentu dâ tò password pi {{SITENAME}} ($4). {{PLURAL:$3|Lu cuntu utenti siguenti è assuciatu|Li cunti utenti siguenti sù assuciati}} cu stu nnirizzu di posta elittrònica:\n\n$2\n\n{{PLURAL:$3|Sta password timpurània|Sti password timpurànii}} scàdinu tra {{PLURAL:$5|un jornu|$5 jorna}}.\nOra tu avissi a tràsiri e scègghiri na password nova. Si fu quarchidun'àutru a fari st'addumannata e nun tu, o si t'arricurdasti la tò password origginali e nun la voi canciari cchiù, poi gnurari stu missaggiu e cuntinuari a adupirari la tò password vecchia.",
        "passwordreset-emailtext-user": "L'utenti $1 supra a {{SITENAME}} fici n'addumannata pi l'azziramentu dâ tò password pi {{SITENAME}} ($4). {{PLURAL:$3|Lu cuntu utenti siguenti è assuciatu|Li cunti utenti siguenti sù assuciati}} cu stu nnirizzu di posta elittrònica:\n\n$2\n\n{{PLURAL:$3|Sta password timpurània|Sti password timpurànii}} scàdinu tra {{PLURAL:$5|un jornu|$5 jorna}}.\nOra tu avissi a tràsiri e scègghiri na password nova. Si fu quarchidun'àutru a fari st'addumannata e nun tu, o si t'arricurdasti la tò password origginali e nun la voi canciari cchiù, poi gnurari stu missaggiu e cuntinuari a adupirari la tò password vecchia.",
-       "passwordreset-emailelement": "Nomu utenti: \n$1\n\nPassword timpurania: \n$2",
+       "passwordreset-emailelement": "Nomu utenti: \n$1\n\nPassword timpurània: \n$2",
        "passwordreset-emailsent": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu mannatu.",
        "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-no-info": "Hâ' jèssiri trasutu p'aviri accessu direttu a' sta pàggina.",
+       "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:",
        "changeemail-none": "(nuddu)",
-       "changeemail-password": "A to password di {{SITENAME}}:",
+       "changeemail-password": "La tò password di {{SITENAME}}:",
        "changeemail-submit": "Cancia nnirizzu",
-       "changeemail-throttled": "Hai fattu troppi tintativi di trasuta.\nPi' favuri spetta $1 prima di pruvari n'autra vota.",
+       "changeemail-throttled": "Facisti troppi tintativi di trasuta.\nPi favuri aspetta $1 prima di pruvari n'àutra vota.",
+       "changeemail-nochange": "Pi favuri metti nu nnirizzu di posta elittrònica diffirenti di chiddu ca già c'è.",
        "resettokens": "Azziramentu dî token",
-       "resettokens-text": "Cca poi azzirari i ''token'' chi' dùnunu accessu a' certi dati risirvati assuciati ô to cuntu.\n\nSta cosa s'avissi a' fari si' pi' sbagghiu i facisti sapiri a' quarchidunu o si' u to cuntu fu' cumprumisu.",
-       "resettokens-no-tokens": "Nun ci su' token di azzirari.",
+       "resettokens-text": "Ccà poi azzirari li ''token'' chi dùnanu accessu a certi dati risirvati assuciati ô tò cuntu.\n\nSta cosa s'avissi a fari si pi sbagghiu li facisti sapiri a quarchidunu o si lu tò cuntu fu cumprumisu.",
+       "resettokens-no-tokens": "Nun ci sunnu token d'azzirari.",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (valuri attuali: $2)",
        "resettokens-watchlist-token": "Token pû feed web (Atom/RSS) dî [[Special:Watchlist|canciamenti ê pàggini ntâ tò lista taliata]]",
-       "resettokens-done": "I token furu azzirati.",
-       "resettokens-resetbutton": "Azzera i token scigghiuti",
+       "resettokens-done": "Li token foru azzirati.",
+       "resettokens-resetbutton": "Azzera li token scigghiuti",
        "bold_sample": "Grassettu",
        "bold_tip": "Grassettu",
        "italic_sample": "Cursivu",
        "showpreview": "Ammustra l'antiprima",
        "showdiff": "Ammustra li canciamenti",
        "blankarticle": "<strong>Accura:</strong> La pàggina chi stai criannu è vacanti.\nSi clicchi \"{{int:savearticle}}\" n'àutra vota, la pàggina veni criata senza nuddu cuntinutu.",
-       "anoneditwarning": "<strong>Accura:</strong> Nun si' trasutu. Lu to nnirizzu IP diventa visìbbili pubblicamenti quannu fai nu canciamentu. Si' <strong>[$1 trasi]</strong> o puru <strong>[$2 crei nu cuntu]</strong>, li canciamenti chi' fai vènunu attribbuiti ô to nomu utenti, sparti di autri vantaggi.",
+       "anoneditwarning": "<strong>Accura:</strong> Nun trasisti. Lu tò nnirizzu IP addiventa visìbbili pubblicamenti quannu fai nu canciamentu. Si <strong>[$1 trasi]</strong> o puru <strong>[$2 crei nu cuntu]</strong>, li canciamenti chi fai vèninu attribbuiti ô tò nomu utenti, sparti d'àutri vantaggi.",
        "anonpreviewwarning": "''Nun trasisti comu utiliggaturi loggatu. Sarbannu, lu tò nnirizzu IP veni arriggistratu ntâ storia dî canciamenti.''",
        "missingsummary": "'''Accura:''' Nun hà statu spicificatu l'uggettu di stu canciamentu. Primennu di novu '''Sarva''' lu canciamentu veni sarvatu cu l'uggettu vacanti.",
        "selfredirect": "<strong>Accura:</strong> Stai rimannannu sta pàggina a idda stissa.\nPo èssiri chi spicificasti na distinazzioni sbagghiata pû rimannu, o puru chi stai canciannu la pàggina sbagghiata.\nSi clicchi \"{{int:savearticle}}\" n'àutra vota, lu rimannu veni criatu lu stissu.",
        "missingcommenttext": "Nziriri un cummentu ccà sutta.",
-       "missingcommentheader": "<strong>Accura:</strong> Nun havi statu spicificatu l'oggettu/ntistazzioni di stu cummentu. Primennu di novu \"{{int:savearticle}}\", lu canciamentu veni sarvatu senza avìrinni.",
+       "missingcommentheader": "<strong>Accura:</strong> Nun fu spicificatu l'oggettu/ntistazzioni di stu cummentu. Primennu di novu \"{{int:savearticle}}\", lu canciamentu veni sarvatu senza avìrinni.",
        "summary-preview": "Antiprima dû riassuntu:",
        "subject-preview": "Antiprima di l'oggettu/ntistazzioni:",
        "previewerrortext": "Ammattìu n'erruri nta l'ammustrari li tò canciamenti.",
        "loginreqlink": "trasi",
        "loginreqpagetext": "Pi favuri $1 pi taliari àutri pàggini.",
        "accmailtitle": "Password mannata",
-       "accmailtext": "Na password ginirata casualmenti pi' [[User talk:$1|$1]] fu' spiduta a $2. Si po' canciari di la pàggina di <em>[[Special:ChangePassword|canciamentu dâ password]]</em> comu unu trasi.",
+       "accmailtext": "Na password ginirata casualmenti pi [[User talk:$1|$1]] fu spiduta a $2. Si pò canciari dâ pàggina di <em>[[Special:ChangePassword|canciamentu dâ password]]</em> comu unu trasi.",
        "newarticle": "(Novu)",
        "newarticletext": "Siguisti na lijami a na pàggina c'ancora nun esisti.\nPi criari sta pàggina, accumenza a scrìviri ccassutta (talìa la [$1 pàggina d'aiutu] p'aviri maiuri nfurmazzioni).\nSi agghicasti ccà pi sbagghiu, carca lu buttuni <strong>n arreri</strong> dû tò browser.",
        "anontalkpagetext": "----''Chista è la pàggina di discussioni di n’utenti anònimu, ca nun criau ancora n’accessu o ca nun l’usa.\nP’idintificàrilu è pirciò nicissariu usari lu nùmmiru di lu sò nnirizzu IP.\nLi nnirizzi IP ponnu pirò èssiri spartuti di cchiù utenti.\nSiddu sî n’utenti anònimu e riteni ca li cummenti prisenti nta sta pàggina nun si rifirìscinu a tia, [[Special:UserLogin/signup|crea n’accessu novu]] o [[Special:UserLogin|trasi]] cu chiddu ca già hai p’evitari d’èssiri cunfusu cu àutri utenti anònimi ‘n futuru.''",
-       "noarticletext": "Nta stu mumentu la pàggina addumannata è vacanti. È pussìbbili [[Special:Search/{{PAGENAME}}|circari stu tìtulu]] nta l'àutri pàggini dû situ oppuru <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|action=edit}} circari ntê riggistra culligati] oppuru [{{fullurl:{{FULLPAGENAME}}|action=edit}} canciari la pàggina ora]</span>.",
-       "noarticletext-nopermission": "Nta stu mumentu la pàggina addumannata è vacanti. È pussibbili [[Special:Search/{{PAGENAME}}|circari stu titulu]] nti àutri pàggini dû situ o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} circari ntê riggistra culligati]</span>, ma nun hai li pirmissa pi criari sta pàggina.",
-       "missing-revision": "A virsioni #$1 dâ paggina ntitulata \"{{FULLPAGENAME}}\" nun esisti.\n\nStu fattu di sòlitu succedi quannu si segui na lijami di crunuluggìa versu na pàggina chi fu cancillata.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
+       "noarticletext": "Nta stu mumentu la pàggina addumannata è vacanti. È pussìbbili [[Special:Search/{{PAGENAME}}|circari stu tìtulu]] nta l'àutri pàggini dû situ oppuru <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|action=edit}} circari ntê riggistri culligati] oppuru [{{fullurl:{{FULLPAGENAME}}|action=edit}} canciari la pàggina ora]</span>.",
+       "noarticletext-nopermission": "Nta stu mumentu la pàggina addumannata è vacanti. È pussìbbili [[Special:Search/{{PAGENAME}}|circari stu tìtulu]] nti àutri pàggini dû situ o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} circari ntê riggistri culligati]</span>, ma nun hai li pirmissi pi criari sta pàggina.",
+       "missing-revision": "La virsioni #$1 dâ paggina ntitulata \"{{FULLPAGENAME}}\" nun esisti.\n\nStu fattu di sòlitu succedi quannu si segui nu lijami di crunuluggìa versu na pàggina chi fu cancillata.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
        "userpage-userdoesnotexist": "L'account \"<nowiki>$1</nowiki>\" nun currispunni a n'utenti riggistratu. Virificari si si voli criari o canciari sta pàggina.",
-       "userpage-userdoesnotexist-view": "U cuntu utenti \"$1\" nun è riggistratu.",
+       "userpage-userdoesnotexist-view": "Lu cuntu utenti \"$1\" nun è riggistratu.",
        "blocked-notice-logextract": "St'utenti pi com'ora è bluccatu.\nComu rifirimentu ccassutta c'è l'ùrtima vuci dû riggistru dî blocchi:",
        "clearyourcache": "<strong>Nota:</strong> Doppu aviri sarvatu, pò aggiuvari cancillari la ''cache'' dû propiu browser pi vìdiri li canciamenti.\n* <strong>Firefox / Safari:</strong> Cliccari <em>Ricarica</em> mantinnennu primutu lu tastu dî maiùsculi, o puru prèmiri o <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> ntôn Mac)\n* <strong>Google Chrome:</strong> Prèmiri <em>Ctrl-Maiusc-R</em> (<em>⌘-Maiusc-R</em> ntôn Mac)\n* <strong>Internet Explorer:</strong> Cliccari <em>Aggiorna</em> mantinennu primutu lu tastu <em>Ctrl</em>, o puru prèmiri <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Svacantari la ''cache'' dû menù <em>Strumenti → Preferenze</em>",
-       "usercssyoucanpreview": "<strong>Cunsigghiu:</strong> Adòpira u buttuni \"{{int:showpreview}}\" pi' pruvari u to CSS novu prima di sarvàrilu.",
-       "userjsyoucanpreview": "<strong>Cunsigghiu:</strong> Adòpira u buttuni \"{{int:showpreview}}\" pi' pruvari u to JavaScript novu prima di sarvàrilu.",
+       "usercssyoucanpreview": "<strong>Cunzigghiu:</strong> Adòpira lu buttuni \"{{int:showpreview}}\" pi pruvari lu tò CSS novu prima di sarvàrilu.",
+       "userjsyoucanpreview": "<strong>Cunzigghiu:</strong> Adòpira lu buttuni \"{{int:showpreview}}\" pi pruvari lu tò JavaScript novu prima di sarvàrilu.",
        "usercsspreview": "'''Arricorda ca stai sulu visualizzannu n'antiprima dû tò CSS pirsunali.'''\n'''Nun hà ancora statu sarvatu!'''",
        "userjspreview": "'''Arricorda ca stai sulu tistanno/vidennu 'n antiprima lu tò javascript pirsunali, nun hà statu ancora sarvatu!'''",
-       "sitecsspreview": "<strong>Ricòrditi chi' chista è sulu n'antiprima di stu CSS. Ancora nun havi statu sarvatu!</strong>",
-       "sitejspreview": "<strong>Ricòrditi chi' chista è sulu n'antiprima di stu còdici JavaScript. Ancora nun havi statu sarvatu!</strong>",
+       "sitecsspreview": "<strong>Arricòrdati chi chista è sulu n'antiprima di stu CSS. Ancora nun fu sarvatu!</strong>",
+       "sitejspreview": "<strong>Arricòrdati chi chista è sulu n'antiprima di stu còdici JavaScript. Ancora nun fu sarvatu!</strong>",
        "userinvalidcssjstitle": "'''Accura:''' Nun esisti arcuna skin cu nomu \"$1\". S'arricorda ca li pàggini pi li .css e .js pirsunalizzati hannu la nizziali dû tìtulu minùscula, p'asempiu {{ns:user}}:Asempiu/vector.js e nun {{ns:user}}:Asempiu/Vector.css.",
        "updated": "(Aggiurnatu)",
        "note": "<strong>Nota:</strong>",
        "previewnote": "<strong>Arricòrdati ca chista è sulu n'antiprima.</strong>\nLi tò canciamenti ancora nun foru sarvati!",
-       "continue-editing": "Vai a' l'aria di mudìfica",
+       "continue-editing": "Vai a l'ària di canciamentu",
        "previewconflict": "St'antiprima currispunni a lu testu prisenti ntâ casedda di canciamentu cchiù supra e rapprisenta la pàggina comu cumparisci siddu scegghi di sarvàrila.",
        "session_fail_preview": "<strong>Purtroppu nun fu pussìbbili sarvari li tò canciamenti pirchì li dati dâ sissioni foru pirduti.</strong>\nPi favuri prova n'àutra vota.\nSiddu ancora nun funziona, prova a [[Special:UserLogout|nèsciri]] e tràsiri n'àutra vota.",
        "session_fail_preview_html": "'''Semu spiacenti, nun hà statu pussìbbili elabburari lu canciamentu pirchì hannu jutu pirduti li dati rilativi â sissioni.'''\n\n''Poichì nta stu situ è abbilitatu l'usu di HTML senza limitazzioni, l'antiprima nun veni visualizzata; si tratta di na misura di sicurizza contra l'attacchi JavaScript.''\n\n'''Siddu chistu è nu tintativu liggìttimu di canciamentu, arriprova. Siddu lu prubbrema pirsisti, si pò pruvari a [[Special:UserLogout|sculligàrisi]] e effittuari n'accessu novu.'''",
        "token_suffix_mismatch": "'''Lu canciamentu nun fu sarvatu pirchì lu client ammustrau di gèstiri 'n modu sbagghiatu li caràttiri di puntiggiatura nta lu token assuciatu a iddu. P'evitari na curruzzioni pussìbbili dô testu dâ pàggina, fu rifiutatu tuttu lu canciamentu. Sta situazzioni pò virificàrisi, certi voti, quannu s'adòpiranu arcuni sirvizza di proxy anònimi via web chi prisèntanu bug.'''",
-       "edit_form_incomplete": "<strong>Quarchi' parti dû mòdulu pâ mudìfica nun arrivau ô ''server''; cuntrolla bonu chi' tutti i to canciamenti su' ntatti e prova n'autra vota.</strong>",
+       "edit_form_incomplete": "<strong>Quarchi parti dû mòdulu pô canciamentu nun arrivau ô ''server''; cuntrolla bonu chi tutti li tò canciamenti sunnu ntatti e prova n'àutra vota.</strong>",
        "editing": "Canciamentu di $1",
        "creating": "Criazzioni di $1",
        "editingsection": "Canciamentu di $1 (sizzioni)",
        "permissionserrorstext-withaction": "Nun hai lu pirmissu di $2, pi {{PLURAL:$1|stu mutivu|sti mutivi}}:",
        "recreate-moveddeleted-warn": "'''Accura: stai pi criari na pàggina chi fu cancillata 'n passatu.'''\n\nAccuràtivi ch'è uppurtunu cuntinuari a canciari sta pàggina.\nL'alencu dî cancillazzioni e spustamenti rilativi veni ripurtatu ccà pi cummudità:",
        "moveddeleted-notice": "Sta pàggina fu scancillata. La lista di li scancillazzioni e spustamenti veni ammustrata di sècutu pi nfurmazzioni.",
+       "moveddeleted-notice-recent": "Ni dispiaci, ma sta pàggina ricentimenti fu scancillata (nta l'ùrtimi 24 uri).\nComu rifirimentu, ccassutta ci sunnu li riggistri dî scancillazzioni e dî spustamenti rilativi a sta pàggina.",
        "log-fulllog": "Talìa lu riggistru cumpletu",
        "edit-hook-aborted": "Canciamentu annullatu di n'hook.\nNun desi nudda spigazzioni.",
        "edit-gone-missing": "Nun si pò aggiurnari la pàggina.\nPari ca fu cancillata.",
        "postedit-confirmation-saved": "Lu tò canciamentu fu sarvatu.",
        "edit-already-exists": "Nun fu pussìbbili criari na pàggina nova.\nGià esisti.",
        "defaultmessagetext": "Testu dû missaggiu pridifinutu",
-       "content-failed-to-parse": "Anàlisi sintàttica dû cuntinutu $2 pû mudellu $1 nun rinisciuta: $3",
+       "content-failed-to-parse": "Anàlisi sintàttica dû cuntinutu $2 pû mudellu $1 nun arrinisciuta: $3",
        "invalid-content-data": "Dati nun vàlidi ntô cuntinutu",
-       "content-not-allowed-here": "U cuntinutu \"$1\" nun è cunsintutu ntâ pàggina [[$2]]",
-       "editwarning-warning": "Annannutìnni di sta pàggina poi pèrdiri i canciamenti ch'hai fattu.\nSi' si' trasutu, poi disattivari st'avvisu ntâ sizzioni \"{{int:prefs-editing}}\" dî to prifirenzi.",
+       "content-not-allowed-here": "Lu cuntinutu \"$1\" nun è cunzintutu ntâ pàggina [[$2]]",
+       "editwarning-warning": "Lassannu sta pàggina poi pèrdiri li canciamenti ca facisti.\nSi trasisti, poi disattivari st'avvisu ntâ sizzioni \"{{int:prefs-editing}}\" dî tò prifirenzi.",
        "editpage-notsupportedcontentformat-title": "Furmatu di cuntinutu nun suppurtatu",
-       "editpage-notsupportedcontentformat-text": "U furmatu di cuntinutu $1 non è suppurtatu dû mudellu di cuntinutu $2.",
+       "editpage-notsupportedcontentformat-text": "Lu furmatu di cuntinutu $1 nun è suppurtatu dû mudellu di cuntinutu $2.",
        "content-model-wikitext": "wikitestu",
        "content-model-text": "testu sìmplici",
        "content-model-javascript": "JavaScript",
        "content-json-empty-object": "Oggettu vacanti",
        "content-json-empty-array": "Vitturi vacanti",
        "duplicate-args-warning": "<strong>Accura:</strong> [[:$1]] sta chiamannu [[:$2]] cu cchiossai dûn valuri comu paràmitru \"$3\". E' adupiratu sulu l'ùrtimu valuri spicificatu.",
-       "duplicate-args-category": "Pàggini chi' cuntènunu chiamati a' template cu' argumenti duplicati",
-       "duplicate-args-category-desc": "A pàggina cunteni chiamati a' template chi' adòpirunu argumenti duplicati, comu <code><nowiki>{{pippu|plutu=1|plutu=2}}</nowiki></code> o <code><nowiki>{{pippu|plutu|1=papirinu}}</nowiki></code>.",
+       "duplicate-args-category": "Pàggini chi cuntèninu chiamati a template cu argumenti duplicati",
+       "duplicate-args-category-desc": "La pàggina cunteni chiamati a template chi adòpiranu argumenti duplicati, comu <code><nowiki>{{cicciu|plutu=1|plutu=2}}</nowiki></code> o <code><nowiki>{{cicciu|plutu|1=papirinu}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Accura: Sta pàggina cunteni troppi chiamati ê parser functions.\n\nAvissi a èssiri menu di $2, ô mumentu ci {{PLURAL:$1|nn'è $1|nni sunnu $1}}.",
        "expensive-parserfunction-category": "Pàggini cu troppi chiamati ê parser functions",
        "post-expand-template-inclusion-warning": "Accura: la diminzioni di li template nziriti è troppu granni.\nArcuni template non vènunu nziriti.",
        "post-expand-template-argument-category": "Pàggini ca cuntèninu template cu argumenti mancanti",
        "parser-template-loop-warning": "Rilivatu un cìrculu di lu Template: [[$1]]",
        "parser-template-recursion-depth-warning": "Passatu lu lìmiti di funnu pâ ricursioni di template ($1)",
-       "language-converter-depth-warning": "Passatu u lìmiti di funnu dû cunvirtituri di lingua ($1)",
-       "node-count-exceeded-category": "Pàggini unni fu' passatu u nùmmiru màssimu di gruppi",
-       "node-count-exceeded-category-desc": "A pàggina passa u nùmmiru massimu di gruppi.",
-       "node-count-exceeded-warning": "Sta pàggina passau u nùmmiru màssimu di gruppi",
-       "expansion-depth-exceeded-category": "Pàggini unni fu' passatu u funnu màssimu di espansioni",
-       "expansion-depth-exceeded-category-desc": "A pàggina passa u funnu màssimu di espansioni.",
-       "expansion-depth-exceeded-warning": "Sta pàggina passau u funnu màssimu di espansioni",
+       "language-converter-depth-warning": "Passatu lu lìmiti di funnu dû cunvirtituri di lingua ($1)",
+       "node-count-exceeded-category": "Pàggini unni fu passatu lu nùmmiru di gruppa màssimu",
+       "node-count-exceeded-category-desc": "La pàggina passa lu nùmmiru di gruppa màssimu.",
+       "node-count-exceeded-warning": "Sta pàggina passau lu nùmmiru di gruppa màssimu",
+       "expansion-depth-exceeded-category": "Pàggini unni fu passatu lu funnu d'espanzioni màssimu",
+       "expansion-depth-exceeded-category-desc": "La pàggina passa lu funnu d'espanzioni màssimu.",
+       "expansion-depth-exceeded-warning": "Sta pàggina passau lu funnu d'espanzioni màssimu",
        "parser-unstrip-loop-warning": "Rilivatu un cìrculu di Unstrip",
-       "parser-unstrip-recursion-limit": "Passatu u lìmiti di ricursioni di Unstrip ($1)",
+       "parser-unstrip-recursion-limit": "Passatu lu lìmiti di ricursioni di Unstrip ($1)",
        "converter-manual-rule-error": "Rilivatu n'erruri nta na règula manuali di cunvirsioni di lingua",
        "undo-success": "Lu canciamentu pò essiri annullatu.\nVirificati lu paraguni ccà sutta p'accuràrivi ca lu cuntinutu è chiddu addisiatu e doppu sarvati la pàggina pi cumplitari l'annullamentu.",
        "undo-failure": "Lu canciamentu nun pò èssiri annullatu a càusa d'un cunflittu cu li canciamenti ntirmedi.",
        "undo-norev": "Lu canciamentu nun pò essiri annullatu pirchì nun esisti o fù cancillato.",
-       "undo-nochange": "Pari chi' lu canciamentu già fu annullatu.",
+       "undo-nochange": "Pari chi lu canciamentu già fu annullatu.",
        "undo-summary": "Annullatu lu canciamentu $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussioni]])",
-       "undo-summary-username-hidden": "Annullata a virsioni $1 fatta di n'utenti ammucciatu",
+       "undo-summary-username-hidden": "Annullata la virsioni $1 fatta di n'utenti ammucciatu",
        "cantcreateaccounttitle": "Mpussìbbili criari un cuntu",
        "cantcreateaccount-text": "La criazzioni di cunti a pàrtiri di stu nnirizzu IP (<strong>$1</strong>), fu bluccata di [[User:$3|$3]].\n\nLa spigazzioni data di $3 è <em>$2</em>",
        "cantcreateaccount-range-text": "La criazzioni di cunti a pàrtiri dî nnirizzi IP ntô ntervallu '''$1''', chi cumprenni lu tò nnirizzu IP ('''$4'''), fu bluccata di [[User:$3|$3]].\n\nLa spigazzioni data di $3 è ''$2''",
        "histlegend": "Pû cunfruntu tra virsioni: scègghiri li caseddi currispunnenti ê virsioni di cunfruntari e carcari Invio o lu buttuni ô funnu.<br />\nLiggenna: <strong>({{int:cur}})</strong> = cunfruntari cu la virsioni currenti, <strong>({{int:last}})</strong> = cunfruntari cu la virsioni avanti d'idda, <strong>{{int:minoreditletter}}</strong> = canciamentu nicu",
        "history-fieldset-title": "Scurri ntâ crunuluggìa",
        "history-show-deleted": "Sulu chiddi cancillati",
-       "histfirst": "i cchiu' vecchî",
-       "histlast": "i cchiu' novi",
+       "histfirst": "li cchiù vecchî",
+       "histlast": "li cchiù novi",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "historyempty": "(vacanti)",
        "history-feed-title": "Crunuluggìa dî canciamenti",
        "history-feed-item-nocomment": "$1 lu $2",
        "history-feed-empty": "La pàggina chi addumannasti nun esisti.\nPò aviri statu cancillata dâ wiki, o puru canciatu lu sò nomu.\nProva a [[Special:Search|circari ntâ wiki]] siddu ci sunnu pàggini novi chi ti ponnu ntirissari.",
        "history-edit-tags": "Cancia l'etichetti dî virsioni scigghiuti",
-       "rev-deleted-comment": "(riassuntu dû canciamentu rimossu)",
+       "rev-deleted-comment": "(riassuntu dû canciamentu cancillatu)",
        "rev-deleted-user": "(nomu utenti cancillatu)",
-       "rev-deleted-event": "(dittagghî dû riggistru rimossi)",
-       "rev-deleted-user-contribs": "[nomu utenti o nnirizzu IP rimossi - canciamentu ammucciatu ntê cuntribbuti]",
+       "rev-deleted-event": "(dittagghî dû riggistru cancillati)",
+       "rev-deleted-user-contribs": "[nomu utenti o nnirizzu IP cancillati - canciamentu ammucciatu ntê cuntribbuti]",
        "rev-deleted-text-permission": "Sta virsioni dâ pàggina hà statu '''cancillata'''.\nCunzurtari lu [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log di cancillazzioni] pi ultiriuri dittagghi.",
-       "rev-suppressed-text-permission": "Sta virsioni dâ pàggina fu' <strong>supprimuta</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
+       "rev-suppressed-text-permission": "Sta virsioni dâ pàggina fu <strong>supprimuta</strong>.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
        "rev-deleted-text-unhide": "Sta virsioni dâ pàggina fu <strong>cancillata</strong>.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].\nAncora poi [$1 taliari sta virsioni] si voi prucèdiri.",
        "rev-suppressed-text-unhide": "Sta virsioni dâ pàggina fu <strong>supprimuta</strong>.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].\nAncora poi [$1 taliari sta virsioni] si voi prucèdiri.",
        "rev-deleted-text-view": "Sta virsioni dâ pàggina fu <strong>cancillata</strong>.\nTu ancora la poi taliari; si ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
        "revdelete-selected-text": "{{PLURAL:$1|Virsioni scigghiuta|Virsioni scigghiuti}} di [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Virsioni dû file scigghiuta|Virsioni dû file scigghiuti}} di [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Eventu dû riggistru silizziunatu|Eventi dû riggistru silizziunati}}:",
-       "revdelete-text-text": "I virsioni cancillati spuntirannu ancora ntâ crunuluggìa dâ pàggina, però parti dû so cuntinutu sarannu inaccissìbbili ô pùbblicu.",
-       "revdelete-text-file": "I virsioni di file cancillati spuntirannu ancora ntâ crunuluggìa dû file, però parti dû so cuntinutu sarannu inaccissìbbili ô pùbblicu.",
+       "revdelete-text-text": "Li virsioni cancillati spùntanu ancora ntâ crunuluggìa dâ pàggina, pirò parti dû sò cuntinutu nun sunnu accissìbbili ô pùbblicu.",
+       "revdelete-text-file": "Li virsioni di file cancillati spùntanu ancora ntâ crunuluggìa dû file, pirò parti dû sò cuntinutu nun sunnu accissìbbili ô pùbblicu.",
        "logdelete-text": "L'eventi cancillati spùntanu ancora ntê riggistri, pirò parti dû sò cuntinutu nun sunnu accissìbbili ô pùbblicu.",
        "revdelete-text-others": "L'àutri amministratura ponnu ancora aviri accessu ô cuntinutu ammucciatu e annullàrinni la cancillazzioni, a menu chi nun si pòninu àutri ristrizzioni ancora.",
-       "revdelete-confirm": "Pi' favuri cunfirma chi' hai ntinzioni di fari sta cosa, chi' capisci quali su' i so cunsiguenzi, e chi' stai prucidennu ntô rispettu dî [[{{MediaWiki:Policy-url}}|linî guida]].",
-       "revdelete-suppress-text": "A supprissioni s'avissi a' adupirari <strong>sulu</strong> nta sti casi:\n* nfurmazzioni putenzialmenti diffamatorî\n* nfurmazzioni pirsunali inuppurtuni\n*: <em>nnirizzi di casa, nùmmira di tilèfunu, còdici fiscali, etc.</em>",
+       "revdelete-confirm": "Pi favuri cunferma chi hai ntinzioni di fari sta cosa, chi capisci quali sù li sò cunziguenzi, e chi stai prucidennu ntô rispettu dî [[{{MediaWiki:Policy-url}}|lìnii guida]].",
+       "revdelete-suppress-text": "La supprissioni s'avissi a adupirari <strong>sulu</strong> nta sti casi:\n* nfurmazzioni putinzialmenti diffamatorî\n* nfurmazzioni pirsunali nun oppurtuni\n*: <em>nnirizzi di casa, nùmmira di telèfunu, còdici fiscali, ecc.</em>",
        "revdelete-legend": "Mposta li limitazzioni siquenti supra li virsioni cancillati:",
        "revdelete-hide-text": "Testu dâ virsioni",
        "revdelete-hide-image": "Ammuccia lu cuntinutu dû file",
        "revdelete-unsuppress": "Elìmina le limitazzioni su li rivisioni ripristinati",
        "revdelete-log": "Mutivu:",
        "revdelete-submit": "Àpplica {{PLURAL:$1|â virsioni scigghiuta|ê virsioni scigghiuti}}",
-       "revdelete-success": "Visibbilitati dâ virsioni mpustata currittamenti.",
-       "revdelete-failure": "A visibbilitati dâ virsioni nun potti èssiri mpustata:\n$1",
+       "revdelete-success": "Visibbilità dâ virsioni mpustata currettamenti.",
+       "revdelete-failure": "La visibbilità dâ virsioni nun potti èssiri mpustata:\n$1",
        "logdelete-success": "Visibbilità di l'eventu mpustata currettamenti.",
        "logdelete-failure": "'''La visibilità dû eventu nun po essiri impustata:'''\n$1",
        "revdel-restore": "cancia la visibbilità",
        "revdelete-modify-no-access": "Impussibili canciari l'oggettu cu data $1 $2 in quantu fu identificatu comu \"riservatu\" e nun si disponi di lu rilativu accessu.",
        "revdelete-modify-missing": "Impossibili canciari l'oggettu cu ID $1 in quantu nun è presenti nô database.",
        "revdelete-no-change": "'''Attenzioni:''' l'oggettu cu data $1 $2 aveva già l'impostazioni di visibilità richiesti.",
-       "revdelete-concurrent-change": "Impussibili canciari l'oggettu cu data $1 $2 in quantu lu sò statu fu canciatu da n'autru utenti mentri si tintava lu canciamentu.\nCuntrolla lu log.",
+       "revdelete-concurrent-change": "Mpussìbbili canciari l'oggettu cu data $1 $2 n quantu lu sò statu fu canciatu di n'àutru utenti mentri si tintava lu canciamentu.\nCuntrolla lu log.",
        "revdelete-only-restricted": "Erruri nta l'ammucciamentu di l'elimentu datatu $2,$1: Nun si ponnu livari elimenti dâ vista di l'amministratura senza puru scègghiri una di l'àutri opzioni di visibbilità.",
-       "revdelete-reason-dropdown": "* Mutivi cchiu' cumuni pâ cancillazzioni\n** Viulazzioni dû drittu d'auturi\n** Cummenti o nfurmazzioni pirsunali inuppurtuni\n** Nomu utenti inuppurtunu\n** Nfurmazzioni putenzialmenti diffamatorî",
-       "revdelete-otherreason": "Autru/ultiriuri mutivu:",
+       "revdelete-reason-dropdown": "* Mutivi cchiù cumuni pâ cancillazzioni\n** Viulazzioni dû drittu d'auturi\n** Cummenti o nfurmazzioni pirsunali nun oppurtuni\n** Nomu utenti nun oppurtunu\n** Nfurmazzioni putinzialmenti diffamatorî",
+       "revdelete-otherreason": "Àutru/ultiriuri mutivu:",
        "revdelete-reasonotherlist": "Àutru mutivu",
        "revdelete-edit-reasonlist": "Cancia li mutivazioni pi la cancillazzioni",
        "revdelete-offender": "Auturi dâ virsioni:",
        "mergehistory-go": "Vidi li canciamenti ca ponnu èssiri junciuti",
        "mergehistory-submit": "Junci li virsioni",
        "mergehistory-empty": "Nudda virsioni di jùnciri.",
-       "mergehistory-success": "$3 {{PLURAL:$3|virsioni di [[:$1]] fu junciuta|$3 virsioni di [[:$1]] foru junciuti}} â crunuluggìa di [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|virsioni di $1 fu junciuta|$3 virsioni di $1 foru junciuti}} â crunuluggìa di [[:$2]].",
        "mergehistory-fail": "Nun fu pussìbbili jùnciri li crunuluggìi, pi favuri cuntrolla n'àutra vota li paràmitri chi spicìficanu li pàggini e li dati.",
-       "mergehistory-fail-toobig": "Nun fu pussìbbili jùnciri li crunuluggìi pirchì s'avìssiru a spustari cchiossai virsioni dû lìmiti chi è $1.",
+       "mergehistory-fail-toobig": "Nun fu pussìbbili jùnciri li crunuluggìi pirchì s'avìssiru a spustari cchiossai virsioni dû lìmiti chi è {{PLURAL:$1|$1}}.",
        "mergehistory-no-source": "La pàggina d'orìggini $1 nun esisti.",
        "mergehistory-no-destination": "La pàggina di distinazzioni $1 nun esisti.",
        "mergehistory-invalid-source": "La pàggina d'orìggini havi a aviri nu tìtulu vàlidu.",
        "showhideselectedversions": "Cancia la visibbilità dî virsioni scigghiuti",
        "editundo": "annulla",
        "diff-empty": "(Nudda diffirenza)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} dû stissu utenti nun {{PLURAL:$1|mustrata|mustrati}})",
-       "diff-multi-otherusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di {{PLURAL:$2|n'autru utenti|autri $2 utenti}} nun {{PLURAL:$1|mustrata|mustrati}})",
-       "diff-multi-manyusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di cchiu' ssai di {{PLURAL:$2|n'autru utenti|autri $2 utenti}} nun {{PLURAL:$1|mustrata|mustrati}})",
+       "diff-multi-sameuser": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} dû stissu utenti nun {{PLURAL:$1|ammustrata|ammustrati}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di {{PLURAL:$2|n'àutru utenti|àutri $2 utenti}} nun {{PLURAL:$1|ammustrata|ammustrati}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di cchiossai di {{PLURAL:$2|n'àutru utenti|àutri $2 utenti}} nun {{PLURAL:$1|ammustrata|ammustrati}})",
        "difference-missing-revision": "{{PLURAL:$2|Na virsioni|$2 virsioni}} di sta diffirenza ($1) {{PLURAL:$2|nun fu attruvata|nun foru attruvati}}.\n\nStu fattu di sòlitu succedi quannu si segui nu lijami di diffirenza versu na pàggina chi fu cancillata.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
        "searchresults": "Risurtati di l'arricerca",
        "searchresults-title": "Risurtati di l'arricerca di \"$1\"",
        "shown-title": "Ammustra {{PLURAL:$1|nu risultatu|$1 risultati}} pi pàggina",
        "viewprevnext": "Talìa ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "* Pàggina '''[[$1]]'''",
-       "searchmenu-new": "<strong>Crea la pàggina \"[[:$1]]\" supra a' sta wiki!<strong> {{PLURAL:$2|0=|Talìa macari la pàggina truvata câ to risciduta.|Talìa macari li risultati dâ to risciduta.}}",
+       "searchmenu-new": "<strong>Crea la pàggina \"[[:$1]]\" supra a sta wiki!<strong> {{PLURAL:$2|0=|Talìa macari la pàggina attruvata câ tò arricerca.|Talìa macari li pàggini attruvati câ tò arricerca.}}",
        "searchprofile-articles": "Pàggini di cuntinutu",
        "searchprofile-images": "File Multimidiali",
        "searchprofile-everything": "Tuttu",
        "search-section": "(sizzioni $1)",
        "search-category": "(catigurìa $1)",
        "search-file-match": "(currispunnenza ntô cuntinutu dûn file)",
-       "search-suggest": "Forsi circavutu: $1",
+       "search-suggest": "Forsi circàvitu: $1",
        "search-rewritten": "Sunnu ammustrati li risurtati pi $1. Mmeci cerca $2.",
        "search-interwiki-caption": "Pruggetti frati",
-       "search-interwiki-default": "Risultati di $1:",
+       "search-interwiki-default": "Risurtati di $1:",
        "search-interwiki-more": "(cchiù)",
        "search-relatedarticle": "Risultati currilati",
        "searchrelated": "currilati",
        "searchall": "tutti",
        "showingresults": "Ammustra nzinu a {{PLURAL:$1|'''1''' risurtatu|'''$1''' risurtati}} a pàrtiri dô nùmmuru '''$2'''.",
        "showingresultsinrange": "Ccassutta {{PLURAL:$1|è ammustratu <strong>1</strong> risultatu|sunnu ammustrati <strong>$1</strong> risurtati}} nta lu ntirvallu di #<strong>$2</strong> a #<strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|Risultatu <strong>$1</strong> di <strong>$3</strong>|Risultati <strong>$1 - $2</strong> di <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|Risurtatu <strong>$1</strong> di <strong>$3</strong>|Risurtati <strong>$1 - $2</strong> di <strong>$3</strong>}}",
        "search-nonefound": "La circata nun desi nuddu risurtatu.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca ntê namespace:",
        "powersearch-remember": "Arricòrdati la scigghiuta pi l'arricerchi futuri",
        "search-external": "Ricerca sterna",
        "searchdisabled": "La circata nterna di {{SITENAME}} hà statu disabbilitata. Nta stu mentri, poi usari la circata supra Google o supra àutri muturi di circata. Accura ca li sò ìnnici dê cuntinuti di {{SITENAME}} ponnu nun èssiri aggiurnati.",
-       "search-error": "Mmattìu n'erruri duranti a risciduta: $1",
+       "search-error": "Ammattìu n'erruri duranti l'arricerca: $1",
        "preferences": "Prifirenzi",
-       "mypreferences": "Li me prifirenzi",
+       "mypreferences": "Li mè prifirenzi",
        "prefs-edits": "Nùmmiru di canciamenti:",
-       "prefsnologintext2": "Hâ' tràsiri pi' canciari i to prifirenzi.",
+       "prefsnologintext2": "Hai a tràsiri pi canciari li tò prifirenzi.",
        "prefs-skin": "Peddi",
        "skin-preview": "Antiprima",
        "datedefault": "Nudda prifirenza",
        "rows": "Righi:",
        "columns": "Culonni:",
        "searchresultshead": "Arricerca",
-       "stub-threshold": "Sogghia pi furmattari na liami comu bozza ($1):",
+       "stub-threshold": "Sogghia pi furmattari nu liami comu bozza ($1):",
        "stub-threshold-sample-link": "esempiu",
        "stub-threshold-disabled": "Disattivatu",
        "recentchangesdays": "Nùmmiru di jorna a ammustrari nta l'ùrtimi canciamenti:",
        "timezoneregion-indian": "Ocèanu Innianu",
        "timezoneregion-pacific": "Ocèanu Pacìficu",
        "allowemail": "Cunzenti la ricizzioni di posta elittrònica di l'àutri utenti",
-       "prefs-searchoptions": "Risciduta",
+       "prefs-searchoptions": "Arricerca",
        "prefs-namespaces": "Namespace",
        "default": "pridifinutu",
        "prefs-files": "File",
        "yournick": "Firma nova:",
        "prefs-help-signature": "Li cummenti ntê pàggini di discussioni s'avìssiru a firmari cu \"<nowiki>~~~~</nowiki>\", ca veni cunvirtutu ntâ tò firma cu appressu la data.",
        "badsig": "Firma grezza nun vàlida.\nCuntrolla l'etichetti HTML.",
-       "badsiglength": "La tò firma è troppu longa.\nNun havi a èssiri cchiù longa di $1 {{PLURAL:$1|caràttiri|caràttiri}}.",
+       "badsiglength": "La tò firma è troppu longa.\nNun havi a èssiri cchiù longa di $1 {{PLURAL:$1|caràttiri}}.",
        "yourgender": "Comu prifirisci èssiri discrivutu?",
        "gender-unknown": "Quannu t'ammintua, si pò, lu prugramma adòpira lu gèniri grammaticali nèutru",
        "gender-male": "È riggistratu supra {{SITENAME}}",
        "prefs-displaywatchlist": "Opzioni di visualizzazzioni",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Diffirenzi",
-       "prefs-help-prefershttps": "Sta prifirenza faravi effettu â to pròssima trasuta.",
-       "prefswarning-warning": "Hai fattu canciamenti ê to prifirenzi chi' ancora nun furu sarvati.\nSi' ti nni vai di sta pàggina senza carcari \"$1\" i to prifirenzi nun sarannu sarvati.",
-       "prefs-tabs-navigation-hint": "Cunsigghiu: Poi adupirari i buttuni fileccia manca e' dritta pi' navigari tra dî linguetti ntâ lista.",
-       "email-address-validity-valid": "U nnirizzu e-mail pari bonu",
-       "email-address-validity-invalid": "Nsirisci nu nnirizzu e-mail bonu",
+       "prefs-help-prefershttps": "Sta prifirenza fa effettu â tò pròssima trasuta.",
+       "prefswarning-warning": "Facisti canciamenti ê tò prifirenzi chi ancora nun foru sarvati.\nSi ti nni vai di sta pàggina senza carcari \"$1\" li tò prifirenzi nun sunnu sarvati.",
+       "prefs-tabs-navigation-hint": "Cunzigghiu: Poi adupirari li buttuna fileccia a manu manca e a manu dritta pi navigari tra dî linguetti ntâ lista.",
+       "email-address-validity-valid": "Lu nnirizzu e-mail pari bonu",
+       "email-address-validity-invalid": "Nzirisci nu nnirizzu e-mail bonu",
        "userrights": "Gistioni dî dritti di l'utenti",
        "userrights-lookup-user": "Gistisci li gruppi di l'utenti",
        "userrights-user-editname": "Metti nu nomu utenti:",
        "userrights-editusergroup": "Cancia li gruppi di l'utenti",
        "saveusergroups": "Sarva li gruppi di l'utenti",
        "userrights-groupsmember": "Membru di:",
-       "userrights-groupsmember-auto": "Membru implìcitu di:",
+       "userrights-groupsmember-auto": "Membru mplìcitu di:",
        "userrights-groups-help": "Poi canciari li gruppi unni è assignatu l'utenti:\n* Na casedda scigghiuta voli diri chi l'utenti fa parti dû gruppu.\n* Na casedda nun scigghiuta voli diri chi l'utenti nun fa parti dû gruppu.\n* Lu sìmmulu * voli diri chi nun si pò cchiù livari l'utenti dûn gruppu na vota chi fu agghiunciutu, o vici versa.",
        "userrights-reason": "Mutivu:",
        "userrights-no-interwiki": "Nun hai lu pirmissu di canciari li dritti di l'utenti nta l'àutri wiki.",
        "right-reupload-shared": "Suprascrìviri lucalmenti file prisenti ntô dipòsitu cunnivisu",
        "right-upload_by_url": "Carricari file partennu di n'URL",
        "right-purge": "Svacantari la cache dû situ di na pàggina senza cunferma",
-       "right-autoconfirmed": "Nun èssiri suggettu ê lìmiti basati supra a' l'IP",
+       "right-autoconfirmed": "Nun èssiri suggettu ê lìmiti basati supra a l'IP",
        "right-bot": "Èssiri trattatu comu nu prucessu autumàticu",
        "right-nominornewtalk": "Nun fari pàrtiri l'avvisu di misaggiu novu quannu si fannu canciamenti nichi ntê pàggini di discussioni",
        "right-apihighlimits": "Aviri lìmiti cchiù àuti pi li ntirrugazzioni a menzu API",
        "right-protect": "Canciari li liveddi di prutizzioni e canciari pàggini prutetti a cascata",
        "right-editprotected": "Canciari pàggini cu prutizzioni \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Canciari pàggini cu prutizzioni \"{{int:protect-level-autoconfirmed}}\"",
-       "right-editcontentmodel": "Canciari u mudellu di cuntinutu di na pàggina",
+       "right-editcontentmodel": "Canciari lu mudellu di cuntinutu di na pàggina",
        "right-editinterface": "Canciari la ntirfaccia utenti",
        "right-editusercssjs": "Canciari li file CSS e JavaScript di l'àutri utenti",
        "right-editusercss": "Canciari li file CSS di l'àutri utenti",
        "action-applychangetags": "appizzari etichetti ntê tò canciamenti",
        "action-changetags": "agghiùnciri e livari a piaciri etichetti dî virsioni e dî vuci di riggistru",
        "nchanges": "$1 {{PLURAL:$1|canciamentu|canciamenti}}",
-       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|di l'ùltima vìsita}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|di l'ùrtima vìsita}}",
        "enhancedrc-history": "crunuluggìa",
        "recentchanges": "Ùrtimi canciamenti",
        "recentchanges-legend": "Opzioni pi l'ùrtimi canciamenti",
        "recentchanges-label-bot": "Stu canciamentu fu fattu di nu bot",
        "recentchanges-label-unpatrolled": "Stu canciamentu ancora nun fu virificatu",
        "recentchanges-label-plusminus": "La grannizza dâ pàggina canciau di stu nùmmiru di byte",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "'''Ligenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (talìa puru [[Special:NewPages|la lista dî pàggini novi]])",
        "rcnotefrom": "Ccassutta {{PLURAL:$5|c'è lu canciamentu|ci sù li canciamenti}} a pàrtiri dû <strong>$3, $4</strong> (nn'havi ammustrati nfina a <strong>$1</strong>).",
        "rclistfrom": "Ammustra li canciamenti novi a pàrtiri dû $3 $2",
        "reuploaddesc": "Annulla lu carricamentu e torna a lu mòdulu dî carricamenti",
        "upload-tryagain": "Manna la discrizzioni canciata dû file",
        "uploadnologin": "Nun trasutu",
-       "uploadnologintext": "Hâ' $1 pi' putiri carricari file.",
+       "uploadnologintext": "È nicissariu $1 pi putiri carricari file.",
        "upload_directory_missing": "La cartella dî carricamenti ($1) nun esisti lu server web nun arriniscìu a criàrila.",
        "upload_directory_read_only": "La cartella dî carricamenti ($1) nun è scrivìbbili dû server web.",
        "uploaderror": "Erruri ntô carricamentu",
        "illegalfilename": "Lu nomu dû file \"$1\" cunteni caràttiri chi nun sù cunzintuti ntê tìtuli dî pàggini.\nPi favuri cancia nomu ô file e prova e càrricalu n'àutra vota.",
        "filename-toolong": "Li nomi dî file nun ponnu èssiri cchiù longhi di 240 byte.",
        "badfilename": "Lu nomu dû file fu canciatu nta \"$1\".",
-       "filetype-mime-mismatch": "L'estinsioni dû file, \".$1\", nun currispunni ô tipu MIME rilivatu ntô file ($2).",
+       "filetype-mime-mismatch": "L'estinzioni dû file, \".$1\", nun currispunni ô tipu MIME rilivatu ntô file ($2).",
        "filetype-badmime": "Nun è cunzintutu di carricari file di tipu MIME \"$1\".",
        "filetype-bad-ie-mime": "Nun si pò carricari stu file pirchì Internet Explorer lu canuscissi comu \"$1\", ca è nu tipu di file nun cunzintutu e ca putissi èssiri piriculusu.",
        "filetype-unwanted-type": "<strong>\".$1\"</strong> è nu tipu di file nun vulutu.\n{{PLURAL:$3|Lu tipu di file cunzigghiatu è|Li tipi di file cunzigghiati sunnu}} $2.",
-       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|nun è un tipu di file cunsintutu|nun su' tipi di file cunsintuti}}.\n{{PLURAL:$3|U tipu di file cunsintutu è|I tipi di file cunsintuti su'}} $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|nun è un tipu di file cunzintutu|nun sunnu tipi di file cunzintuti}}.\n{{PLURAL:$3|Lu tipu di file cunzintutu è|Li tipi di file cunzintuti sunnu}} $2.",
        "filetype-missing": "Lu file nun havi stinzioni (p'esempiu \".jpg\").",
        "empty-file": "Lu file chi mannasti era vacanti.",
        "file-too-large": "Lu file chi mannasti era troppu grossu.",
        "verification-error": "Stu file nun passau â virìfica.",
        "hookaborted": "Lu canciamentu chi stavi pruvannu a fari fu annullatu di n'estinzioni.",
        "illegal-filename": "Stu nomu dû file nun è cunzintutu.",
-       "overwrite": "Suprascrìviri nu file chi' già esisti nun è cunsintutu.",
+       "overwrite": "Suprascrìviri nu file chi già esisti nun è cunzintutu.",
        "unknown-error": "Ammattìu n'erruri scanusciutu.",
-       "tmp-create-error": "Nun fu pussìbbili criari u file timpuraniu.",
-       "tmp-write-error": "Erruri ntâ scrittura dû file timpuraniu.",
+       "tmp-create-error": "Nun fu pussìbbili criari lu file timpuràniu.",
+       "tmp-write-error": "Erruri ntâ scrittura dû file timpuràniu.",
        "large-file": "Si raccumanna di nun passari la grannizza di $1 p'ogni file; stu file è granni $2.",
        "largefileserver": "Stu file è cchiù grossu di quantu lu server è cunfiguratu a accittari.",
        "emptyfile": "Lu file chi carricasti pari vacanti.\nChistu putissi èssiri pruvucatu di nu sbagghiu ntô nomu dû file.\nCuntrolla ca pi daveru voi carricari stu file.",
-       "windows-nonascii-filename": "Sta wiki nun supporta i nomi di file cu' caràttiri spiciali.",
-       "fileexists": "Nu file cu' stu nomu già esisti, pi' favuri cuntrolla <strong>[[:$1]]</strong> si' nun si' {{GENDER:|sicuru|sicura}} ch'u voi canciari.\n[[$1|thumb]]",
+       "windows-nonascii-filename": "Sta wiki nun supporta li nomi di file cu caràttiri spiciali.",
+       "fileexists": "Nu file cu stu nomu già esisti, pi favuri cuntrolla <strong>[[:$1]]</strong> si nun sî {{GENDER:|sicuru|sicura}} chi lu voi canciari.\n[[$1|thumb]]",
        "filepageexists": "La pàggina dâ discrizzioni di stu file fu già criata ô nnirizzu <strong>[[:$1]]</strong>, ma pi com'ora nun c'è nuddu file cu stu nomu.\nLu riassuntu chi nzirisci nun cumpari ntâ pàggina dâ discrizzioni.\nPi fàrilu cumpàriri, hai a canciari a manu dda pàggina.\n[[$1|thumb]]",
-       "fileexists-extension": "Nu file cûn nomu simili già esisti: [[$2|thumb]]\n* Nomu dû file carricannu: <strong>[[:$1]]</strong>\n* Nomu dû file esistenti: <strong>[[:$2]]</strong>\nForsi voi scègghîri un nomu cchiù' distintivu?",
+       "fileexists-extension": "Nu file cûn nomu sìmili già esisti: [[$2|thumb]]\n* Nomu dû file carricatu: <strong>[[:$1]]</strong>\n* Nomu dû file esistenti: <strong>[[:$2]]</strong>\nForsi voi scègghiri un nomu cchiù carattirìsticu?",
        "fileexists-thumbnail-yes": "Lu file carricato sembra èssiri lu risurtatu di n'antiprima ''(thumbnail)''. [[$1|thumb]]\nVirificari, pi cunfruntu, lu file <strong>[[:$1]]</strong>.\nSiduu si tratta dâ stissa mmagini, nte dimenzioni urigginali, nun è nicissariu carricara àutri antiprimi.",
        "file-thumbnail-no": "Lu nomu dô file accumenza cu <strong>$1</strong>.\nPari quinni èssiri lu risurtatu di n'antiprima ''(thumbnail)''.\nSiddu si disponi dâ mmàggini ntâ risuluzzioni urigginali, si prega di carricàrila. 'N casu cuntrariu, si prega di canciari lu nomu dô file.",
        "fileexists-forbidden": "Nu file cu stu nomu asisti già e nun pò essiri sovrascrittu. Turnari n'arreri e canciari lu nomu cu lu quali carricari lu file. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Nu file cu stu nomu asisti già nta l'archiviu dî risursi multimidiali cundivisi. Siddu voi ancora carricari lu file, pi favuri torna n'arreri e cancia lu nomu ca voi dari a lu file. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Stu file è na copia duppiuni {{PLURAL:$1|dû|dî}} file ccà di sècutu:",
-       "file-deleted-duplicate": "Nu file lu stissu comu a chistu file ([[:$1]]) vinni scanciallatu prima di ora. S'aviss'a cuntrullari la stòria e lu picchì dâ scancillazzioni dû file prima di ri-caricàrilu.",
-       "file-deleted-duplicate-notitle": "Nu file idènticu a' chistu hâ statu cancillatu, e u tìtulu fu supprimutu.\nTu avissi a' dumannari a' quarchidunu chi' havi a pussibbilità di vìdiri u cuntinutu dû file suppressu di valutari a situazzioni, prima di prucèdiri a' carricàrilu n'autra vota.",
+       "file-deleted-duplicate": "Nu file lu stissu comu a stu file ([[:$1]]) vinni scancillatu prima di ora. S'avissi a cuntrullari la storia e lu pirchì dâ scancillazzioni dû file prima di carricàrilu arrè.",
+       "file-deleted-duplicate-notitle": "Nu file idènticu a chistu fu cancillatu, e lu tìtulu fu supprimutu.\nTu avissi a addumannari a quarchidunu chi havi la pussibbilità di vìdiri lu cuntinutu dû file suppressu di valutari la situazzioni, prima di prucèdiri a carricàrilu n'àutra vota.",
        "uploadwarning": "Avvisu pû carricamentu",
        "uploadwarning-text": "Cancia ccassutta la discrizzioni dû file e prova n'àutra vota.",
        "savefile": "Sarva lu file",
        "uploaded-setting-handler-svg": "Lu còdici SVG ca mposta l'attribbutu \"handler\" a na distinazzioni rimota/data/script veni bluccatu. Fu attruvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
        "uploaded-remote-url-svg": "Lu còdici SVG ca mposta n'attribbutu style qualegghiè versu di n'URL rimota veni bluccatu. Fu attruvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
        "uploaded-image-filter-svg": "Fu attruvatu nu filtru di mmàggini cu URL <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
-       "uploadscriptednamespace": "Stu file SVG cunteni nu namespace nun cunsintutu, \"$1\".",
+       "uploadscriptednamespace": "Stu file SVG cunteni nu namespace nun cunzintutu, \"$1\".",
        "uploadinvalidxml": "L'XML ntô file carricatu nun potti èssiri analizzatu sintatticamenti.",
        "uploadvirus": "Lu file cunteni un virus!\nDittagghî: $1",
        "uploadjava": "Stu file è n'archiviu ZIP chi cunteni nu file .class Java.\nCarricari file Java nun è cunzintutu pirchì pirmèttinu d'aggirari li ristrizzioni di sicurizza.",
        "upload-success-subj": "Carricamentu arrinisciutu",
        "upload-success-msg": "Lu tò carricamentu di [$2] arriniscìu. Ccà c'è lu file carricatu: [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "Prubblema ntô carricamentu",
-       "upload-failure-msg": "Mmattìu un prubblema ntô to carricamentu di [$2]:\n\n$1",
-       "upload-warning-subj": "Avvirtimentu pû carricamentu",
-       "upload-warning-msg": "Mmattìu un prubblema ntô to carricamentu di [$2]. Poi turnari ô [[Special:Upload/stash/$1|mòdulu di carricamentu]] pi' currèggiri stu prubblema.",
+       "upload-failure-msg": "Ammattìu un prubblema ntô tò carricamentu di [$2]:\n\n$1",
+       "upload-warning-subj": "Avvisu pû carricamentu",
+       "upload-warning-msg": "Ammattìu un prubblema ntô tò carricamentu di [$2]. Poi turnari ô [[Special:Upload/stash/$1|mòdulu di carricamentu]] pi currèggiri stu prubblema.",
        "upload-proto-error": "Protucollu erratu",
        "upload-proto-error-text": "Pi l'upload rimotu è nicissariu spicificari URL ca nìzzianu cu <code>http://</code> oppuru <code>ftp://</code>.",
        "upload-file-error": "Erruri nternu",
        "upload-http-error": "Ammattìu n'erruri HTTP: $1",
        "upload-copy-upload-invalid-domain": "Lu carricamentu di copî nun è cunzintutu di stu duminiu.",
        "upload-dialog-title": "Carricamentu dûn file",
-       "upload-dialog-error": "Ammattìu n'erruri",
-       "upload-dialog-warning": "Ammattìu n'avvisu",
        "upload-dialog-button-cancel": "Annulla",
        "upload-dialog-button-done": "Finutu",
        "upload-dialog-button-save": "Sarva",
        "upload-dialog-button-upload": "Càrrica",
-       "upload-dialog-label-select-file": "Scegghi lu file",
-       "upload-dialog-label-infoform-title": "Dittagghî",
-       "upload-dialog-label-infoform-name": "Nomu",
-       "upload-dialog-label-infoform-description": "Discrizzioni",
-       "upload-dialog-label-usage-title": "Usu",
-       "upload-dialog-label-usage-filename": "Nomu dû file",
+       "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",
+       "upload-form-label-infoform-description": "Discrizzioni",
+       "upload-form-label-usage-title": "Usu",
+       "upload-form-label-usage-filename": "Nomu dû file",
        "backend-fail-stream": "Nun fu pussìbbili trasmèttiri lu file \"$1\".",
-       "backend-fail-backup": "Nun fu' pussìbbili fari na copia di riserva dû file \"$1\".",
+       "backend-fail-backup": "Nun fu pussìbbili fari na copia di riserva dû file \"$1\".",
        "backend-fail-notexists": "Lu file $1 nun esisti.",
        "backend-fail-hashes": "Nun fu pussìbbili ottèniri l'hash dî file pi fari lu cunfruntu.",
-       "backend-fail-notsame": "Già esisti un file nun idènticu a' \"$1\".",
+       "backend-fail-notsame": "Già esisti un file nun idènticu a \"$1\".",
        "backend-fail-invalidpath": "\"$1\" nun è un caminu d'archiviazzioni vàlidu.",
        "backend-fail-delete": "Nun fu pussìbbili cancillari lu file \"$1\".",
        "backend-fail-describe": "Nun fu pussìbbili canciari li metadati dû file \"$1\".",
        "backend-fail-copy": "Nun fu pussìbbili cupiari lu file \"$1\" nta \"$2\".",
        "backend-fail-move": "Nun fu pussìbbili spustari lu file \"$1\" nta \"$2\".",
        "backend-fail-opentemp": "Nun fu pussìbbili gràpiri lu file timpuràniu.",
-       "backend-fail-writetemp": "Nun fu' pussìbbili scrìviri ntô file timpuraniu.",
+       "backend-fail-writetemp": "Nun fu pussìbbili scrìviri ntô file timpuràniu.",
        "backend-fail-closetemp": "Nun fu pussìbbili chiùdiri lu file timpuràniu.",
        "backend-fail-read": "Nun fu pussìbbili lèggiri lu file \"$1\".",
        "backend-fail-create": "Nun fu pussìbbili scrìviri lu file \"$1\".",
        "backend-fail-contenttype": "Nun fu pussìbbili ditirminari lu tipu di cuntinutu dû file di mimurizzari nti \"$1\".",
        "backend-fail-batchsize": "Lu backend di mimurizzazzioni arricivìu na nfurnata di {{PLURAL:$1|una opirazzioni|$1 opirazzioni}} tra file; pirò lu sò lìmiti è di {{PLURAL:$2|na sula opirazzioni|$2 opirazzioni}}.",
        "backend-fail-usable": "Nun fu pussìbbili lèggiri o scrìviri lu file \"$1\" a càusa di pirmissi nzufficienti o cartelli/cuntinituri ammancanti.",
-       "filejournal-fail-dbconnect": "Nun fu' pussìbbili culligàrisi â basi di dati giurnali dû backend di mimurizzazzioni \"$1\".",
+       "filejournal-fail-dbconnect": "Nun fu pussìbbili culligàrisi â basi di dati giurnali dû backend di mimurizzazzioni \"$1\".",
        "filejournal-fail-dbquery": "Nun fu pussìbbili aggiurnari la basi di dati giurnali dû backend di mimurizzazzioni \"$1\".",
-       "lockmanager-notlocked": "Nun fu' pussìbbili sbluccari \"$1\"; nun è bluccatu.",
+       "lockmanager-notlocked": "Nun fu pussìbbili sbluccari \"$1\"; nun è bluccatu.",
        "lockmanager-fail-closelock": "Nun fu pussìbbili chiùdiri lu file di bloccu di \"$1\".",
        "lockmanager-fail-deletelock": "Nun fu pussìbbili cancillari lu file di bloccu di \"$1\".",
-       "lockmanager-fail-acquirelock": "Nun fu' pussìbbili pigghiari pussèssu dû bloccu di \"$1\".",
+       "lockmanager-fail-acquirelock": "Nun fu pussìbbili pigghiari pussessu dû bloccu di \"$1\".",
        "lockmanager-fail-openlock": "Nun fu pussìbbili gràpiri lu file di bloccu di \"$1\".",
        "lockmanager-fail-releaselock": "Nun fu pussibbili arrènniri lu bloccu di \"$1\".",
-       "lockmanager-fail-db-bucket": "Nun fu' pussìbbili cuntattàri abbastanza basi di dati di bloccu ntô bucket $1.",
+       "lockmanager-fail-db-bucket": "Nun fu pussìbbili cuntattari abbastanti basi di dati di bloccu ntô bucket $1.",
        "lockmanager-fail-db-release": "Nun fu pussìbbili arrènniri li blocchi dâ basi di dati $1.",
-       "lockmanager-fail-svr-acquire": "Nun fu' pussìbbili pigghiari pussessu dî blocchi dû server $1.",
+       "lockmanager-fail-svr-acquire": "Nun fu pussìbbili pigghiari pussessu dî blocchi dû server $1.",
        "lockmanager-fail-svr-release": "Nun fu pussìbbili arrènniri li blocchi dû server $1.",
-       "zip-file-open-error": "Mmattìu n'erruri nta l'apirtura dû file pî cuntrolli di ZIP.",
+       "zip-file-open-error": "Ammattìu n'erruri ntâ grapitura dû file pî cuntrolli di ZIP.",
        "zip-wrong-format": "Lu file spicificatu nun era nu file ZIP.",
        "zip-bad": "Lu file è nu file ZIP chi è ruinatu o nun è liggìbbili pi quarchi n'àutru mutivu.\nNun si pò cuntrullari bona la sò sicurizza.",
        "zip-unsupported": "Lu file è nu file ZIP chi cunteni carattirìstichi ZIP chi nun sù suppurtati dâ MediaWiki.\nNun si pò cuntrullari bona la sò sicurizza.",
-       "uploadstash": "Ammucciàgghia dî carricamenti",
+       "uploadstash": "Ammucciagghia dî carricamenti",
        "uploadstash-summary": "Sta pàggina duna accessu ê file chi foru carricati, o si stannu carricannu, pirò ancora nun foru pubblicati ntâ wiki. Sti file nun sù visìbbili a nuddu sparti di cui li carricau.",
        "uploadstash-clear": "Cancella li file nta l'ammucciagghia",
        "uploadstash-nofiles": "Nun hai nuddu file nta l'ammucciagghia.",
        "img-auth-nopathinfo": "Variàbbili PATH_INFO ammancanti.\nLu tò server nun è mpustatu pi passari sta nfurmazzioni.\nPurrìa èssiri basatu supra a CGI e nun pò suppurtari img_auth.\nTalìa https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Lu caminu addumannatu nun è ntâ cartella cunfigurata pî carricamenti.",
        "img-auth-badtitle": "Nun fu pussìbbili custruiri nu tìtulu vàlidu a pàrtiri di \"$1\".",
-       "img-auth-nologinnWL": "Nun si' trasutu e \"$1\" nun è ntâ lista janca.",
+       "img-auth-nologinnWL": "Nun trasisti e \"$1\" nun è ntâ lista janca.",
        "img-auth-nofile": "Lu file \"$1\" nun esisti.",
-       "img-auth-isdir": "Stai pruvannu a' accèdiri a' na cartella, \"$1\".\nE' cunsintutu l'accessu sulu ê file.",
+       "img-auth-isdir": "Stai pruvannu a accèdiri a na cartella, \"$1\".\nÈ cunzintutu l'accessu sulu ê file.",
        "img-auth-streaming": "Trasmissioni di \"$1\".",
-       "img-auth-public": "U prupòsitu di img_auth.php è di emèttiri file di na wiki privata.\nSta wiki è cunfigurata comu wiki pùbblica.\nPi' sicurezza, img_auth.php fu' disattivatu.",
+       "img-auth-public": "Lu prupòsitu di img_auth.php è di emèttiri file di na wiki privata.\nSta wiki è cunfigurata comu wiki pùbblica.\nPi sicurizza, img_auth.php fu disattivatu.",
        "img-auth-noread": "L'utenti nun havi pirmissu di lèggiri \"$1\".",
-       "http-invalid-url": "URL nun validu: $1",
-       "http-invalid-scheme": "L'URL cu' schema \"$1\" nun su' suppurtati.",
-       "http-request-error": "A richiesta HTTP fallìu pi' causa di n'erruri scanusciutu.",
+       "http-invalid-url": "URL nun vàlidu: $1",
+       "http-invalid-scheme": "L'URL cu schema \"$1\" nun sunnu suppurtati.",
+       "http-request-error": "L'addumannata HTTP fallìu a càusa di n'erruri scanusciutu.",
        "http-read-error": "Erruri di littura HTTP.",
        "http-timed-out": "L'addumannata HTTP scadìu.",
        "http-curl-error": "Erruri ntô scarricamentu di l'URL: $1",
        "filehist-nothumb": "Nudda miniatura",
        "filehist-user": "Utenti",
        "filehist-dimensions": "Diminsioni",
-       "filehist-filesize": "Dimensioni dû file",
+       "filehist-filesize": "Diminzioni dû file",
        "filehist-comment": "Cummentu",
        "imagelinks": "Usu dû file",
        "linkstoimage": "{{PLURAL:$1|La pàggina siquenti richiàma|Li $1 pàggini siquenti richiàmanu}} stu file:",
        "filerevert-legend": "Riprìstina file",
        "filerevert-intro": "Stai pi ripristinari lu file '''[[Media:$1|$1]]''' â [virsioni $4 dô $2, $3].",
        "filerevert-comment": "Mutivu:",
-       "filerevert-defaultcomment": "Ripristinata la virsioni dô $1, $2",
+       "filerevert-defaultcomment": "Ripristinata la virsioni dô $1, $2 ($3)",
        "filerevert-submit": "Riprìstina",
        "filerevert-success": "'''Lu file [[Media:$1|$1]]''' hà statu ripristinatu â [$4 virsioni dô $2, $3].",
        "filerevert-badversion": "Nun esistanu virsiona locali pricidenti dô file cû timestamp richiestu.",
        "filedelete-maintenance": "La cancillazzioni e lu riprìstinu dî file sù timpuraniamenti disattivati duranti la manutinzioni.",
        "filedelete-maintenance-title": "Mpussìbbili cancillari lu file",
        "mimesearch": "Arricerca pi tipu MIME",
-       "mimesearch-summary": "Sta pàggina cunzenti di filtrari li file 'n basi a lu tipu MIME. Nziriri la stringa di ricerca ntâ forma tipu/suttatipu o tipu/*, p'asempiu <code>image/jpeg</code>.",
+       "mimesearch-summary": "Sta pàggina cunzenti di filtrari li file n basi a lu tipu MIME. Nziriri la stringa d'arricerca ntâ forma tipu/suttatipu o tipu/*, p'esempiu <code>image/jpeg</code>.",
        "mimetype": "Tipu MIME:",
        "download": "scàrrica",
        "unwatchedpages": "Pàggini nun taliati",
-       "listredirects": "Alencu di tutti li rimanni",
-       "listduplicatedfiles": "Lista dî file cu' duppiuni",
+       "listredirects": "Elencu di tutti li rimanni",
+       "listduplicatedfiles": "Lista dî file cu duppiuni",
        "listduplicatedfiles-summary": "Chista è na lista dî file unni la virsioni cchiù nova è nu duppiuni dâ virsioni cchiù nova di quarchi àutru file. Sulu li file lucali sù pigghiati a cunziddirazzioni.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] havi [[$3|{{PLURAL:$2|nu duppiuni|$2 duppiuna}}]].",
        "unusedtemplates": "Template nun usati",
        "unusedtemplatestext": "Sta pàggina elenca tutti li pàggini ntô namespace {{ns:template}} ca nun sunnu nclusi nta nudda àutra pàggina.\nPrima di cancillàrili è megghiu cuntrullari ca nun hannu àutri lijami ca ci tràsinu.",
        "unusedtemplateswlh": "àutri lijami",
-       "randompage": "Na pàggina a' muzzu",
-       "randompage-nopages": "Nun cci su' pàggini {{PLURAL:$2|nta stu namespace|nta sti namespace}}: $1.",
-       "randomincategory": "Na pàggina a' muzzu nta na catigurìa",
+       "randompage": "Na pàggina a muzzu",
+       "randompage-nopages": "Nun ci sunnu pàggini {{PLURAL:$2|nta stu namespace|nta sti namespace}}: $1.",
+       "randomincategory": "Na pàggina a muzzu nta na catigurìa",
        "randomincategory-invalidcategory": "\"$1\" nun è nu nomu di catigurìa vàlidu.",
-       "randomincategory-nopages": "Nun cci su' pàggini ntâ catigurìa [[:Category:$1|$1]].",
+       "randomincategory-nopages": "Nun ci sunnu pàggini ntâ catigurìa [[:Category:$1|$1]].",
        "randomincategory-category": "Catigurìa:",
-       "randomincategory-legend": "Pàggina a' muzzu nta na catigurìa",
+       "randomincategory-legend": "Pàggina a muzzu nta na catigurìa",
        "randomincategory-submit": "Vai",
-       "randomredirect": "Nu rimannu a' muzzu",
+       "randomredirect": "Nu rimannu a muzzu",
        "randomredirect-nopages": "Nun c'è nuddu rimannu ntô namespace \"$1\".",
        "statistics": "Statìstichi",
        "statistics-header-pages": "Statìstichi dî pàggini",
        "statistics-users": "[[Special:ListUsers|Utenti]] riggistrati",
        "statistics-users-active": "Utenti attivi",
        "statistics-users-active-desc": "Utenti ca fìciru quarchi azzioni {{PLURAL:$1|nta l'ùrtimu jornu|nta l'ùrtimi $1 jorna}}",
-       "pageswithprop": "Pàggini cu na prupietà di pàggina",
-       "pageswithprop-legend": "Pàggini cu na prupietà di pàggina",
+       "pageswithprop": "Pàggini cu na prupità di pàggina",
+       "pageswithprop-legend": "Pàggini cu na prupità di pàggina",
        "pageswithprop-text": "Sta pàggina elenca li pàggini chi adòpiranu na particulari prupità di pàggina.",
-       "pageswithprop-prop": "Nomu dâ prupietà:",
+       "pageswithprop-prop": "Nomu dâ prupità:",
        "pageswithprop-submit": "Vai",
        "pageswithprop-prophidden-long": "valuri tistuali longu dâ prupità ammucciatu ($1)",
        "pageswithprop-prophidden-binary": "valuri binariu dâ prupità ammucciatu ($1)",
        "withoutinterwiki-summary": "Li pàggini siguenti nun hannu lijami versu dî virsioni nta l'àutri lingui.",
        "withoutinterwiki-legend": "Prifissu",
        "withoutinterwiki-submit": "Ammustra",
-       "fewestrevisions": "Pàggini cu' cchiu' picca virsioni",
+       "fewestrevisions": "Pàggini cu cchiù picca virsioni",
        "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
        "ncategories": "$1 {{PLURAL:$1|catigurìa|catigurìi}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
        "mostlinkedtemplates": "Pàggini cchiù nclusi",
        "mostcategories": "Pàggini cu cchiossai catigurìi",
        "mostimages": "File cchiù culligati",
-       "mostinterwikis": "Pàggini cu' cchiu' ssai interwiki",
+       "mostinterwikis": "Pàggini cu cchiossai interwiki",
        "mostrevisions": "Pàggini cu cchiossai virsioni",
        "prefixindex": "Ìnnici secunnu un prifissu",
        "prefixindex-namespace": "Tutti li pàggini cûn prifissu (namespace $1)",
        "usercreated": "{{GENDER:$3|Criatu}} lu $1 ê $2",
        "newpages": "Pàggini novi",
        "newpages-username": "Utenti:",
-       "ancientpages": "Pàggini cchiu' vecchî",
+       "ancientpages": "Pàggini cchiù vecchî",
        "move": "Sposta",
        "movethispage": "Sposta sta pàggina",
        "unusedimagestext": "Li file ccassutta esìstinu pirò nun sunnu ncurpurati nta nudda pàggina.\nAccura: àutri siti web ponnu aviri lijami versu dûn file pi menzu di URL diretti; li file addupirati a sta manera putìssiru èssiri elincati ccassutta macari si si nni fa usu.",
        "pager-newer-n": "{{PLURAL:$1|1 cchiù novu|$1 cchiù novi}}",
        "pager-older-n": "{{PLURAL:$1|1 cchiù vecchî|$1 cchiù vecchî}}",
        "suppress": "Supravisuri",
-       "querypage-disabled": "Sta pàggina spiciali fu' disattivata pi' mutivi di pristazzioni.",
+       "querypage-disabled": "Sta pàggina spiciali fu disattivata pi mutivi di pristazzioni.",
        "apihelp": "Guida a l'API",
-       "apihelp-no-such-module": "Mòdulu \"$\" nun truvatu.",
+       "apihelp-no-such-module": "Mòdulu «$1» nun attruvatu.",
        "booksources": "Fonti libbrarî",
        "booksources-search-legend": "Arricerca di fonti libbrarî",
        "booksources-isbn": "Còdici ISBN:",
        "listusers-noresult": "Nuddu utenti attruvatu.",
        "listusers-blocked": "(bluccatu)",
        "activeusers": "Lista di l'utenti attivi",
-       "activeusers-intro": "Chista è na lista di l'utenti chi' fìciru na quarchi' attività {{PLURAL:$1|nta l'ùltimu jornu|nta l'ùltimi $1 jorna}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|azziòni|azziòna}} nta {{PLURAL:$3|l'ùltimu jornu|l'ùltimi $3 jorna}}",
+       "activeusers-intro": "Chista è na lista di l'utenti chi fìciru na quarchi attività {{PLURAL:$1|nta l'ùrtimu jornu|nta l'ùrtimi $1 jorna}}.",
+       "activeusers-count": "$1 {{PLURAL:$1|azzioni}} nta {{PLURAL:$3|l'ùrtimu jornu|l'ùrtimi $3 jorna}}",
        "activeusers-from": "Ammustra l'utenti a pàrtiri di:",
        "activeusers-hidebots": "Ammuccia li bot",
        "activeusers-hidesysops": "Ammuccia l'amministratura",
        "listgrouprights-namespaceprotection-namespace": "Namespace",
        "listgrouprights-namespaceprotection-restrictedto": "Dritti chi cunzèntinu a l'utenti di fari canciamenti",
        "trackingcategories": "Catigurìi di tracciamentu",
-       "trackingcategories-summary": "Sta pàggina elenca i catigurìi di tracciamèntu chi' vènunu jincuti autumaticamenti dû software MediaWiki. I so nomi si ponnu canciari mudificannu i missaggi di sistema currispunnenti ntô namespace {{ns:8}}.",
+       "trackingcategories-summary": "Sta pàggina elenca li catigurìi di tracciamentu chi vèninu jincuti autumaticamenti dû software MediaWiki. Li sò nomi si ponnu canciari canciannu li missaggi di sistema currispunnenti ntô namespace {{ns:8}}.",
        "trackingcategories-msg": "Catigurìa di tracciamentu",
        "trackingcategories-name": "Nomu dû missaggiu",
        "trackingcategories-desc": "Criterî pâ nclusioni ntâ catigurìa",
        "noindex-category-desc": "Sta pàggina nun veni nnicizzata dî robot pirchì cunteni la palora màggica <code><nowiki>__NOINDEX__</nowiki></code> e sta nta nu namespace unni sta marcatura è cunzintuta.",
        "index-category-desc": "Sta pàggina cunteni la palora màggica <code><nowiki>__INDEX__</nowiki></code> (e sta nta nu namespace unni sta marcatura è cunzintuta), e pi chistu veni nnicizzata dî robot quannu nurmalmenti nun lu fussi.",
        "post-expand-template-inclusion-category-desc": "La grannizza di sta pàggina passa <code>$wgMaxArticleSize</code> appressu a l'espanzioni di tutti li template, dunca certi template nun foru espannuti.",
-       "post-expand-template-argument-category-desc": "Sta pàggina veni cchiu' granni di <code>$wgMaxArticleSize</code> appressu chi' s'espànni l'argumentu dûn template (quarchi' cosa nta parèntisi graffi tripli, comu <code>{{{Pippu}}}</code>).",
-       "expensive-parserfunction-category-desc": "Sta pàggina adòpira troppi funzioni di l'analizzaturi sintatticu custusi (comu <code>#ifexist</code>). Talìa [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "post-expand-template-argument-category-desc": "Sta pàggina veni cchiù granni di <code>$wgMaxArticleSize</code> appressu chi s'espanni l'argumentu dûn template (quarchi cosa ntra parèntisi graffi tripli, comu <code>{{{Cicciu}}}</code>).",
+       "expensive-parserfunction-category-desc": "Sta pàggina adòpira troppi funzioni di l'analizzaturi sintàtticu custusi (comu <code>#ifexist</code>). Talìa [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Sta pàggina cunteni nu lijami a file ruttu (nu lijami pi ncurpurari nu file chi nun esisti).",
        "hidden-category-category-desc": "Sta catigurìa cunteni <code><nowiki>__HIDDENCAT__</nowiki></code> ntô corpu dâ sò pàggina, cosa chi nun la fa spuntari comu mpustazzioni pridifinuta dintra dû riquatru dî lijami ê catigurìi ntê pàggini.",
        "trackingcategories-nodesc": "Nudda discrizzioni dispunìbbili.",
        "emailccsubject": "Copia dû missaggiu ca mannasti a $1: $2",
        "emailsent": "Missaggiu di posta elittrònica mannatu",
        "emailsenttext": "Lu tò missaggiu di posta elittrònica fu mannatu.",
-       "emailuserfooter": "Stu missaggiu fu mannatu di $1 a $2 pi menzu dâ funzioni \"{{int:emailuser}}\" supra a {{SITENAME}}.",
+       "emailuserfooter": "Stu missaggiu fu mannatu di {{GENDER:$1|$1}} a {{GENDER:$2|$2}} pi menzu dâ funzioni «{{int:emailuser}}» supra a {{SITENAME}}.",
        "usermessage-summary": "Lassatu nu missaggiu di sistema.",
        "usermessage-editor": "Missaggeri di sistema",
        "watchlist": "Lista taliata",
        "notvisiblerev": "L'ùrtima virsioni fatta di n'utenti diffirenti fu cancillata",
        "watchlist-details": "{{PLURAL:$1|C'è na pàggina|Ci sù $1 pàggini}} ntâ tò lista taliata, senza cuntari sparti li pàggini di discussioni.",
        "wlheader-enotif": "La nutìfica via posta elittrònica è attivata.",
-       "wlheader-showupdated": "Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n <strong>grassettu</strong>.",
+       "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",
        "watchlist-options": "Opzioni dâ lista taliata",
        "enotif_impersonal_salutation": "Utenti di {{SITENAME}}",
        "enotif_subject_deleted": "La pàggina $1 supra a {{SITENAME}} fu cancillata di $2",
        "enotif_subject_created": "La pàggina $1 supra a {{SITENAME}} fu criata di $2",
-       "enotif_subject_moved": "La pàggina $1 supra a' {{SITENAME}} fu' spustata di $2",
-       "enotif_subject_restored": "La pàggina $1 supra a' {{SITENAME}} fu' ripristinata di $2",
-       "enotif_subject_changed": "La pàggina $1 supra a' {{SITENAME}} fu' canciata di $2",
+       "enotif_subject_moved": "La pàggina $1 supra a {{SITENAME}} fu spustata di $2",
+       "enotif_subject_restored": "La pàggina $1 supra a {{SITENAME}} fu ripristinata di $2",
+       "enotif_subject_changed": "La pàggina $1 supra a {{SITENAME}} fu canciata di $2",
        "enotif_body_intro_deleted": "La pàggina $1 supra a {{SITENAME}} fu cancillata lu $PAGEEDITDATE di $2, talìa $3.",
        "enotif_body_intro_created": "La pàggina $1 supra a {{SITENAME}} fu criata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
        "enotif_body_intro_moved": "La pàggina $1 supra a {{SITENAME}} fu spustata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
        "created": "criatu",
        "changed": "canciatu",
        "deletepage": "Cancella la pàggina",
-       "confirm": "Cunfirma",
+       "confirm": "Cunferma",
        "excontent": "lu cuntinutu era: \"$1\"",
        "excontentauthor": "lu cuntinutu era: \"$1\" (e lu sulu cuntribbuturi era \"[[Special:Contributions/$2|$2]]\")",
        "exbeforeblank": "lu cuntinutu prima dû svacantamentu era: \"$1\"",
        "delete-confirm": "Cancella \"$1\"",
        "delete-legend": "Cancella",
-       "historywarning": "<strong>Accura:</strong> La pàggina ca stai pi' cancillari havi na crunuluggìa cu' $1 virsioni:",
+       "historywarning": "<strong>Accura:</strong> La pàggina ca stai pi cancillari havi na crunuluggìa cu $1 {{PLURAL:$1|virsioni}}:",
        "confirmdeletetext": "Stai cancillannu na pàggina cu tutta la sò crunuluggìa.\nPi favuri, cunferma ca ntenni fari sta cosa, ca capisti li cunziguenzi, e chi lu fai secunnu [[{{MediaWiki:Policy-url}}|li lìnii guida]].",
        "actioncomplete": "Azzioni cumpritata",
        "actionfailed": "Azioni fallita",
        "deletereasonotherlist": "Àutru mutivu",
        "deletereason-dropdown": "* Mutivi cchiù cumuni pâ cancillazzioni\n** Spam\n** Vannalismu\n** Viulazzioni di lu drittu d'auturi\n** Dumanna di l'auturi\n** Rimannu scassatu",
        "delete-edit-reasonlist": "Cancia li mutivi dâ cancillazzioni",
-       "delete-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiossai di $1 {{PLURAL:$1|virsioni|virsioni}}).\nLa cancillazzioni dî pàggini comu a chista è risirvata, pi scanzari la pussibbilitati di pruvucari senza vulìrilu prubblemi a {{SITENAME}}.",
-       "delete-warning-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiossai di $1 {{PLURAL:$1|virsioni|virsioni}}).\nLa sò cancillazzioni pò disturbari lu funziunamentu di  {{SITENAME}}; prucedi cu cautela.",
+       "delete-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiossai di $1 {{PLURAL:$1|virsioni}}.\nLa cancillazzioni dî pàggini comu a chista è risirvata, pi scanzari la pussibbilitati di pruvucari senza vulìrilu prubblemi a {{SITENAME}}.",
+       "delete-warning-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiossai di $1 {{PLURAL:$1|virsioni}}.\nLa sò cancillazzioni pò disturbari lu funziunamentu di  {{SITENAME}}; prucedi cu cautela.",
        "deleteprotected": "Nun poi cancillari sta pàggina pirchì fu prutiggiuta.",
-       "deleting-backlinks-warning": "'''Accura:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Autri pàggini]] su' culligati o trascludunu la pàggina chi' stai cancillannu.",
+       "deleting-backlinks-warning": "'''Accura:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Àutri pàggini]] sunnu culligati o nclùdinu la pàggina chi stai cancillannu.",
        "rollback": "Annullamentu di canciamenti",
        "rollbacklink": "canciu n'arreri",
-       "rollbacklinkcount": "cancia n'arreri $1 {{PLURAL:$1|mudìfica|mudìfichi}}",
-       "rollbacklinkcount-morethan": "cancia n'arreri cchiu' ssai di $1 {{PLURAL:$1|mudìfica|mudìfichi}}",
+       "rollbacklinkcount": "cancia n'arreri $1 {{PLURAL:$1|canciamentu|canciamenti}}",
+       "rollbacklinkcount-morethan": "cancia n'arreri cchiossai di $1 {{PLURAL:$1|canciamentu|canciamenti}}",
        "rollbackfailed": "Lu canciu n arreri nun arriniscìu",
        "cantrollback": "Nun si pò annullari lu canciamentu;\nl'ùrtimu cuntribbuturi è l'ùnicu auturi di sta pàggina.",
        "alreadyrolled": "Nun si pò annullari l'ùrtimu canciamentu â pàggina [[:$1]] fattu di [[User:$2|$2]] ([[User talk:$2|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nquarchidun'àutru già canciau la pàggina o puru fici nu canciu n'arreri.\n\nL'ùrtimu canciamentu â pàggina fu fattu di [[User:$3|$3]] ([[User talk:$3|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "protect-title": "Canciamentu dû liveddu di prutizzioni di \"$1\"",
        "protect-title-notallowed": "Vista dû liveddu di prutizzioni di \"$1\"",
        "prot_1movedto2": "spustau [[$1]] nta [[$2]]",
-       "protect-badnamespace-title": "Namespace unni nun si po' prutèggiri",
+       "protect-badnamespace-title": "Namespace unni nun si pò prutèggiri",
        "protect-badnamespace-text": "Li pàggini nta stu namespace nun si ponnu prutèggiri.",
        "protect-norestrictiontypes-text": "Sta pàggina nun si pò prutèggiri pirchì nun c'è nudda sorta di ristrizzioni dispunìbbili.",
-       "protect-norestrictiontypes-title": "Pàggina chi' nun si po' prutèggiri",
+       "protect-norestrictiontypes-title": "Pàggina chi nun si pò prutèggiri",
        "protect-legend": "Cunferma la prutizzioni",
        "protectcomment": "Mutivu:",
        "protectexpiry": "Scadenza",
        "protect_expiry_invalid": "L'ura di scadenza nun è vàlida.",
        "protect_expiry_old": "L'ura di scadenza già passau.",
-       "protect-unchain-permissions": "Sblocca autri opzioni di prutizzioni",
+       "protect-unchain-permissions": "Sblocca àutri opzioni di prutizzioni",
        "protect-text": "Ccà poi vìdiri e canciari lu liveddu di prutizzioni dâ pàggina <strong>$1</strong>.",
        "protect-locked-blocked": "Nun si ponnu canciari li liveddi di prutizzioni quannu unu è bluccatu.\nCcà ci sù li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
        "protect-locked-dblock": "Nun si ponnu canciari li liveddi di prutizzioni pirchì c'è attivatu un bloccu dâ basi di dati.\nCcà ci sù li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
        "protect-locked-access": "Lu tò cuntu nun havi lu pirmissu di canciari li liveddi di prutizzioni.\nCcà ci sù li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
        "protect-cascadeon": "Com'a ora sta pàggina è prutetta pirchì veni nclusa {{PLURAL:$1|ntâ pàggina siquenti, ca havi|ntê pàggini siquenti, ca hannu}} la prutizzioni a cascata attivata.\nLi canciamenti ca si fannu ô liveddu di prutizzioni di sta pàggina nun vannu a canciari la prutizzioni a cascata.",
        "protect-default": "Cunzenti a tutti l'utenti",
-       "protect-fallback": "Cunsenti sulu a' l'utenti cû pirmissu \"$1\"",
-       "protect-level-autoconfirmed": "Cunsenti sulu a' l'utenti autu-cunfirmati",
-       "protect-level-sysop": "Cunsenti sulu a' l'amministratura",
+       "protect-fallback": "Cunzenti sulu a l'utenti cû pirmissu \"$1\"",
+       "protect-level-autoconfirmed": "Cunzenti sulu a l'utenti autu-cunfirmati",
+       "protect-level-sysop": "Cunzenti sulu a l'amministratura",
        "protect-summary-cascade": "a cascata",
        "protect-expiring": "scadi lu $1 (UTC)",
        "protect-expiring-local": "scadi lu $1",
        "protect-othertime": "Àutra scadenza:",
        "protect-othertime-op": "àutra scadenza",
        "protect-existing-expiry": "Scadenza attuali: $3 dû $3",
-       "protect-existing-expiry-infinity": "Scadenza attuali: infinitu",
+       "protect-existing-expiry-infinity": "Scadenza attuali: nfinitu",
        "protect-otherreason": "Àutru o ultiriuri mutivu:",
-       "protect-otherreason-op": "Autru mutivu",
+       "protect-otherreason-op": "Àutru mutivu",
        "protect-dropdown": "*Mutivi cumuni pâ prutizzioni\n** Vannalismi ripituti\n** Spam ripitutu\n** Guerra di canciamenti contrapruduttiva\n** Pàggina d'àutu tràficu",
        "protect-edit-reasonlist": "Cancia li mutivi pâ prutizzioni",
        "protect-expiry-options": "1 ura:1 hour,1 jornu:1 day,1 simana:1 week,2 simani:2 weeks,1 misi:1 month,3 misi:3 months,6 misi:6 months,1 annu:1 year,nfinitu:infinite",
        "undeletebtn": "Ricùpira",
        "undeletelink": "talìa/ricùpira",
        "undeleteviewlink": "talìa",
-       "undeleteinvert": "Inverti la silizzioni",
+       "undeleteinvert": "Nverti la silizzioni",
        "undeletecomment": "Mutivu:",
        "undeletedrevisions": "$1 {{PLURAL:$1|virsioni ricupirata|virsioni ricupirati}}",
        "undeletedrevisions-files": "$1 {{PLURAL:$1|virsioni ricupirata|virsioni ricupirati}} e $2 {{PLURAL:$2|file ricupiratu|file ricupirati}}",
        "undeletedfiles": "$1 {{PLURAL:$1|file ricupiratu|file ricupirati}}",
-       "cannotundelete": "L'annullamentu dâ cancillazzioni nun riniscìu:\n$1",
+       "cannotundelete": "L'annullamentu dâ cancillazzioni nun arriniscìu:\n$1",
        "undeletedpage": "<strong>La pàggina $1 fu ricupirata</strong>\n\nCunzurta lu [[Special:Log/delete|riggistru dî cancillazzioni]] pi vìdiri li cancillazzioni e li ricùpiri cchiù ricenti.",
        "undelete-header": "Talìa lu [[Special:Log/delete|riggistru dî cancillazzioni]] pî pàggini cancillati di ricenti.",
-       "undelete-search-title": "Cerca li pàggini cancillati",
+       "undelete-search-title": "Arricerca li pàggini cancillati",
        "undelete-search-box": "Cerca li pàggini cancillati",
        "undelete-search-prefix": "Ammustra li pàggini unni lu tìtulu accumenza cu:",
        "undelete-search-submit": "Cerca",
        "undelete-show-file-confirm": "Sî sicuru chi voi taliari la virsioni cancillata dû file \"<nowiki>$1</nowiki>\" dû $2 ê $3?",
        "undelete-show-file-submit": "Si",
        "namespace": "Namespace:",
-       "invert": "Inverti la silizzioni",
+       "invert": "Nverti la silizzioni",
        "tooltip-invert": "Scegghi sta casedda p'ammucciari li canciamenti chi sù fatti a pàggini dû namespace silizzunatu (e macari dû sò namespace assuciatu, si la casedda rilativa è scigghiuta)",
        "tooltip-whatlinkshere-invert": "Signa sta casedda p'ammucciari li ligami chi vèninu di pàggini dû namespace scigghiutu.",
        "namespace_association": "Namespace assuciatu",
        "ipaddressorusername": "Nnirizzu IP o nomu utenti:",
        "ipbexpiry": "Durata dû bloccu:",
        "ipbreason": "Mutivu:",
-       "ipbreason-dropdown": "*Mutivi cchiù cumuni pî blocchi\n** Nzerimentu di nformazziuni falsi\n** Cancillazzioni di cuntinuti dê pàggini\n** Liami prumozziunalu a siti sterni\n** Nzserimentu di cuntinuti privi di sensu\n** Cumportamenti ntimidatori o molestie\n** Usu ndebitu di cchiù cunti\n** Nomu utenti nun accittabbili",
-       "ipb-hardblock": "Mpidisci a' l'utenti trasuti di fari canciamenti di stu nnirizzu IP",
+       "ipbreason-dropdown": "*Mutivi cchiù cumuni pî blocchi\n** Nzirimentu di nfurmazzioni fàusi\n** Cancillazzioni di cuntinuti dê pàggini\n** Liami prumuzziunali a siti esterni\n** Nzirimentu di cuntinuti privi di senzu\n** Cumpurtamenti ntimidatori o mulesti\n** Usu nun duvutu di cchiù cunti\n** Nomu utenti nun accittàbbili",
+       "ipb-hardblock": "Mpidisci a l'utenti trasuti di fari canciamenti di stu nnirizzu IP",
        "ipbcreateaccount": "Mpidisci la criazzioni di cunti",
        "ipbemailban": "Mpidisci a l'utenti di mannari posta elittrònica",
        "ipbenableautoblock": "Blocca autumaticamenti l'ùrtimu nnirizzu IP adupiratu di st'utenti, e li succissivi d'unni prova a fari canciamenti",
        "badipaddress": "Nnirizzu IP nun vàlidu",
        "blockipsuccesssub": "Bloccu arrinisciutu",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] fu bluccatu.<br />\nTalìa la [[Special:BlockList|lista dî blocchi]] pi rivìdiri li blocchi.",
-       "ipb-blockingself": "Stai bluccannu a' tia stissu! Si' sicuru chi' voi fari sta cosa?",
-       "ipb-confirmhideuser": "Stai bluccannu n'utenti chi' havi l'opzioni \"ammuccia utenti\" attivata. A' sta manera u nomu di st'utenti veni supprimutu nta tutti i listi e tutti i riggìstri. Si' sicuru chi' voi fari sta cosa?",
+       "ipb-blockingself": "Stai bluccannu a tìa stissu! Sî sicuru chi voi fari sta cosa?",
+       "ipb-confirmhideuser": "Stai bluccannu n'utenti chi havi l'opzioni \"ammuccia utenti\" attivata. Di sta manera lu nomu di st'utenti veni supprimutu nta tutti li listi e tutti li riggistri. Sî sicuru chi voi fari sta cosa?",
        "ipb-confirmaction": "Si sî pi daveru sicuru chi voi fari sta cosa, scegghi la casedda \"{{int:ipb-confirm}}\" ccassutta.",
        "ipb-edit-dropdown": "Cancia li mutivi dû bloccu",
        "ipb-unblock-addr": "Sblocca a $1",
        "ipb-unblock": "Sblocca a n'utenti o nu nnirizzu IP",
        "ipb-blocklist": "Talìa li blocchi n viguri",
-       "ipb-blocklist-contribs": "Cuntribbuta di {{GENDER:$1|$1}}",
+       "ipb-blocklist-contribs": "Cuntribbuti di {{GENDER:$1|$1}}",
        "unblockip": "Sblocca a l'utenti",
        "unblockiptext": "Adupirari lu mòdulu suttastanti pi'arristituiri l'accessu n scrittura a nu nnirizzu IP o nomu utenti ca fu bluccatu.",
        "ipusubmit": "Leva stu bloccu",
        "blocklist-timestamp": "Data e ura",
        "blocklist-target": "Oggettu",
        "blocklist-expiry": "Scadenza",
-       "blocklist-by": "Amministraturi chi' bluccau",
+       "blocklist-by": "Amministraturi chi bluccau",
        "blocklist-params": "Paràmitri dû bloccu",
        "blocklist-reason": "Mutivu",
        "ipblocklist-submit": "Arricerca",
        "ipblocklist-localblock": "Bloccu lucali",
-       "ipblocklist-otherblocks": "{{PLURAL:$1|Autru bloccu|Autri blocchi}}",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Àutru bloccu|Àutri blocchi}}",
        "infiniteblock": "nfinitu",
        "expiringblock": "scadi lu $1 ê $2",
        "anononlyblock": "sulu anònimi",
        "blocklog-showsuppresslog": "St'utenti fu bluccatu e ammucciatu ntô passatu.\nComu rifirimentu ccassutta c'è lu riggistru dî supprissioni:",
        "blocklogentry": "hà bluccatu [[$1]]; scadenza $2 $3",
        "reblock-logentry": "Canciau li mpustazzioni dû bloccu pi [[$1]] cu na scadenza di $2 $3",
-       "blocklogtext": "Chistu è l'alencu di l'azzioni di bloccu e sbloccu di l'utenti.\nLi nnirizzi IP bluccati autumaticamenti nun sunnu alincati.\nCunzurtari l'[[Special:BlockList|alencu dî blocchi]] pi vìdiri li furbanna e li blocchi chi sunnu n viguri pi com'ora.",
+       "blocklogtext": "Chistu è l'elencu di l'azzioni di bloccu e sbloccu di l'utenti.\nLi nnirizzi IP bluccati autumaticamenti nun sunnu elincati.\nCunzurtari l'[[Special:BlockList|elencu dî blocchi]] pi vìdiri li furbanna e li blocchi chi sunnu n viguri pi com'ora.",
        "unblocklogentry": "sbluccau a \"$1\"",
        "block-log-flags-anononly": "sulu utenti anònimi",
        "block-log-flags-nocreate": "criazzioni account bluccata",
        "range_block_disabled": "La pussibbilitati di bluccari ntervalli di ndirizzi IP è disattiva a lu mumentu.",
        "ipb_expiry_invalid": "Durata o scadenza dû bloccu nun vàlida.",
        "ipb_expiry_temp": "Li blocchi dê nomi utenti ammucciati avìssiru èssiri nfiniti",
-       "ipb_hide_invalid": "Nun si po' supprìmiri stu cuntu: havi cchiu' ssai di {{PLURAL:$1|nu canciamentu|$1 canciamenti}}.",
+       "ipb_hide_invalid": "Nun si pò supprìmiri stu cuntu: havi cchiossai di {{PLURAL:$1|nu canciamentu|$1 canciamenti}}.",
        "ipb_already_blocked": "L'utenti \"$1\" è già bluccatu",
        "ipb-needreblock": "$1 è già bluccatu. Vòi caciari li mpustazzioni?",
-       "ipb-otherblocks-header": "{{PLURAL:$1|Autru bloccu|Autri blocchi}}",
-       "unblock-hideuser": "Nun poi sbluccari st'utenti, picchì u so nomu utenti fu' ammucciatu.",
+       "ipb-otherblocks-header": "{{PLURAL:$1|Àutru bloccu|Àutri blocchi}}",
+       "unblock-hideuser": "Nun poi sbluccari st'utenti, pirchì lu sò nomu utenti fu ammucciatu.",
        "ipb_cant_unblock": "Erruri: Mpussìbbili attruvari lu bloccu cu ID $1. Putissi aviri già statu sbluccatu.",
        "ipb_blocked_as_range": "Sbagghiu: Lu ndirizzu IP $1 nun è suggettu a bloccu ndividuali e non pò èssiri sbloccatu. Lu bloccu è attivu mmeci a liveddu dû ntirvallu $2, ca pò èssiri sbluccatu.",
        "ip_range_invalid": "Ntervallu di ndirizzi IP nun vàlidu.",
-       "ip_range_toolarge": "I blocchi di ntirvalli IP cchiu' granni di /$1 nun sunnu cunsintuti.",
+       "ip_range_toolarge": "Li blocchi di ntirvalli IP cchiù granni di /$1 nun sunnu cunzintuti.",
        "proxyblocker": "Blocca proxy",
        "proxyblockreason": "Lu tò ndirizzu IP hà statu bluccatu pirchì è un open proxy. Pi favuri cuntatta lu tò furnituri d'accessu a Internet o lu supportu tècnicu e nfòrmali di stu gravi prubbrema di sicurizza.",
        "sorbsreason": "Lu tò ndirizzu IP è alincatu comu proxy apertu ntâ lista DNSBL.",
        "sorbs_create_account_reason": "Lu tò ndirizzu IP è alincatu comu open proxy ntâ DNSBL. Nun poi criari un utenti.",
-       "xffblockreason": "Nu nnirizzu IP chi' si trova nta na ntistazzioni X-Forwarded-For, o a toi o dûn server proxy chi' stai adupirannu, fu' bluccatu. U mutivu dû bloccu origginali era: $1",
-       "cant-see-hidden-user": "L'utenti chi' stai pruvannu a' bluccari già fu' bluccatu e ammucciatu.\nComu chi' tu nun hai u drittu \"hideuser\", nun poi ne' vìdiri ne' canciari u bloccu di st'utenti.",
-       "ipbblocked": "Nun poi bluccari o sbluccari a' autri utenti picchì tu stissu si' bluccatu.",
-       "ipbnounblockself": "Nun hai u pirmissu di sbluccari a' tia stissu.",
+       "xffblockreason": "Nu nnirizzu IP chi s'attrova nta na ntistazzioni X-Forwarded-For, o la tò o dûn server proxy chi stai adupirannu, fu bluccatu. Lu mutivu dû bloccu origginali era: $1",
+       "cant-see-hidden-user": "L'utenti chi stai pruvannu a bluccari già fu bluccatu e ammucciatu.\nComu chi tu nun hai lu drittu \"hideuser\", nun poi nè vìdiri nè canciari lu bloccu di st'utenti.",
+       "ipbblocked": "Nun poi bluccari o sbluccari a àutri utenti pichì tu stissu sî bluccatu.",
+       "ipbnounblockself": "Nun hai lu pirmissu di sbluccari a tìa stissu.",
        "lockdb": "Blocca lu database",
        "unlockdb": "Sblocca lu database",
        "lockdbtext": "Lu bloccu dû database cumporta la suspinzioni pi tutti l'utenti dâ pussibbilitati di canciari li pàggini, mpustari li sò prifirenzi, canciari li sò listi taliati, e n ginirali di cùmpiri tutti l'opirazzioni c'addumànnanu canciamenti a lu database.\nPi favuri cunferma ca chistu è zocchi hai ntinzioni di fari, e ca a lu tèrmini dâ manutinzioni pruvidi a lu sbloccu dû database.",
        "unlockdbsuccesstext": "Lu database hà statu sbluccatu.",
        "lockfilenotwritable": "Mpussìbbili scrìviri supra lu file di ''lock'' dû database. L'accessu n scrittura a tali file di parti dû server web è nicissariu pi bluccari e sbluccari lu database.",
        "databasenotlocked": "Lu database nun è bluccatu.",
-       "lockedbyandtime": "(di {{GENDER:$1|$1}} u $2 ê $3)",
+       "lockedbyandtime": "(di {{GENDER:$1|$1}} lu $2 ê $3)",
        "move-page": "Spustamentu di $1",
        "move-page-legend": "Sposta la pàggina",
        "movepagetext": "Adupirannu lu mòdulu ccassutta si cancia lu nomu dâ pàggina, spustannu tutta la sò crunuluggìa nta la pàggina nova.\nLu tìtulu vecchiu addiventa nu rimannu versu lu tìtulu novu.\nSi ponnu aggiurnari autumaticamenti li rimanni chi puntàvanu ô tìtulu origginali.\nMa si scegghi di nun fàrilu, t'hai a assicurari ca lu spustamentu nun crea [[Special:DoubleRedirects|rimanni duppî]] o puru [[Special:BrokenRedirects|rimanni rutti]].\nÈ tò rispunzabbilità chi li liami cuntìnuanu a puntari â pàggina bona.\n\nVidi chi la pàggina <strong>nun veni spustata</strong> siddu c'è già na pàggina chi havi lu tìtulu novu, tranni siddu la pàggina n quistioni è nu rimannu e nun havi crunuluggìa di canciamenti passati.\nChistu voli diri chi si pò canciari n'àutra vota lu nomu di la pàggina a chiddu c'avìa prima siddu si fa nu sbagghiu, e chi nun si pò suprascrìviri na pàggina chi già esisti.\n\n<strong>Accura!</strong>\nChistu pò èssiri nu canciamentu dràsticu pi na pàggina friquintata; aviti a èssiri sicuri di capiri li cunziquenzi prima di cuntinuari.",
        "movepagetext-noredirectfixer": "Usannu lu mòdulu ccà sutta vui canciati lu nomu dâ pàggina, e spustati tutta la sò storia versu la pàggina nova. Lu tìtulu vecchiu addiventa na pàggina di rinnirizzamentu versu lu tìtulu novu. \nAssicuràtivi ca lu spustamentu nun criau [[Special:DoubleRedirects|redirect duppi]] o [[Special:BrokenRedirects|redirect rumputi]]. Vui siti rispunzàbbili dî liami chi avìssiru a puntari â pàggina giusta.\n\nLa pàggina '''nun''' è spustata siddu cc'è già na pàggina cu lu tìtulu novu, tranni chi la pàggina 'n chistioni è vacanti o è na pàggina di ''redirect'' e nun havi n'archiviu di canciamenti.\nChistu signìfica chi vui putiti rinuminari la pàggina cu lu nomu vecchiu si aviti sbagghiatu, e chi nun putiti suprascrìviri nta na pàggina chi esisti già.\n\n'''Accura!'''\nChistu pò èssiri nu canciamentu dràsticu pi na pàggina pupulari; aviti a èssiri sicuri di capiri li cunziquenzi prima di cuntinuari.",
        "movepagetalktext": "La pàggina di discussioni è autumaticamenti spustata cu idda <strong>a menu chi:</strong>\n*Na pàggina di discussioni nun vacanti già esisti cu lu nomu novu, o puru\n*Nun scegghi la casedda ccassutta.\n\nNta sti casi, si voi, hai a spustari o jùnciri la pàggina di discussioni a manu.",
-       "movearticle": "Sposta la pàggina",
-       "moveuserpage-warning": "<strong>Accura:</strong> Stai spustannu a pàggina di n'utenti. Hâ' sapìri chi' sulu a pàggina sarravi spustata, l'utenti <em>nun sarravi</em> canciatu di nomu.",
+       "moveuserpage-warning": "<strong>Accura:</strong> Stai spustannu la pàggina di n'utenti. Hai a sapìri chi sulu la pàggina è spustata e lu nomu d'utenti <em>nun cancia</em>.",
        "movecategorypage-warning": "<strong>Accura:</strong> Stai spustannu la pàggina di na catigurìa. Hai a sapìri chi sulu la pàggina è spustata, li pàggini chi s'attròvanu ntâ catigurìa vecchia <em>nun sunnu</em> catigurizzati nta chidda nova.",
        "movenologintext": "Lu spustamentu dî pàggini è cunzintitu sulu a l'utenti riggistrati c'hannu esiquitu l'[[Special:UserLogin|accessu]] a lu situ.",
        "movenotallowed": "Nun hai li pirmessi nicissari a lu spustamentu dê pàggini.",
        "movenotallowedfile": "Nun ci su' li pirmessi nicissàrii pi spustari file.",
        "cant-move-user-page": "Nun aviti lu pirmissu nicissàriu pi spustari li pàggini utenti.",
        "cant-move-to-user-page": "Nun aviti li pirmessi nicessàrii pô spustamentu dâ pàggina supra na pàggina utenti (cu eccizzioni di na suttapàggina utenti).",
-       "cant-move-category-page": "Nun hai u pirmissu di spustari i pàggini dî catigurìi.",
-       "cant-move-to-category-page": "Nun hai u pirmissu di spustari pàggini facènnuli divintari pàggini di catigurìi.",
+       "cant-move-category-page": "Nun hai lu pirmissu di spustari li pàggini dî catigurìi.",
+       "cant-move-to-category-page": "Nun hai lu pirmissu di spustari pàggini facènnuli addivintari pàggini di catigurìi.",
        "newtitle": "Cu lu tìtulu novu di",
        "move-watch": "Talìa sta pàggina",
        "movepagebtn": "Sposta la pàggina",
        "delete_and_move": "Cancella e sposta",
        "delete_and_move_text": "==Richiesta di cancillazzioni==\n\nLa pàggina di distinazzioni \"[[:$1]]\" asisti già. S'addisìa cancillàrila pi rènniri pussìbbili lu spustamentu?",
        "delete_and_move_confirm": "Sì, suvrascrivi la pàggina asistenti",
-       "delete_and_move_reason": "Cancillata pi' fari largu ô spustamentu di \"[[$1]]\"",
+       "delete_and_move_reason": "Cancillata pi fari largu ô spustamentu di \"[[$1]]\"",
        "selfmove": "Lu tìtulu di distinazzioni nziritu è agguali a chiddu di pruvinenza; mpossibbili spustari la pàggina su idda stissa.",
        "immobile-source-namespace": "Non pòi spustari li pàggini nto namespace \"$1\"",
        "immobile-target-namespace": "Nun pòi spustari li pàggini ntô namespace \"$1\"",
        "immobile-target-namespace-iw": "L'interwiki link nun è n'ubbiettivu bonu pi spustari la pòggina.",
        "immobile-source-page": "Sta pàggina nun pò èssiri spustata.",
        "immobile-target-page": "Nun pòi spustari nti stu tìtulu.",
-       "bad-target-model": "A distinazzioni vuluta adòpira nu mudellu di cuntinutu diffirenti. Nun si po' cunvèrtiri dû $1 ô $2.",
+       "bad-target-model": "La distinazzioni vuluta adòpira nu mudellu di cuntinutu diffirenti. Nun si pò cunvèrtiri dû $1 ô $2.",
        "imagenocrossnamespace": "Nun pòi spustari na mmàggini fora dû namespace Mmàggini.",
        "nonfile-cannot-move-to-file": "Nun si pò spustari ntô namespace file zocchi nun è nu file.",
        "imagetypemismatch": "La estensioni nova dû file cun currispunni â sò estensioni riali",
        "move-leave-redirect": "Lassa darreri nu redirect",
        "protectedpagemovewarning": "<strong>Accura:</strong> Sta pàggina fu prutiggiuta di manera chi sulu l'utenti cu privileggi d'amministraturi la ponnu spustari.\nPi rifirimentu, ccassutta è arripurtata l'ùrtima vuci dû riggistru:",
        "semiprotectedpagemovewarning": "<strong>Nota:</strong> Sta pàggina fu prutiggiuta di manera chi sulu l'utenti riggistrati la ponnu spustari.\nPi rifirimentu, ccassutta è arripurtata l'ùrtima vuci dû riggistru:",
-       "move-over-sharedrepo": "== U file già esisti ==\n[[:$1]] già esisti ntôn dipòsitu cunnivisu. Spustari nu file nta chistu titulu suprascriviravi u file cunnivisu.",
-       "file-exists-sharedrepo": "U nomu di file scigghiutu già è adupiratu ntôn dipòsitu cunnivisu.\nPi' favuri scegghî n'autru nomu.",
+       "move-over-sharedrepo": "== Lu file già esisti ==\n[[:$1]] già esisti ntôn dipòsitu cunnivisu. Spustari nu file nta stu titulu suprascrivi lu file cunnivisu.",
+       "file-exists-sharedrepo": "Lu nomu di file scigghiutu già è adupiratu ntôn dipòsitu cunnivisu.\nPi favuri scegghi n'àutru nomu.",
        "export": "Esporta pàggini",
-       "exporttext": "È pussìbbili spurtari lu testu e la cronoluggìa dî canciamenti di na pàggina o d'un gruppu di pàggini n furmatu XML pi mpurtàrili n àutri siti ca utilìzzanu lu software MediaWiki, attraversu la pàggina [[Special:Import|di mportu]].\n\nPi spurtari li pàggini innicari li tìtuli ntâ casella di testu suttastanti, unu pi riga, e spicificari siddu s'addisìa ottèniri la virsioni currenti e tutti li virsioni pricidenti, cu li dati dâ cronuluggìa dâ pàggina, oppuru surtantu l'ùrtima virsioni e li dati currispunnenti a l'ùrtimu canciamentu.\n\nNta st'ùrtimu casu si pò macari utilizzari na lijami, p'asempiu [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pi spurtari \"[[{{MediaWiki:Mainpage}}]]\".",
-       "exportall": "Esporta tutti i pàggini",
-       "exportcuronly": "Ncludi sulu la rivisioni attuali, nun la ntera cronoluggìa",
-       "exportnohistory": "---- '''Nota:''' l'espurtazzioni dâ ntera cronoluggìa dî pàggini attraversu sta nterfaccia hà stata disattivata pi mutivi ligati a li pristazzioni dû sistema.",
-       "exportlistauthors": "Includi n'elencu cumpletu dî cuntribbuturi p'ognin pàggina",
+       "exporttext": "È pussìbbili spurtari lu testu e la crunuluggìa dî canciamenti di na pàggina o d'un gruppu di pàggini n furmatu XML pi mpurtàrili n àutri siti ca utilìzzanu lu software MediaWiki, attraversu la pàggina [[Special:Import|di mportu]].\n\nPi spurtari li pàggini innicari li tìtuli ntâ casella di testu suttastanti, unu pi riga, e spicificari siddu s'addisìa ottèniri la virsioni currenti e tutti li virsioni pricidenti, cu li dati dâ crunuluggìa dâ pàggina, oppuru surtantu l'ùrtima virsioni e li dati currispunnenti a l'ùrtimu canciamentu.\n\nNta st'ùrtimu casu si pò macari utilizzari nu lijami, p'asempiu [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pi spurtari \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Esporta tutti li pàggini",
+       "exportcuronly": "Ncludi sulu la rivisioni attuali, nun la crunuluggìa ntera",
+       "exportnohistory": "---- '''Nota:''' l'espurtazzioni dâ ntera crunuluggìa dî pàggini attraversu sta nterfaccia fu disattivata pi mutivi ligati a li pristazzioni dû sistema.",
+       "exportlistauthors": "Ncludi n'elencu cumpletu dî cuntribbuturi p'ogni pàggina",
        "export-submit": "Espurtazzioni",
        "export-addcattext": "Agghiunci pàggini dâ catigurìa:",
        "export-addcat": "Agghiunci",
        "thumbnail-more": "Ngrannisci",
        "filemissing": "File mancanti",
        "thumbnail_error": "Erruri ntâ criazzioni dâ miniatura: $1",
-       "thumbnail_error_remote": "Messaggiu d'erruri di $1:\n$2",
+       "thumbnail_error_remote": "Missaggiu d'erruri di $1:\n$2",
        "djvu_page_error": "Nùmmuru di pàggina DjVu erratu",
        "djvu_no_xml": "Mpussibbili òtteniri lu XML pô file DjVu",
        "thumbnail-temp-create": "Nun fu pussìbbili criari nu file timpuràniu pâ miniatura",
-       "thumbnail-dest-create": "Nun fu' pussìbbili sarvari a miniatura ntâ distinazzioni",
+       "thumbnail-dest-create": "Nun fu pussìbbili sarvari la miniatura ntâ distinazzioni",
        "thumbnail_invalid_params": "Parametri antiprima nun validi",
-       "thumbnail_toobigimagearea": "U file è cchiu' granni di $1",
+       "thumbnail_toobigimagearea": "Lu file è cchiù granni di $1",
        "thumbnail_dest_directory": "Mpussibbili criari la directory di distinazzioni",
        "thumbnail_image-type": "Tipu di mmàggini nun supputtatu",
        "thumbnail_gd-library": "Cunfigurazioni ncumpleta da libreria GD: funzioni $1 mancanti",
        "thumbnail_image-missing": "Pari èssiri mancanti lu file: $1",
-       "thumbnail_image-failure-limit": "Cc'hannu statu troppu tintativi ($1 o cchiu' ssai) di ginirari sta miniatura. Pi' favuri prova n'autra vota cchiu' tardu.",
+       "thumbnail_image-failure-limit": "Ci foru troppu tintativi ($1 o cchiossai) di ginirari sta miniatura. Pi favuri prova n'àutra vota cchiù tardu.",
        "import": "Mporta pàggini",
        "importinterwiki": "Mpurtazzioni di n'àutra wiki",
        "import-interwiki-text": "Silizziunari na wiki e lu tìtulu di na pàggina a mpurtari.\nLi dati dî virsioni e li noma di l'autura sunnu mantinuti.\nTutti li mpurtazzioni d'àutri wiki vèninu riggistrati ntô [[Special:Log/import|riggistru dî mpurtazzioni]].",
        "import-interwiki-sourcewiki": "Wiki surgenti:",
        "import-interwiki-sourcepage": "Pàggina surgenti:",
-       "import-interwiki-history": "Copia la ntera cronoluggìa di sta pàggina",
+       "import-interwiki-history": "Copia la crunuluggìa ntera di sta pàggina",
        "import-interwiki-templates": "Includi tutti li template",
        "import-interwiki-submit": "Mporta",
        "import-mapping-default": "Mporta ntê distinazzioni pridifinuti",
        "import-mapping-subpage": "Mporta comu suttapàggini di sta pàggina:",
        "import-upload-filename": "Nomu file:",
        "import-comment": "Oggettu:",
-       "importtext": "Pi favuri, esporta lu file dâ wiki surgenti adupirannu [[Special:Export|a funziunalità d'espurtazzioni]].\nSàrvalu supra a' lu tò computer e carrìcalu ccà.",
+       "importtext": "Pi favuri, esporta lu file dâ wiki surgenti adupirannu [[Special:Export|la funziunalità d'espurtazzioni]].\nSàrvalu supra a lu tò computer e carrìcalu ccà.",
        "importstart": "Mpurtazzioni dî pàggini n cursu...",
        "import-revision-count": "{{PLURAL:$1|na rivisioni mpurtata|$1 rivisioni mpurtati}}",
        "importnopages": "Nudda pàggina a mpurtari.",
        "importcantopen": "Mpussìbbili grapiri lu file di mpurtazzioni",
        "importbadinterwiki": "Lijami inter-wiki erratu",
        "importsuccess": "Mpurtazzioni arrinisciuta.",
-       "importnosources": "Nun fu difinuta nudda wiki d'unni mpurtari e li carricamenti diretti dâ cronuluggìa sunnu disattivati.",
+       "importnosources": "Nun fu difinuta nudda wiki d'unni mpurtari e li carricamenti diretti dâ crunuluggìa sunnu disattivati.",
        "importnofile": "Nun hà statu carrcatu nuddu file pi la mpurtazzioni.",
        "importuploaderrorsize": "Caricamentu dû file pi la mpurtazzioni non arrinisciutu. Lu file è cchiù granni di li diminzioni màssimi cunzentiti pi l'upload.",
        "importuploaderrorpartial": "Caricamentu dû file pi la mpurtazzioni non arrinisciutu. Sulamenti na parti dû file vinni caricatu.",
-       "importuploaderrortemp": "Caricamentu dû file pi la mpurtazzioni non arrinisciutu. Manca na cartedda timpurània.",
+       "importuploaderrortemp": "Carricamentu dû file pi la mpurtazzioni nun arrinisciutu. Ammanca na cartedda timpurània.",
        "import-parse-failure": "Sbagghiu d'anàlisi ntâ mpurtazzioni XML",
        "import-noarticle": "Nudda pàggina di mpurtari.",
        "import-nonewrevisions": "Nudda virsioni fu mpurtata (o già c'èranu tutti, o foru sautati tutti pirchì ammatteru erruri).",
        "import-upload": "Càrrica dati XML",
        "import-token-mismatch": "Si pèrsiru li dati rilativi a la sissioni. Pi piaciri, prova n'àutra vota.",
        "import-invalid-interwiki": "E' mpussìbbili mpurtari dû pruggettu wiki nnicatu.",
-       "import-error-edit": "A pàggina \"$1\" nun fu' mpurtata picchì nun hai u pirmissu di canciàrila.",
+       "import-error-edit": "La pàggina \"$1\" nun fu mpurtata pirchì nun hai lu pirmissu di canciàrila.",
        "import-error-create": "La pàggina \"$1\" nun fu mpurtata pirchì nun hai lu pirmissu di criàrila.",
-       "import-error-interwiki": "La pàggina \"$1\" nun fu mpurtata picchì lu sò nomu è risirvatu pî lijami di fora (inter-wiki).",
-       "import-error-special": "A pàggina \"$1\" nun fu' mpurtata picchì apparteni a' nu namespace spiciali chi' nun cunsenti pàggini.",
-       "import-error-invalid": "A pàggina \"$1\" nun fu' mpurtata picchì u nomu unni sarrìa mpurtata nun è vàlidu supra a' sta wiki.",
-       "import-error-unserialize": "A virsioni $2 dâ pàggina \"$1\" nun si potti di-sirializzari. Era signatu chi' sta virsioni adupirava u mudellu di cuntinutu $3 sirializzatu comu $4.",
+       "import-error-interwiki": "La pàggina \"$1\" nun fu mpurtata pirchì lu sò nomu è risirvatu pî lijami di fora (inter-wiki).",
+       "import-error-special": "La pàggina \"$1\" nun fu mpurtata pirchì apparteni a nu namespace spiciali chi nun cunzenti pàggini.",
+       "import-error-invalid": "La pàggina \"$1\" nun fu mpurtata pirchì lu nomu unni fussi mpurtata nun è vàlidu supra a sta wiki.",
+       "import-error-unserialize": "La virsioni $2 dâ pàggina \"$1\" nun si potti di-sirializzari. Era signatu chi sta virsioni adupirava lu mudellu di cuntinutu $3 sirializzatu comu $4.",
        "import-error-bad-location": "La virsioni $2 chi adòpira lu mudellu di cuntinutu $3 nun si pò mimurizzari nta \"$1\" supra a sta wiki, pirchì ddu mudellu nun è suppurtatu nta dda pàggina.",
        "import-options-wrong": "{{PLURAL:$2|Opzioni sbagghiata|Opzioni sbagghiati}}: <nowiki>$1</nowiki>",
-       "import-rootpage-invalid": "A pàggina ràdica spicificata nun è vàlida comu tìtulu.",
-       "import-rootpage-nosubpage": "U namespace \"$1\" dâ pàggina ràdica nun cunsenti suttapàggini.",
+       "import-rootpage-invalid": "La pàggina ràdica spicificata nun è vàlida comu tìtulu.",
+       "import-rootpage-nosubpage": "Lu namespace \"$1\" dâ pàggina ràdica nun cunzenti suttapàggini.",
        "importlogpage": "Riggistru dî mpurtazzioni",
-       "importlogpagetext": "Riggistru dî mpurtazzioni d'ufficiu di pàggini pruvinenti d'àutri wiki, cumpleti di cronoluggìa.",
+       "importlogpagetext": "Riggistru dî mpurtazzioni d'ufficiu di pàggini pruvinenti d'àutri wiki, cumpleti di crunuluggìa.",
        "import-logentry-upload-detail": "{{PLURAL:$1|na virsioni mpurtata|$1 virsioni mpurtati}}",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|na virsioni mpurtata|$1 virsioni mpurtati}} di $2",
        "javascripttest": "Virìfichi JavaScript",
-       "javascripttest-pagetext-noframework": "Sta pàggina è risirvata pi' l'esicuzzioni dî virìfichi JavaScript.",
+       "javascripttest-pagetext-noframework": "Sta pàggina è risirvata pi l'esicuzzioni dî virìfichi JavaScript.",
        "javascripttest-pagetext-unknownframework": "Framework di virìfica \"$1\" scanusciutu.",
        "javascripttest-pagetext-unknownaction": "Azzioni scanusciuta \"$1\".",
-       "javascripttest-pagetext-frameworks": "Pi' favuri scegghî unu dî siguenti framework di virìfica: $1",
+       "javascripttest-pagetext-frameworks": "Pi favuri scegghi unu dî framework siguenti di virìfica: $1",
        "javascripttest-pagetext-skins": "Scegghi na peddi câ quali esiguiri li virìfichi:",
-       "javascripttest-qunit-intro": "Talìa [$1 a ducumintazzioni a' prupositu dî virìfichi] supra a' mediawiki.org.",
+       "javascripttest-qunit-intro": "Talìa [$1 la ducumintazzioni a prupositu dî virìfichi] supra a mediawiki.org.",
        "tooltip-pt-userpage": "La tò pàggina utenti",
        "tooltip-pt-anonuserpage": "La pàggina utenti di stu ndirizzu IP",
        "tooltip-pt-mytalk": "La to' pàggina di discussioni",
        "tooltip-pt-anontalk": "Discussioni supra li canciamenti fatti di stu ndirizzu IP",
        "tooltip-pt-preferences": "Li mè prifirenzi",
        "tooltip-pt-watchlist": "La lista dî pàggini ca stai tinennu sutta ossirvazzioni",
-       "tooltip-pt-mycontris": "La lista dî to cuntribbuti",
+       "tooltip-pt-mycontris": "La lista dî tò cuntribbuti",
        "tooltip-pt-login": "La riggistrazzioni è cunzigghiata, puru siddu nun obbrigatoria.",
        "tooltip-pt-logout": "Nisciuta",
        "tooltip-pt-createaccount": "Sî nvitatu a criari nu cuntu e tràsiri; pirò nun è obbligatoriu",
        "tooltip-ca-viewsource": "Sta pàggina è prutetta, ma poi vìdiri lu sò còdici surgenti.",
        "tooltip-ca-history": "Virsioni pricidenti di sta pàggina.",
        "tooltip-ca-protect": "Pruteggi sta pàggina",
-       "tooltip-ca-unprotect": "Cancia a prutizzioni di sta pàggina",
+       "tooltip-ca-unprotect": "Cancia la prutizzioni di sta pàggina",
        "tooltip-ca-delete": "Cancella sta pàggina",
        "tooltip-ca-undelete": "Riprìstina la pàggina com'era prima dâ cancillazzioni",
        "tooltip-ca-move": "Sposta sta pàggina (cancia tìtulu)",
        "tooltip-n-portal": "Discrizzioni dû pruggettu, zoccu poi fari, unni attruvari li cosi",
        "tooltip-n-currentevents": "Nfurmazzioni supra l'avvinimenti d'attualitati",
        "tooltip-n-recentchanges": "Alencu di l'ùrtimi canciamenti dû situ.",
-       "tooltip-n-randompage": "Carrica na pàggina a' muzzu",
+       "tooltip-n-randompage": "Carrica na pàggina a muzzu",
        "tooltip-n-help": "Pàggini d'aiutu.",
        "tooltip-t-whatlinkshere": "Alencu di tutti li pàggini ca sunnu culligati a chista",
        "tooltip-t-recentchangeslinked": "Alencu di l'ùrtimi canciamenti a li pàggini culligati a chista",
        "tooltip-feed-rss": "Feed RSS pi sta pàggina",
        "tooltip-feed-atom": "Feed Atom pi sta pàggina",
-       "tooltip-t-contributions": "La lista dî cuntribbuti di stutenti",
+       "tooltip-t-contributions": "La lista dî cuntribbuti di st'utenti",
        "tooltip-t-emailuser": "Manna un missaggiu e-mail a stu utenti",
-       "tooltip-t-info": "Autri nfurmazzioni a' prupòsitu di sta pàggina",
+       "tooltip-t-info": "Àutri nfurmazzioni a prupòsitu di sta pàggina",
        "tooltip-t-upload": "Càrrica mmàggini o file multimidiali",
        "tooltip-t-specialpages": "Lista di tutti li pàggini spiciali",
        "tooltip-t-print": "Virsioni stampabbili di chista pàggina",
        "tooltip-diff": "Talìa (mudalitati diff) li canciamenti c'hai fattu.",
        "tooltip-compareselectedversions": "Talìa li diffirenzi tra li dui virsioni silizziunati di sta pàggina.",
        "tooltip-watch": "Agghiunci sta pàggina â tò lista taliata",
-       "tooltip-watchlistedit-normal-submit": "Leva i tìtuli",
+       "tooltip-watchlistedit-normal-submit": "Leva li tìtuli",
        "tooltip-watchlistedit-raw-submit": "Aggiorna la lista taliata",
        "tooltip-recreate": "Ricrea la pàggina puru siddu hà statu cancillata",
        "tooltip-upload": "Ncigna carricamentu",
        "spam_blanking": "Pàggina svacantata, tutti li virsioni cuntinìanu lijami versu $1",
        "spam_deleting": "Pàggina cancillata, tutti li virsioni cuntinìanu lijami versu $1",
        "simpleantispam-label": "Cuntrollu anti-spam.\n<strong>NUN JÌNCHIRI</strong> stu campu!",
-       "pageinfo-title": "Nfurmazzioni supra a' \"$1\"",
-       "pageinfo-not-current": "Sfurtunatamenti, nun è pussìbbili furnìri sti nfurmazzioni pî virsioni vecchî.",
+       "pageinfo-title": "Nfurmazzioni supra a \"$1\"",
+       "pageinfo-not-current": "Sfurtunatamenti, nun è pussìbbili furniri sti nfurmazzioni pî virsioni vecchî.",
        "pageinfo-header-basic": "Nfurmazzioni essinziali",
        "pageinfo-header-edits": "Crunuluggìa dî canciamenti",
        "pageinfo-header-restrictions": "Prutizzioni dâ pàggina",
-       "pageinfo-header-properties": "Prupietà dâ pàggina",
+       "pageinfo-header-properties": "Prupità dâ pàggina",
        "pageinfo-display-title": "Tìtulu ammustratu",
        "pageinfo-default-sort": "Criteriu d'ordinamentu pridifinutu",
-       "pageinfo-length": "Lunghizza dâ pàggina (in byte)",
+       "pageinfo-length": "Lunghizza dâ pàggina (n byte)",
        "pageinfo-article-id": "ID dâ pàggina",
        "pageinfo-language": "Lingua dû cuntinutu dâ pàggina",
        "pageinfo-content-model": "Mudellu dû cuntinutu dâ pàggina",
-       "pageinfo-robot-policy": "Innicizzazzioni pi' menzu di robot",
-       "pageinfo-robot-index": "Cunsintuta",
+       "pageinfo-robot-policy": "Nnicizzazzioni pi menzu di robot",
+       "pageinfo-robot-index": "Cunzintuta",
        "pageinfo-robot-noindex": "Pruibbuta",
-       "pageinfo-watchers": "Quanti talìunu sta pàggina",
+       "pageinfo-watchers": "Quantu talìanu sta pàggina",
        "pageinfo-visiting-watchers": "Nùmmiru d'utenti ntirissati a sta pàggina ca hannu taliatu li canciamenti chiù ricenti",
        "pageinfo-few-watchers": "Cchiù picca di $1 {{PLURAL:$1|taliaturi|taliatura}}",
        "pageinfo-few-visiting-watchers": "Forsi c'è quarchi utenti ntirissatu ca talìa li canciamenti ricenti, forsi no",
-       "pageinfo-redirects-name": "Nùmmiru di rimanni a' sta pàggina",
+       "pageinfo-redirects-name": "Nùmmiru di rimanni a sta pàggina",
        "pageinfo-subpages-name": "Nùmmiru di suttapàggini di sta pàggina",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|chi' è un rimannu|chi' su' rimanni}}; $3 {{PLURAL:$3|chi' nun è un rimannu|chi' nun su' rimanni}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|chi è un rimannu|chi sù rimanni}}; $3 {{PLURAL:$3|chi nun è un rimannu|chi nun sù rimanni}})",
        "pageinfo-firstuser": "Criaturi dâ pàggina",
        "pageinfo-firsttime": "Data dâ criazzioni dâ pàggina",
-       "pageinfo-lastuser": "Ùltimu cuntribbuturi",
-       "pageinfo-lasttime": "Data di l'ùltimu canciamentu",
+       "pageinfo-lastuser": "Ùrtimu cuntribbuturi",
+       "pageinfo-lasttime": "Data di l'ùrtimu canciamentu",
        "pageinfo-edits": "Nùmmiru tutali di canciamenti",
        "pageinfo-authors": "Nùmmiru tutali d'autura distinti",
-       "pageinfo-recent-edits": "Nùmmiru di canciamenti ricenti (nta l'ultimu pirìudu di $1)",
+       "pageinfo-recent-edits": "Nùmmiru di canciamenti ricenti (nta l'ùrtimu pirìudu di $1)",
        "pageinfo-recent-authors": "Nùmmiru di cuntribbutura ricenti distinti",
        "pageinfo-magic-words": "{{PLURAL:$1|Palora màggica|Palori màggichi}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Catigurìa ammucciata|Catigurìi ammucciati}} ($1)",
-       "pageinfo-templates": "{{PLURAL:$1|Template trasclusu|Template trasclusi}} ($1)",
-       "pageinfo-transclusions": "{{PLURAL:$1|Pàggina|Pàggini}} unni chista è trasclusa ($1)",
-       "pageinfo-toolboxlink": "Nfurmazzioni ncapu la pàggina",
-       "pageinfo-redirectsto": "Rimanna a'",
+       "pageinfo-templates": "{{PLURAL:$1|Template nclusu|Template nclusi}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Pàggina|Pàggini}} unni chista è nclusa ($1)",
+       "pageinfo-toolboxlink": "Nfurmazzioni supra la pàggina",
+       "pageinfo-redirectsto": "Rimanna a",
        "pageinfo-redirectsto-info": "nfurmazzioni",
        "pageinfo-contentpage": "Cuntata comu pàggina di cuntinutu",
        "pageinfo-contentpage-yes": "Sì",
-       "pageinfo-protect-cascading": "Di cca pàrtunu prutizzioni a' cascata",
+       "pageinfo-protect-cascading": "Di ccà pàrtinu prutizzioni a cascata",
        "pageinfo-protect-cascading-yes": "Sì",
-       "pageinfo-protect-cascading-from": "Pìgghia prutizzioni a' cascata di",
+       "pageinfo-protect-cascading-from": "Pigghia prutizzioni a cascata di",
        "pageinfo-category-info": "Nfurmazzioni supra â catigurìa",
        "pageinfo-category-total": "Nùmmiru tutali di membri",
        "pageinfo-category-pages": "Nùmmiru di pàggini",
        "markaspatrolleddiff": "Marca comu virificatu",
        "markaspatrolledtext": "Marca sta pàggina comu virificata",
        "markedaspatrolled": "Marcata comu virificata",
-       "markedaspatrolledtext": "La virsioni scigghiuta di [[:$1]] fu' marcata comu battugghiata.",
+       "markedaspatrolledtext": "La virsioni scigghiuta di [[:$1]] fu marcata comu virificata.",
        "rcpatroldisabled": "La virìfica di l'ùrtimi canciamenti è disattivata",
        "rcpatroldisabledtext": "La funzioni di virìfica di l'ùrtimi canciamenti com'a ora è disattivata.",
        "markedaspatrollederror": "Nun si pò marcari comu virificatu",
        "markedaspatrollederrortext": "Hai a spicificari na virsioni di marcari comu virificata.",
        "markedaspatrollederror-noautopatrol": "Nun hai lu pirmissu di marcari li tò canciamenti comu virificati.",
-       "markedaspatrollednotify": "Stu canciamentu a' $1 fu' marcatu comu battugghiatu.",
+       "markedaspatrollednotify": "Stu canciamentu a $1 fu marcatu comu virificatu.",
        "markedaspatrollederrornotify": "La marcatura comu virificatu nun arriniscìu.",
        "patrol-log-page": "Riggistru dî canciamenti virificati",
        "patrol-log-header": "Chistu è nu riggistru dî virsioni virificati.",
        "filedelete-archive-read-only": "La cartella d'archiviu \"$1\" nun è scrivìbbili dû server web.",
        "previousdiff": "← Canciamentu avanti",
        "nextdiff": "Canciamentu appressu →",
-       "mediawarning": "<strong>Accura:</strong>Stu gèniri di file po' cuntèniri còdici malignu.\nEsiquènnulu, lu vostru sistema putissi vèniri cumprumissu.",
+       "mediawarning": "<strong>Accura: </strong>Stu gèniri di file pò cuntèniri còdici malignu.\nEsiquènnulu, lu vostru sistema putissi vèniri cumprumissu.",
        "imagemaxsize": "Diminzioni màssima dî mmàggini:<br />''(pi li pàggini di discrizzioni dô file)''",
        "thumbsize": "Grannizza dî miniaturi:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pàggina|pàggini}}",
        "svg-long-error": "File SVG nun vàlidu: $1",
        "show-big-image": "File origginali",
        "show-big-image-preview": "Diminzioni di st'antiprima: $1.",
-       "show-big-image-other": "{{PLURAL:$2|Autra risuluzzioni|Autri risuluzzioni}}: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Àutra risuluzzioni|Àutri risuluzzioni}}: $1.",
        "show-big-image-size": "$1 × $2 pixel",
        "file-info-gif-looped": "a ripitizzioni",
        "file-info-gif-frames": "$1 {{PLURAL:$1|futugramma|futugrammi}}",
-       "file-info-png-looped": "a' ripitizzioni",
+       "file-info-png-looped": "a ripitizzioni",
        "file-info-png-repeat": "ripitutu {{PLURAL:$1|na vota|$1 voti}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|futugramma|futugrammi}}",
        "file-no-thumb-animation": "<strong>Nota: a càusa di limitazzioni tècnichi, li miniaturi di stu file nun vèninu animati.</strong>",
        "weeks": "{{PLURAL:$1|na simana|$1 simani}}",
        "months": "{{PLURAL:$1|un misi|$1 misi}}",
        "years": "{{PLURAL:$1|un annu|$1 anni}}",
-       "ago": "$1 fa'",
+       "ago": "$1 fa",
        "just-now": "propia ora",
-       "hours-ago": "{{PLURAL:$1|un'ura|$1 uri}} fa'",
-       "minutes-ago": "{{PLURAL:$1|un minutu|$1 minuti}} fa'",
-       "seconds-ago": "{{PLURAL:$1|un sicunnu|$1 sicunni}} fa'",
-       "monday-at": "Lùniri ê $1",
-       "tuesday-at": "Màrtiri ê $1",
-       "wednesday-at": "Mèrcuri ê $1",
-       "thursday-at": "Jòviri ê $1",
-       "friday-at": "Vènniri ê $1",
-       "saturday-at": "Sàbbatu ê $1",
-       "sunday-at": "Dumìnica ê $1",
-       "yesterday-at": "Ajeri ê $1",
+       "hours-ago": "{{PLURAL:$1|un'ura|$1 uri}} fa",
+       "minutes-ago": "{{PLURAL:$1|un minutu|$1 minuti}} fa",
+       "seconds-ago": "{{PLURAL:$1|un sicunnu|$1 sicunni}} fa",
+       "monday-at": "Lunidìa ê $1",
+       "tuesday-at": "Martidìa ê $1",
+       "wednesday-at": "Mercuridìa ê $1",
+       "thursday-at": "Jovidìa ê $1",
+       "friday-at": "Venniridìa ê $1",
+       "saturday-at": "Sabbatudìa ê $1",
+       "sunday-at": "Duminicadìa ê $1",
+       "yesterday-at": "Aieri ê $1",
        "bad_image_list": "Lu furmatu è lu siguenti:\n\nSù pigghiati a cunziddirazzioni sulu li vuci d'elenchi puntati (li righi c'accumènzanu cû sìmmulu *).\nLa prima lijami nta ogni riga havi a puntari ôn file nun addisiatu.\nSi ci sù àutri lijami ntâ stissa riga, sù cunziddirati comu eccizzioni, vali a diri pàggini unni lu file pò èssiri ncurpuratu.",
        "metadata": "Metadati",
        "metadata-help": "Stu file cunteni àutri nfurmazzioni, prubbabbirmenti agghiunciuti dâ màchina futugràfica o dû scanner adupirati pi criàrilu o diggitalizzàrilu.\nSiddu lu file fu canciatu dâ sò cunnizzioni origginali, certi dittagghî putìssiru nun currispùnniri ô statu novu dû file.",
        "exif-spectralsensitivity": "Sinzibbilitati spittrali",
        "exif-isospeedratings": "Sinzibbilitati ISO",
        "exif-shutterspeedvalue": "Tempu d'espusizzioni APEX",
-       "exif-aperturevalue": "Apirtura APEX",
-       "exif-brightnessvalue": "Luminusitati APEX",
+       "exif-aperturevalue": "Grapitura APEX",
+       "exif-brightnessvalue": "Luminusità APEX",
        "exif-exposurebiasvalue": "Currezzioni espusizzioni",
        "exif-maxaperturevalue": "Apirtura màssima",
        "exif-subjectdistance": "Distanza dû suggettu",
        "exif-gpsdifferential": "Currezzioni diffirinziali GPS",
        "exif-jpegfilecomment": "Cummentu dû file JPEG",
        "exif-keywords": "Palori chiavi",
-       "exif-worldregioncreated": "Parti dû munnu unni sta fotu fu' pigghiata",
-       "exif-countrycreated": "Paìsi dû munnu unni sta fotu fu' pigghiata",
-       "exif-countrycodecreated": "Còdici dû paìsi unni sta fotu fu' pigghiata",
-       "exif-provinceorstatecreated": "Riggioni o pruvincia unni sta fòtu fu' pigghiata",
-       "exif-citycreated": "Citati unni sta fotu fu' pigghiata",
-       "exif-sublocationcreated": "Parti dâ citati unni sta fotu fu' pigghiata",
+       "exif-worldregioncreated": "Parti dû munnu unni sta fotu fu pigghiata",
+       "exif-countrycreated": "Paisi dû munnu unni sta fotu fu pigghiata",
+       "exif-countrycodecreated": "Còdici dû paisi unni sta fotu fu pigghiata",
+       "exif-provinceorstatecreated": "Riggiuni o pruvincia unni sta fòtu fu pigghiata",
+       "exif-citycreated": "Cità unni sta fotu fu pigghiata",
+       "exif-sublocationcreated": "Parti dâ cità unni sta fotu fu pigghiata",
        "exif-worldregiondest": "Parti dû munnu raffigurata",
-       "exif-countrydest": "Paìsi dû munnu raffiguratu",
-       "exif-countrycodedest": "Còdici dû paìsi raffiguratu",
-       "exif-provinceorstatedest": "Riggioni o pruvincia raffigurata",
-       "exif-citydest": "Citati raffigurata",
-       "exif-sublocationdest": "Parti dâ citati raffigurata",
+       "exif-countrydest": "Paisi dû munnu raffiguratu",
+       "exif-countrycodedest": "Còdici dû paisi raffiguratu",
+       "exif-provinceorstatedest": "Riggiuni o pruvincia raffigurata",
+       "exif-citydest": "Cità raffigurata",
+       "exif-sublocationdest": "Parti dâ cità raffigurata",
        "exif-objectname": "Tìtulu curtu",
-       "exif-specialinstructions": "Istruzzioni spiciali",
+       "exif-specialinstructions": "Struzzioni spiciali",
        "exif-headline": "Tìtulu",
        "exif-credit": "Orìggini/Furnituri",
        "exif-source": "Fonti",
        "exif-languagecode": "Lingua",
        "exif-iimversion": "Virsioni di IIM",
        "exif-iimcategory": "Catigurìa",
-       "exif-iimsupplementalcategory": "Catigurìi aggiuntivi",
+       "exif-iimsupplementalcategory": "Catigurìi agghiuntivi",
        "exif-datetimeexpires": "Di nun adupiràri doppu",
        "exif-datetimereleased": "Data di rilassu",
        "exif-originaltransmissionref": "Còdici dû locu di trasmissioni origginali",
        "exif-identifier": "Idintificaturi",
        "exif-lens": "Lenti adupirata",
-       "exif-serialnumber": "Nummiru di serî dâ màchina futugràfica",
-       "exif-cameraownername": "Prupietariu dâ màchina futugràfica",
+       "exif-serialnumber": "Nùmmiru di serî dâ màchina futugràfica",
+       "exif-cameraownername": "Prupitariu dâ màchina futugràfica",
        "exif-label": "Etichetta",
-       "exif-datetimemetadata": "Data di l'ùltimu canciamentu dî metadati",
-       "exif-nickname": "Nomu infurmali dâ mmàggini",
-       "exif-rating": "Votu (supra a' 5)",
+       "exif-datetimemetadata": "Data di l'ùrtimu canciamentu dî metadati",
+       "exif-nickname": "Nomu nfurmali dâ mmàggini",
+       "exif-rating": "Votu (supra a 5)",
        "exif-rightscertificate": "Cirtificatu pâ gistioni dî dritti",
        "exif-copyrighted": "Cupertu di drittu d'auturi",
        "exif-copyrightowner": "Ditinturi dû drittu d'auturi",
        "exif-usageterms": "Tèrmini pi l'usu",
-       "exif-webstatement": "Dichiarazzioni di drittu d'auturi in linia",
+       "exif-webstatement": "Dichiarazzioni di drittu d'auturi n lìnia",
        "exif-originaldocumentid": "Idintificaturi unìvucu dû ducumentu origginali",
        "exif-licenseurl": "URL dâ licenza di drittu d'auturi",
-       "exif-morepermissionsurl": "Nfurmazzioni pâ cuncissioni di autri licenzi",
-       "exif-attributionurl": "Quannu si fa usu di st'òpira, si prega di mèttiri na lijami versu",
-       "exif-preferredattributionname": "Quannu si fa' usu di st'òpira, si prega di attribuìrinni a patirnità a'",
+       "exif-morepermissionsurl": "Nfurmazzioni pâ cuncissioni dutri licenzi",
+       "exif-attributionurl": "Quannu si fa usu di st'òpira, si prega di mèttiri nu lijami versu",
+       "exif-preferredattributionname": "Quannu si fa usu di st'òpira, si prega d'attribuìrinni la patirnità a",
        "exif-pngfilecomment": "Cummentu dû file PNG",
-       "exif-disclaimer": "Dichiarazzioni di esclusioni di rispunsabbilità",
-       "exif-contentwarning": "Avvirtimentu supra ô cuntinutu",
+       "exif-disclaimer": "Dichiarazzioni d'esclusioni di rispunzabbilità",
+       "exif-contentwarning": "Avvisu supra ô cuntinutu",
        "exif-giffilecomment": "Cummentu dû file GIF",
-       "exif-intellectualgenre": "Gèniri delimentu",
+       "exif-intellectualgenre": "Gèniri d'elimentu",
        "exif-subjectnewscode": "Còdici di l'oggettu",
        "exif-scenecode": "Còdici IPTC dâ nquatratura",
        "exif-event": "Eventu raffiguratu",
        "exif-originalimageheight": "Autizza dâ mmàggini avanti dû ritagghiu",
        "exif-originalimagewidth": "Larghizza dâ mmàggini avanti dû ritagghiu",
        "exif-compression-1": "Nuddu",
-       "exif-compression-2": "cudìfica unidiminsiunali run-length encoding mudificata di Huffman dû Gruppu 3 CCITT",
+       "exif-compression-2": "cudìfica unidiminziunali run-length encoding canciata di Huffman dû Gruppu 3 CCITT",
        "exif-compression-3": "cudìfica di fax dû Gruppu 3 CCITT",
        "exif-compression-4": "cudìfica di fax dû Gruppu 4 CCITT",
        "exif-copyrighted-true": "Prutettu di drittu d'auturi",
        "exif-orientation-3": "Rutatu di 180°",
        "exif-orientation-4": "Capuvortu virticarmenti",
        "exif-orientation-5": "Rotatu 90° 'n sensu antiurariu e capuvortu virticarmenti",
-       "exif-orientation-6": "Vutatu di 90° 'n senzu antiurariu",
+       "exif-orientation-6": "Vutatu di 90° n senzu antiurariu",
        "exif-orientation-7": "Rotatu 90° 'n sensu urariu e capuvortu virticarmenti",
-       "exif-orientation-8": "Vutatu di 90° 'n senzu urariu",
+       "exif-orientation-8": "Vutatu di 90° n senzu urariu",
        "exif-planarconfiguration-1": "a blocchi (chunky)",
        "exif-planarconfiguration-2": "liniari (planar)",
        "exif-xyresolution-i": "$1 punti pi puseri (dpi)",
        "exif-gpsdop-poor": "Pèssima ($1)",
        "exif-objectcycle-a": "Sulu pâ matina",
        "exif-objectcycle-p": "Sulu pâ sira",
-       "exif-objectcycle-b": "Pi' matina e sira",
+       "exif-objectcycle-b": "Pi matina e sira",
        "exif-gpsdirection-t": "Direzzioni riali",
        "exif-gpsdirection-m": "Direzzioni magnètica",
        "exif-ycbcrpositioning-1": "Cintrati",
        "exif-dc-source": "File surgenti",
        "exif-dc-type": "Sorta di file",
        "exif-rating-rejected": "Riggittatu",
-       "exif-isospeedratings-overflow": "Maggiuri di 65535",
-       "exif-iimcategory-ace": "Arti, cultura e' spittàculu",
+       "exif-isospeedratings-overflow": "Maiuri di 65535",
+       "exif-iimcategory-ace": "Arti, cultura e spittàculu",
        "exif-iimcategory-clj": "Crìmini e giustizzia",
-       "exif-iimcategory-dis": "Disastri e incidenti",
+       "exif-iimcategory-dis": "Disastri e ncidenti",
        "exif-iimcategory-fin": "Ecunumìa e affari",
-       "exif-iimcategory-edu": "Istruzzioni",
+       "exif-iimcategory-edu": "Struzzioni",
        "exif-iimcategory-evn": "Ammienti",
        "exif-iimcategory-hth": "Saluti",
        "exif-iimcategory-hum": "Casi umani",
        "exif-iimcategory-lab": "Travagghiu",
-       "exif-iimcategory-lif": "Stili di vita e' arricrìu",
+       "exif-iimcategory-lif": "Stili di vita e arricrìu",
        "exif-iimcategory-pol": "Pulìtica",
-       "exif-iimcategory-rel": "Riliggioni e fidi",
-       "exif-iimcategory-sci": "Scienza e ticnuluggìa",
-       "exif-iimcategory-soi": "Quistioni suciali",
+       "exif-iimcategory-rel": "Riliggiuni e fidi",
+       "exif-iimcategory-sci": "Scienza e ticnoluggìa",
+       "exif-iimcategory-soi": "Chistioni suciali",
        "exif-iimcategory-spo": "Sport",
        "exif-iimcategory-war": "Guerra, cunflitti e disòrdini",
        "exif-iimcategory-wea": "Tempu atmusfèricu",
        "exif-urgency-normal": "Nurmali ($1)",
-       "exif-urgency-low": "Auta ($1)",
-       "exif-urgency-high": "Bascia ($1)",
+       "exif-urgency-low": "Vascia ($1)",
+       "exif-urgency-high": "Àuta ($1)",
        "exif-urgency-other": "Difinuta di l'utenti ($1)",
        "namespacesall": "Tutti",
        "monthsall": "tutti",
-       "confirmemail": "Cunfirma dû nnirizzu di posta elittrònica",
+       "confirmemail": "Cunferma dû nnirizzu di posta elittrònica",
        "confirmemail_noemail": "Nun hà statu ndicatu un ndirizzu e-mail vàlidu ntê propi [[Special:Preferences|prifirenzi]].",
        "confirmemail_text": "{{SITENAME}} addumanna la cunvàlida dû tò nnirizzu di posta elittrònica pi putiri adupirari li funziunalità assuciati.\nCarca lu buttuni ccassutta pi mannari nu missaggiu e-mail di cunferma a lu tò nnirizzu.\nNtô missaggiu c'è un lijami ca cunteni un còdici;\ncàrrica ddu lijami cô tò browser pi cunfirmari ca lu tò nnirizzu di posta elittrònica è vàlidu.",
        "confirmemail_pending": "Già nu còdici di cunferma ti fu mannatu via posta elittrònica;\nsiddu criasti lu tò cuntu di picca tempu, è megghiu c'aspetti l'arrivu dû còdici pi quarchi minutu prima di pruvari a addumannàrinni unu novu.",
-       "confirmemail_send": "Manna un còdici di cunfirma via e-mail",
-       "confirmemail_sent": "Missaggiu e-mail di cunfirma mannatu.",
+       "confirmemail_send": "Manna un còdici di cunferma via e-mail",
+       "confirmemail_sent": "Missaggiu e-mail di cunferma mannatu.",
        "confirmemail_oncreate": "Un còdici di cunferma fu spidutu a lu tò nnirizzu di posta elittrònica.\nLu còdici nun servi pi tràsiri nta lu situ, ma l'hai a prisintari pi putiri attivari tutti li funzioni dâ wiki ca fannu usu dâ posta elittrònica.",
-       "confirmemail_sendfailed": "{{SITENAME}} nun potti mannari lu to missaggiu e-mail di cunfirma.\nVirificari ca lu nnirizzu nun cunteni caràttiri nun vàlidi.\n\nMissaggiu d'erruri dû sirvizziu di posta: $1",
-       "confirmemail_invalid": "Còdici di cunfirma nun vàlidu.\nLu còdici putissi èssiri scadutu.",
+       "confirmemail_sendfailed": "{{SITENAME}} nun potti mannari lu tò missaggiu e-mail di cunferma.\nVirificari ca lu nnirizzu nun cunteni caràttiri nun vàlidi.\n\nMissaggiu d'erruri dû sirvizziu di posta: $1",
+       "confirmemail_invalid": "Còdici di cunferma nun vàlidu.\nLu còdici putissi èssiri scadutu.",
        "confirmemail_needlogin": "Pi favuri $1 pi cunvalidari lu tò nnirizzu di posta elittrònica.",
        "confirmemail_success": "Lu ndirizzu e-mail è cunfirmatu. Ora è pussìbbili esèquiri l'accessu e fari chinu usu dû situ.",
        "confirmemail_loggedin": "Lu tò nnirizzu email fu ora cunfirmatu.",
-       "confirmemail_subject": "Cunfirma dû nnirizzu di posta elittronica pi' {{SITENAME}}",
-       "confirmemail_body": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nriggistrau un cuntu \"$2\" cu stu nnirizzu di posta elittrònica supra a {{SITENAME}}.\n\nPi cunfirmari ca stu cuntu apparteni pi daveru a tìa,\ne attivari li funziunalità di posta elittrònica supra a {{SITENAME}},\ngrapi sta lijami cû tò browser:\n\n$3\n\nSi mmeci stu cuntu *nun t'apparteni*, clicca sta lijami\npi nigari la cunferma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunferma scadi lu $4.",
-       "confirmemail_body_changed": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\ncanciau lu nnirizzu di posta elittrònica dû cuntu \"$2\" supra a {{SITENAME}} mpustànnulu a chistu.\n\nPi cunfirmari ca stu cuntu apparteni pi daveru a tìa,\ne attivari n'àutra vota li funziunalità di posta elittrònica supra a {{SITENAME}},\ngrapi sta lijami cû tò browser:\n\n$3\n\nSi mmeci stu cuntu *nun t'apparteni*, clicca sta lijami\npi nigari la cunferma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunferma scadi lu $4.",
-       "confirmemail_body_set": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nmpustau stu nnirizzu di posta elittrònica pû cuntu \"$2\" supra a {{SITENAME}}.\n\nPi cunfirmari ca stu cuntu apparteni pi daveru a tìa,\ne attivari li funziunalità di posta elittrònica supra a {{SITENAME}},\ngrapi sta lijami cû tò browser:\n\n$3\n\nSi mmeci stu cuntu *nun t'apparteni*, clicca sta lijami\npi nigari la cunferma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunferma scadi lu $4.",
-       "confirmemail_invalidated": "Cunvàlida dû nnirizzu di posta elittronica nigata",
+       "confirmemail_subject": "Cunferma dû nnirizzu di posta elittronica pi {{SITENAME}}",
+       "confirmemail_body": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nriggistrau un cuntu \"$2\" cu stu nnirizzu di posta elittrònica supra a {{SITENAME}}.\n\nPi cunfirmari ca stu cuntu apparteni pi daveru a tìa,\ne attivari li funziunalità di posta elittrònica supra a {{SITENAME}},\ngrapi stu lijami cû tò browser:\n\n$3\n\nSi mmeci stu cuntu *nun t'apparteni*, clicca stu lijami\npi nigari la cunferma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunferma scadi lu $4.",
+       "confirmemail_body_changed": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\ncanciau lu nnirizzu di posta elittrònica dû cuntu \"$2\" supra a {{SITENAME}} mpustànnulu a chistu.\n\nPi cunfirmari ca stu cuntu apparteni pi daveru a tìa,\ne attivari n'àutra vota li funziunalità di posta elittrònica supra a {{SITENAME}},\ngrapi stu lijami cû tò browser:\n\n$3\n\nSi mmeci stu cuntu *nun t'apparteni*, clicca stu lijami\npi nigari la cunferma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunferma scadi lu $4.",
+       "confirmemail_body_set": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nmpustau stu nnirizzu di posta elittrònica pû cuntu \"$2\" supra a {{SITENAME}}.\n\nPi cunfirmari ca stu cuntu apparteni pi daveru a tìa,\ne attivari li funziunalità di posta elittrònica supra a {{SITENAME}},\ngrapi stu lijami cû tò browser:\n\n$3\n\nSi mmeci stu cuntu *nun t'apparteni*, clicca stu lijami\npi nigari la cunferma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunferma scadi lu $4.",
+       "confirmemail_invalidated": "Cunvàlida dû nnirizzu di posta elittrònica nigata",
        "invalidateemail": "Nigazzioni dâ cunvàlida dâ posta elittrònica",
        "scarytranscludedisabled": "[La nchiusioni di pàggini tra siti wiki nun è attiva]",
        "scarytranscludefailed": "[Erruri: Mpussìbbili uttèniri lu template $1]",
-       "scarytranscludefailed-httpstatus": "[Carricamentu dû template nun rinisciutu di $1: HTTP $2]",
+       "scarytranscludefailed-httpstatus": "[Carricamentu dû template nun arrinisciutu di $1: HTTP $2]",
        "scarytranscludetoolong": "[URL troppu longu]",
        "deletedwhileediting": "'''Accura''': Sta pàggina vinni scancillata doppu c'hai accuminzatu a scanciàrila!",
        "confirmrecreate": "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) cancillau sta pàggina appressu chi tu avivi accuminzatu a canciàrila, dannu sta spigazzioni:\n: <em>$2</em>\nPi favuri cunferma chi voi criari n'àutra vota sta pàggina pi daveru.",
        "confirmrecreate-noreason": "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) cancillau sta pàggina appressu chi tu avivi accuminzatu a canciàrila. Pi favuri cunferma chi voi criari n'àutra vota sta pàggina pi daveru.",
        "recreate": "Ricrìa",
        "unit-pixel": "px",
-       "confirm_purge_button": "Cunfirma",
+       "confirm_purge_button": "Cunferma",
        "confirm-purge-top": "S'addisìa puliri la cache di sta pàggina?",
        "confirm-purge-bottom": "Pulizziari la cache di na pàggina pirmetti d'ammustrari la sô virsioni cchiù nova.",
-       "confirm-watch-button": "Cunfirma",
+       "confirm-watch-button": "Cunferma",
        "confirm-watch-top": "Agghiùnciri sta pàggina â tò lista taliata?",
-       "confirm-unwatch-button": "Cunfirma",
+       "confirm-unwatch-button": "Cunferma",
        "confirm-unwatch-top": "Livari sta pàggina dâ tò lista taliata?",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← pàggina pricidenti",
        "imgmultigo": "Va'",
        "imgmultigoto": "Vai a pàggina $1",
        "img-lang-default": "(lingua pridifinuta)",
-       "img-lang-info": "Gènira sta mmàggini in $1. $2",
+       "img-lang-info": "Gènira sta mmàggini n $1. $2",
        "img-lang-go": "Vai",
        "ascending_abbrev": "crisc",
        "descending_abbrev": "dicrisc",
        "table_pager_first": "Prima pàggina",
        "table_pager_last": "Ùrtima pàggina",
        "table_pager_limit": "Ammustra $1 file pi pàggina",
-       "table_pager_limit_label": "Elimenti pi' pàggina:",
+       "table_pager_limit_label": "Elimenti pi pàggina:",
        "table_pager_limit_submit": "Va'",
        "table_pager_empty": "Nuddu risurtatu",
        "autosumm-blank": "Pàggina svacantata",
        "watchlistedit-clear-titles": "Tìtuli:",
        "watchlistedit-clear-submit": "Svacanta la lista taliata (Sta cosa è difinitiva!)",
        "watchlistedit-clear-done": "La tò lista taliata fu svacantata.",
-       "watchlistedit-clear-removed": "{{PLURAL:$1|Un tìtulu fu'|$1 tìtuli furu}} livati:",
-       "watchlistedit-too-many": "Cci su' troppu pàggini p'ammustràrili cca.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Un tìtulu fu|$1 tìtuli foru}} livati:",
+       "watchlistedit-too-many": "Ci sù troppu pàggini p'ammustràrili ccà.",
        "watchlisttools-clear": "Svacanta la lista taliata",
        "watchlisttools-view": "Talìa li canciamenti rilivanti",
        "watchlisttools-edit": "Talìa e cancia la lista taliata",
        "iranian-calendar-m3": "Khordad",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussioni]])",
        "duplicate-defaultsort": "Accura: la chiavi priddifinuta d'urdinamentu \"$2\" si sciarrìa cu chidda d'antura \"$1\".",
-       "duplicate-displaytitle": "<strong>Accura:</strong> U tìtulu a' ammustrari \"$2\" va' e rimpiazza u tìtulu a' ammustrari pricidenti \"$1\".",
-       "invalid-indicator-name": "<strong>Erruri:</strong> L'attribbutu <code>name</code> di l'innicaturi di statu dâ pàggina nun havi a' èssiri vacanti.",
+       "duplicate-displaytitle": "<strong>Accura:</strong> Lu tìtulu a ammustrari \"$2\" va e rimpiazza lu tìtulu a ammustrari pricidenti \"$1\".",
+       "invalid-indicator-name": "<strong>Erruri:</strong> L'attribbutu <code>name</code> dô nnicaturi di statu dâ pàggina nun havi a èssiri vacanti.",
        "version": "Virsioni",
        "version-extensions": "Estenzioni nstallati",
        "version-skins": "Peddi nstallati",
        "version-no-ext-name": "[nuddu nomu]",
        "version-license": "Licenza di MediaWiki",
        "version-ext-license": "Licenza",
-       "version-ext-colheader-name": "Estinsioni",
+       "version-ext-colheader-name": "Estinzioni",
        "version-skin-colheader-name": "Peddi",
        "version-ext-colheader-version": "Virsioni",
        "version-ext-colheader-license": "Licenza",
        "version-ext-colheader-credits": "Auturi",
        "version-license-title": "Licenza di $1",
        "version-license-not-found": "Pi sta stinzioni nun fu attruvata nudda nfurmazzioni a prupòsitu dâ licenza.",
-       "version-credits-title": "Ricanuscimenti pi' $1",
+       "version-credits-title": "Arricanuscimenti pi $1",
        "version-credits-not-found": "Pi sta stinzioni nun fu attruvata nudda nfurmazzioni a prupòsitu di l'arricanuscimenti.",
-       "version-poweredby-credits": "Sta wiki funziona cu' <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
-       "version-poweredby-others": "autri",
-       "version-poweredby-translators": "i tradutturi di translatewiki.net",
-       "version-credits-summary": "Vulemu ricanusciri u cuntribbutu di sti pirsuni a' [[Special:Version|MediaWiki]].",
+       "version-poweredby-credits": "Sta wiki funziona cu <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+       "version-poweredby-others": "àutri",
+       "version-poweredby-translators": "li tradutturi di translatewiki.net",
+       "version-credits-summary": "Vulemu arricanùsciri lu cuntribbutu di sti pirsuni a [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki è nu software lìbbiru; si pò ridistribbuiri e/o canciari sutta ê tèrmini dâ GNU General Public License comu pubblicata dâ Free Software Foundation; o la virsioni 2 dâ Licenza, o (a scigghiuta propia) na virsioni succissiva qualegghiè.\n\nMediaWiki veni distribuutu ntâ spiranza chi sia ùtili, pirò SENZA NUDDA GARANZÌA; mancu chidda mplìcita di NIGUZZIABBILITÀ o d'APPLICABBILITÀ PI NU SCOPU PARTICULARI. Si taliassi la GNU General Public License pi maiuri dittagghî.\n\nS'avissi a aviri arricivutu [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia dâ GNU General Public License] nzèmmula a stu prugramma; si no, si pò scrìviri â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html la si pò lèggiri n lìnia].",
        "version-software": "Software nstallatu",
        "version-software-product": "Prodottu",
        "version-entrypoints": "URL dî punti d'accessu",
        "version-entrypoints-header-entrypoint": "Puntu d'accessu",
        "version-entrypoints-header-url": "URL",
-       "version-libraries": "Libbrarìi installati",
+       "version-libraries": "Libbrarìi nstallati",
        "version-libraries-library": "Libbrarìa",
        "version-libraries-version": "Virsioni",
        "version-libraries-license": "Licenza",
        "version-libraries-description": "Discrizzioni",
        "version-libraries-authors": "Autura",
-       "redirect": "Rimannu pi' nomu di file o còdici di utenti, di pàggina o di virsioni",
-       "redirect-legend": "Rimannari a' nu file o na pàggina",
-       "redirect-summary": "Sta pàggina spiciali rimanna a' nu file (datu u nomu dû file), a' na pàggina (datu n'ID di virsioni o n'ID di pàggina), o puru â pàggina di n'utenti (datu n'ID nummèricu di utenti). Esempî di usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
-       "redirect-submit": "Vacci",
-       "redirect-lookup": "Cerca pi':",
-       "redirect-value": "Cu' valuri:",
+       "redirect": "Rimannu pi nomu di file o còdici di utenti, di pàggina o di virsioni",
+       "redirect-legend": "Rimannari a nu file o na pàggina",
+       "redirect-summary": "Sta pàggina spiciali rimanna a nu file (datu lu nomu dû file), a na pàggina (datu n'ID di virsioni o n'ID di pàggina), o puru â pàggina di n'utenti (datu n'ID nummèricu d'utenti). Esempî d'usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
+       "redirect-submit": "Vai",
+       "redirect-lookup": "Arricerca:",
+       "redirect-value": "Cu valuri:",
        "redirect-user": "ID d'utenti",
        "redirect-page": "ID di pàggina",
        "redirect-revision": "ID di virsioni di pàggina",
        "redirect-file": "Nomu di file",
-       "redirect-not-exists": "Valuri nun truvatu",
-       "fileduplicatesearch": "Circata dê file duppiuni",
+       "redirect-not-exists": "Valuri nun attruvatu",
+       "fileduplicatesearch": "Arricerca dê file duppiuni",
        "fileduplicatesearch-summary": "Circata di pussìbbili dupppiuni dû file 'n basi ô valuri di ''hash''.",
        "fileduplicatesearch-legend": "Circata di nu duppiuni",
        "fileduplicatesearch-filename": "Nomu dû file:",
        "fileduplicatesearch-result-n": "{{PLURAL:$2|C'è ggià nu duppiuni lu stissu|Ci sunnu ggià $2 duppiuni li stissi}} dû file \"$1\".",
        "fileduplicatesearch-noresults": "Nuddu file chiamatu \"$1\" fu attruvatu.",
        "specialpages": "Pàggini spiciali",
-       "specialpages-note-top": "Legenda",
+       "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-other": "Autri pàggini spiciali",
+       "specialpages-group-other": "Àutri pàggini spiciali",
        "specialpages-group-login": "Trasuta / criazzioni di cunti",
        "specialpages-group-changes": "Ùrtimi canciamenti e riggistri",
        "specialpages-group-media": "File multimidiali - caricamentu e rennicunti",
        "specialpages-group-highuse": "Pàggini cchiù usati",
        "specialpages-group-pages": "Listi di pàggini",
        "specialpages-group-pagetools": "Strumenti ùtili pi li pàggini",
-       "specialpages-group-wiki": "Dati e strumenti",
+       "specialpages-group-wiki": "Dati e strummenti",
        "specialpages-group-redirects": "Pàggini spiciali chi rimànnanu",
        "specialpages-group-spam": "Strumenti contr'a lu spam",
        "specialpages-group-developer": "Stigghi dû sviluppaturi",
        "compare-rev1": "Virsioni 1",
        "compare-rev2": "Virsioni 2",
        "compare-submit": "Cunfrunta",
-       "compare-invalid-title": "U tìtulu ca spicificasti nun è vàlidu.",
-       "compare-title-not-exists": "U tìtulu ca spicificasti nun esisti.",
-       "compare-revision-not-exists": "A virsioni ca spicificasti nun esisti.",
+       "compare-invalid-title": "Lu tìtulu ca spicificasti nun è vàlidu.",
+       "compare-title-not-exists": "Lu tìtulu ca spicificasti nun esisti.",
+       "compare-revision-not-exists": "La virsioni ca spicificasti nun esisti.",
        "dberr-problems": "Spiacenti! Stu situ sta havennu prublema tecnici.",
        "dberr-again": "Prova a aspittari na para di minuti e ricaricari.",
-       "dberr-info": "(Impussìbbili accèdiri â basi di dati: $1)",
-       "dberr-info-hidden": "(Impussìbbili accèdiri â basi di dati)",
+       "dberr-info": "(Mpussìbbili accèdiri â basi di dati: $1)",
+       "dberr-info-hidden": "(Mpussìbbili accèdiri â basi di dati)",
        "dberr-usegoogle": "Poi pruvari a circari supra Google ammentri.",
        "dberr-outofdate": "Nota ca la sò nnicizzazioni dû nostru cuntinutu pò nun èssiri aggiurnata.",
        "dberr-cachederror": "Chista ca segui è na copia cache da pàggina richiesta, e putissi essiri nun aggiurnata.",
        "htmlform-no": "No",
        "htmlform-yes": "Sì",
        "htmlform-chosen-placeholder": "Silizziona na opzioni",
-       "htmlform-cloner-create": "Agghiunci autru",
+       "htmlform-cloner-create": "Agghiunci àutru",
        "htmlform-cloner-delete": "Leva",
-       "htmlform-cloner-required": "Cci voli almenu nu valuri.",
+       "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-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à di risciduta a' tuttu testu",
-       "sqlite-no-fts": "$1 senza capacità di risciduta a' tuttu testu",
+       "sqlite-has-fts": "$1 cu capacità d'arricerca a tuttu testu",
+       "sqlite-no-fts": "$1 senza capacità d'arricerca a tuttu testu",
        "logentry-delete-delete": "$1 {{GENDER:$2|cancillau}} la pàggina $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|ripristinau}} la pàggina $3",
-       "logentry-delete-event": "$1 {{GENDER:$2|canciau}} a visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
-       "logentry-delete-revision": "$1 {{GENDER:$2|canciau}} a visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
-       "logentry-delete-event-legacy": "$1 {{GENDER:$2|canciau}} a visibbilità di eventi dû riggistru di $3",
-       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|canciau}} a visibbilità di virsioni dâ pàggina $3",
-       "logentry-suppress-delete": "$1 {{GENDER:$2|supprimìu}} a pàggina $3",
-       "logentry-suppress-event": "$1 {{GENDER:$2|canciau}} a' mmucciuni a' visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
-       "logentry-suppress-revision": "$1 {{GENDER:$2|canciau}} a' mmucciuni a visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
-       "logentry-suppress-event-legacy": "$1 {{GENDER:$2|canciau}} a' mmucciuni a visibbilità di eventi dû riggistru di $3",
-       "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|canciau}} a' mmucciuni a visibbilità di virsioni dâ pàggina $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|canciau}} la visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|canciau}} la visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|canciau}} la visibbilità d'eventi dû riggistru di $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|canciau}} la visibbilità di virsioni dâ pàggina $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|supprimìu}} la pàggina $3",
+       "logentry-suppress-event": "$1 {{GENDER:$2|canciau}} ammucciuni la visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
+       "logentry-suppress-revision": "$1 {{GENDER:$2|canciau}} ammucciuni la visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
+       "logentry-suppress-event-legacy": "$1 {{GENDER:$2|canciau}} ammucciuni la visibbilità d'eventi dû riggistru di $3",
+       "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|canciau}} ammucciuni la visibbilità di virsioni dâ pàggina $3",
        "revdelete-content-hid": "cuntinutu ammucciatu",
        "revdelete-summary-hid": "riassuntu dû canciamentu ammucciatu",
        "revdelete-uname-hid": "nomu utenti ammucciatu",
        "logentry-import-interwiki": "$1 {{GENDER:$2|mpurtau}} $3 di n'àutra wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|juncìu}} $3 nta $4 (virsioni nfina ô $5)",
        "logentry-move-move": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4",
-       "logentry-move-move-noredirect": "$1 {{GENDER:$2|spustau}} a pàggina $3 nta $4 senza lassari nu rimannu",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|spustau}} la pàggina $3 nta $4 senza lassari nu rimannu",
        "logentry-move-move_redir": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4 cu nu rinnirizzamentu",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|spustau}} a pàggina $3 nta $4 ô postu dûn rimannu senza lassari nu rimannu",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|marcau}} a virsioni $4 dâ pàggina $3 comu battugghiata",
-       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcau}} di manera autumàtica a virsioni $4 dâ pàggina $3 comu battugghiata",
-       "logentry-newusers-newusers": "U cuntu di l'utenti $1 fu {{GENDER:$2|criatu}}",
-       "logentry-newusers-create": "U cuntu di l'utenti $1 fu' {{GENDER:$2|criatu}}",
-       "logentry-newusers-create2": "U cuntu di l'utenti $3 fu' {{GENDER:$2|criatu}} di $1",
-       "logentry-newusers-byemail": "U cuntu di l'utenti $3 fu' {{GENDER:$2|criatu}} di $1 e a password fu' mannata via posta elittrònica",
-       "logentry-newusers-autocreate": "U cuntu di l'utenti $1 fu' {{GENDER:$2|criatu}} di manera autumàtica",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|spustau}} la pàggina $3 nta $4 ô postu dûn rimannu senza lassari nu rimannu",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|marcau}} la virsioni $4 dâ pàggina $3 comu virificata",
+       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcau}} di manera autumàtica la virsioni $4 dâ pàggina $3 comu virificata",
+       "logentry-newusers-newusers": "Lu cuntu di l'utenti $1 fu {{GENDER:$2|criatu}}",
+       "logentry-newusers-create": "Lu cuntu di l'utenti $1 fu {{GENDER:$2|criatu}}",
+       "logentry-newusers-create2": "Lu cuntu di l'utenti $3 fu {{GENDER:$2|criatu}} di $1",
+       "logentry-newusers-byemail": "Lu cuntu di l'utenti $3 fu {{GENDER:$2|criatu}} di $1 e la password fu mannata via posta elittrònica",
+       "logentry-newusers-autocreate": "Lu cuntu di l'utenti $1 fu {{GENDER:$2|criatu}} di manera autumàtica",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|spustau}} li mpustazzioni di prutizzioni di $4 a’ $3",
        "logentry-rights-rights": "$1 {{GENDER:$2|canciau}} l'appartinenza di $3 dû gruppu $4 ô gruppu $5",
-       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|canciau}} l'appartinenza a' gruppi di $3",
-       "logentry-rights-autopromote": "$1 fu' {{GENDER:$2|prumuvutu|prumuvuta}} di manera autumatica di $4 a' $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|canciau}} l'appartinenza a gruppi di $3",
+       "logentry-rights-autopromote": "$1 fu {{GENDER:$2|prumuvutu|prumuvuta}} di manera autumàtica di $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|carricau}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|carricau}} na virsioni nova di $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|carricau}} $3",
        "revdelete-summary": "riassuntu dô canciamentu",
        "feedback-adding": "Agghiuncimentu dû cummentu â pàggina...",
        "feedback-back": "N'arreri",
-       "feedback-bugcheck": "Bonu! Sulu cuntrolla chi' nun è unu dî [$1 bug già canusciuti].",
-       "feedback-bugnew": "Cuntrullai. Signala nu bug novu",
+       "feedback-bugcheck": "Bonu! Sulu cuntrolla chi nun è unu dî [$1 bug già canusciuti].",
+       "feedback-bugnew": "Cuntrullai. Assignala nu bug novu",
        "feedback-bugornote": "Si sî bonu a discrìviri un prubblema tècnicu di manera dittagghiata, pi favuri [$1 signala nu bug].\nSi no, poi adupirari lu mòdulu facilitatu ccassutta. Lu tò cummentu è agghiunciutu â pàggina \"[$3 $2]\", nzèmmula ô tò nomu utenti.",
        "feedback-cancel": "Annulla",
        "feedback-close": "Finutu",
        "feedback-dialog-title": "Lassa nu cummentu",
        "feedback-dialog-intro": "Poi adupirari stu mòdulu facili ccassutta pi lassari lu tò cummentu. Stu cummentu è agghiunciutu â pàggina «$1», nzèmmula ô tò nomu utenti.",
        "feedback-error-title": "Erruri",
-       "feedback-error1": "Erruri: Risultatu di l'API nun ricanusciutu",
-       "feedback-error2": "Erruri: A mudìfica nun riniscìu",
+       "feedback-error1": "Erruri: Risurtatu di l'API nun arricanusciutu",
+       "feedback-error2": "Erruri: Lu canciamentu nun arriniscìu",
        "feedback-error3": "Erruri: Nudda arrispunnuta di l'API",
        "feedback-error4": "Erruri: Nun fu pussìbbili pubblicari ntô tìtulu dû cummentu spicificatu",
        "feedback-message": "Missaggiu:",
        "feedback-submit": "Manna",
        "feedback-terms": "Capisciu ca li nfurmazzioni dû mè aggenti di l'utenti cuntèninu li virsioni pricisi dû mè browser e dû mè sistema opirativu, e ca sti nfurmazzioni sunnu cunnivisi pubblicamenti a latu dû mè cummentu.",
        "feedback-termsofuse": "Accunzentu a lassari lu mè cummentu n cuncurdanza cu li Cunnizzioni d'Usu.",
-       "feedback-thanks": "Grazzî! U to cummentu fu' affissu ntâ pàggina \"[$2 $1]\".",
+       "feedback-thanks": "Grazzî! Lu tò cummentu fu affissu ntâ pàggina \"[$2 $1]\".",
        "feedback-thanks-title": "Ti ringrazziamu!",
        "feedback-useragent": "Aggenti di l'utenti:",
        "searchsuggest-search": "Arricerca",
-       "searchsuggest-containing": "chi' cunteni...",
-       "api-error-badaccess-groups": "Nun hai u pirmissu di carricari file nta sta wiki.",
+       "searchsuggest-containing": "chi cunteni...",
+       "api-error-badaccess-groups": "Nun hai lu pirmissu di carricari file nta sta wiki.",
        "api-error-badtoken": "Erruri nternu: Token sbagghiatu",
-       "api-error-copyuploaddisabled": "U carricamentu a' partiri di URL è disattivatu nta stu server.",
-       "api-error-duplicate": "Già {{PLURAL:$1|cc'è [$2 n'autru file]|cci sunnu [$2 autri file]}} supra ô situ chi' {{PLURAL:$1|havi|hannu}} u stissu cuntinutu.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Cc'era [$2 n'autru file]|Cc' èrunu [$2 autri file]}} supra ô situ ch'{{PLURAL:$1|avìa|avìunu}} u stissu cuntinutu, ma {{PLURAL:$1|fu' cancillatu|furu cancillati}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|File duppiuni|File duppiuni}} chi' già {{PLURAL:$1|havi statu cancillatu|hannu statu cancillati}}.",
-       "api-error-duplicate-popup-title": "File {{PLURAL:$1|duppiuni}}.",
-       "api-error-empty-file": "U file chi' mannasti era vacanti.",
+       "api-error-copyuploaddisabled": "Lu carricamentu a pàrtiri d'URL è disattivatu nta stu server.",
+       "api-error-duplicate": "Già {{PLURAL:$1|c'è n'àutru file]|ci sunnu àutri file]}} supra ô situ chi {{PLURAL:$1|havi|hannu}} lu stissu cuntinutu.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|C'era n'àutru file|C'èranu àutri file}} supra ô situ c'{{PLURAL:$1|avìa|avìanu}} lu stissu cuntinutu, ma {{PLURAL:$1|fu cancillatu|foru cancillati}}.",
+       "api-error-empty-file": "Lu file chi mannasti era vacanti.",
        "api-error-emptypage": "Criari pàggini novi e vacanti nun è cunzintutu.",
-       "api-error-fetchfileerror": "Erruri nternu: Quarchi' cosa nun funziunau mentri chi' si carricava u file.",
-       "api-error-fileexists-forbidden": "Nu file chi' si chiama \"$1\" già esisti, e nun si po' suprascrìviri.",
-       "api-error-fileexists-shared-forbidden": "Nu file chi' si chiama \"$1\" già esisti ntô dipòsitu cunnivisu, e nun si po' suprascrìviri.",
-       "api-error-file-too-large": "U file chi' mannasti era troppu rossu.",
-       "api-error-filename-tooshort": "U nomu dû file è troppu curtu.",
+       "api-error-fetchfileerror": "Erruri nternu: Quarchi cosa nun funziunau mentri chi si carricava lu file.",
+       "api-error-fileexists-forbidden": "Nu file chi si chiama \"$1\" già esisti, e nun si pò suprascrìviri.",
+       "api-error-fileexists-shared-forbidden": "Nu file chi si chiama \"$1\" già esisti ntô dipòsitu cunnivisu, e nun si pò suprascrìviri.",
+       "api-error-file-too-large": "Lu file chi mannasti era troppu grossu.",
+       "api-error-filename-tooshort": "Lu nomu dû file è troppu curtu.",
        "api-error-filetype-banned": "Stu tipu di file è sbannutu.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nun è un tipu di file cunsintutu|nun su' tipi di file cunsintuti}}. {{PLURAL:$3|U tipu di file cunsintutu è|I tipi di file cunsintuti sunnu}} $2.",
-       "api-error-filetype-missing": "Ô nomu dû file cci manca l'estinsioni.",
-       "api-error-hookaborted": "U canciamentu chi' stavi pruvannu a' fari fu' annullatu di n'estinsioni.",
-       "api-error-http": "Erruri nternu: Impussìbbili culligàrisi ô server.",
-       "api-error-illegal-filename": "U nomu dû file nun è cunsintutu.",
-       "api-error-internal-error": "Erruri nternu: Quarchi' cosa nun funziunau mentri chi' si stava travagghiannu u to carricamentu supra â wiki.",
-       "api-error-invalid-file-key": "Erruri nternu: U file nun fu' truvatu ntâ mimorizzazzioni timpurania.",
-       "api-error-missingparam": "Erruri nternu: Màncunu paràmitri ntâ richiesta.",
-       "api-error-missingresult": "Erruri nternu: Nun fu' pussìbbili capiri s'a copia riniscìu.",
-       "api-error-mustbeloggedin": "Hâ' jèssiri trasutu pi' carricari file.",
-       "api-error-mustbeposted": "Erruri nternu: A richiesta havi bisognu di POST HTTP.",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nun è un tipu di file cunzintutu|nun sù tipi di file cunzintuti}}. {{PLURAL:$3|Lu tipu di file cunzintutu è|Li tipi di file cunzintuti sunnu}} $2.",
+       "api-error-filetype-missing": "Ô nomu dû file ci ammanca l'estinzioni.",
+       "api-error-hookaborted": "Lu canciamentu chi stavi pruvannu a fari fu annullatu di n'estinzioni.",
+       "api-error-http": "Erruri nternu: Mpussìbbili culligàrisi ô server.",
+       "api-error-illegal-filename": "Lu nomu dû file nun è cunzintutu.",
+       "api-error-internal-error": "Erruri nternu: Quarchi cosa nun funziunau mentri chi si stava travagghiannu lu tò carricamentu supra â wiki.",
+       "api-error-invalid-file-key": "Erruri nternu: Lu file nun fu attruvatu ntâ mimurizzazzioni timpurània.",
+       "api-error-missingparam": "Erruri nternu: Ammàncanu paràmitri nta l'addumannata.",
+       "api-error-missingresult": "Erruri nternu: Nun fu pussìbbili capiri si la copia arriniscìu.",
+       "api-error-mustbeloggedin": "Hai a aviri trasutu pi carricari file.",
+       "api-error-mustbeposted": "Erruri nternu: L'addumannata havi bisognu di POST HTTP.",
        "api-error-noimageinfo": "Lu carricamentu arriniscìu, pirò lu server nun ni desi nudda nfurmazzioni a prupòsitu dû file.",
        "api-error-nomodule": "Erruri nternu: nun fu mpustatu lu mòdulu di carricamentu",
        "api-error-ok-but-empty": "Erruri ntenru: nudda risposta dû server",
        "api-error-overwrite": "Suprascriviri nu file ca nun esisti nun è cunsitutu",
        "api-error-stashfailed": "Erruri nternu: lu server nun arrinisciu a mimurizzari lu ducumentu timpuraniu",
-       "api-error-publishfailed": "Erruri nternu: U server nun riniscìu a' pubblicari u file timpuraniu.",
-       "api-error-stasherror": "Cci fu' n'erruri ntô carricari u file nta l'ammucciagghia.",
-       "api-error-stashedfilenotfound": "U file nun fu' truvatu nta l'ammucciagghia duranti u tintativu di carricamentu a' partiri di l'ammucciagghia.",
-       "api-error-stashpathinvalid": "U caminu unni avissi avutu a' jèssiri u file nta l'ammucciagghia nun era vàlidu.",
-       "api-error-stashfilestorage": "Cci fu' n'erruri ntô mimurizzari u file nta l'ammucciagghia.",
-       "api-error-stashzerolength": "U server nun potti mèttiri u file nta l'ammucciagghia, picchì avìa lunghizza zeru.",
-       "api-error-stashnotloggedin": "Hâ' èssiri trasutu pi' sarvari file nta l'ammucciagghia.",
-       "api-error-stashwrongowner": "U file nta l'ammucciagghia chi' pruvasti a' pigghiari nun t'apparteni.",
-       "api-error-stashnosuchfilekey": "U file nta l'ammucciagghia chi' pruvasti a' pigghiari nun esisti.",
+       "api-error-publishfailed": "Erruri nternu: Lu server nun arriniscìu a pubblicari lu file timpuràniu.",
+       "api-error-stasherror": "Ci fu n'erruri ntô carricari lu file nta l'ammucciagghia.",
+       "api-error-stashedfilenotfound": "Lu file nun fu attruvatu nta l'ammucciagghia duranti lu tintativu di carricamentu a pàrtiri di l'ammucciagghia.",
+       "api-error-stashpathinvalid": "Lu caminu unni avissi avutu a èssiri lu file nta l'ammucciagghia nun era vàlidu.",
+       "api-error-stashfilestorage": "Ci fu n'erruri ntô mimurizzari lu file nta l'ammucciagghia.",
+       "api-error-stashzerolength": "Lu server nun potti mèttiri lu file nta l'ammucciagghia, pirchì avìa lunghizza zeru.",
+       "api-error-stashnotloggedin": "Hai a aviri trasutu pi sarvari file nta l'ammucciagghia.",
+       "api-error-stashwrongowner": "Lu file nta l'ammucciagghia chi pruvasti a pigghiari nun t'apparteni.",
+       "api-error-stashnosuchfilekey": "Lu file nta l'ammucciagghia chi pruvasti a pigghiari nun esisti.",
        "api-error-timeout": "Lu server nun arrispunniu ntô tempu privistu",
        "api-error-unclassified": "S'avvirificau n'erruri scanusciutu",
        "api-error-unknown-code": "Erruri scanusciuti: \"$1$\".",
-       "api-error-unknown-error": "Erruri nternu: Quarchi' cosa nun funziunau ntô tintativu di carricari u to file.",
-       "api-error-unknown-warning": "Avvirtimentu scanusciutu: \"$1\".",
+       "api-error-unknown-error": "Erruri nternu: Quarchi cosa nun funziunau ntô tintativu di carricari lu tò file.",
+       "api-error-unknown-warning": "Avvisu scanusciutu: \"$1\".",
        "api-error-unknownerror": "Erruri scanusciutu: \"$1\".",
-       "api-error-uploaddisabled": "U carricamentu è disattivatu nta sta wiki.",
+       "api-error-uploaddisabled": "Lu carricamentu è disattivatu nta sta wiki.",
        "api-error-verification-error": "Lu file purrìa èssiri ruinatu, o puru aviri la stinzioni sbagghiata.",
        "duration-seconds": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutu|minuti}}",
        "duration-weeks": "$1 {{PLURAL:$1|simana|simani}}",
        "duration-years": "$1 {{PLURAL:$1|annu|anni}}",
        "duration-decades": "$1 {{PLURAL:$1|dicenniu|dicennî}}",
-       "duration-centuries": "$1 {{PLURAL:$1|sèculu|sècula}}",
+       "duration-centuries": "$1 {{PLURAL:$1|sèculu|sèculi}}",
        "duration-millennia": "$1 {{PLURAL:$1|millenniu|millennî}}",
-       "rotate-comment": "Mmàggini vutata di $1 {{PLURAL:$1|gradu|gradi}} ntô sensu urariu",
-       "limitreport-title": "Dati di prufilazzioni di l'analizzaturi sintatticu:",
+       "rotate-comment": "Mmàggini vutata di $1 {{PLURAL:$1|gradu|gradi}} ntô senzu urariu",
+       "limitreport-title": "Dati di prufilazzioni di l'analizzaturi sintàtticu:",
        "limitreport-cputime": "Usu di tempu dâ CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
        "limitreport-walltime": "Tempu d'usu riali",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
        "limitreport-ppvisitednodes": "Cuntiggiu dî gruppi visitati dû priprucissuri",
        "limitreport-ppgeneratednodes": "Cuntiggiu dî gruppi ginirati dû priprucissuri",
-       "limitreport-postexpandincludesize": "Grannizza di nclusioni appressu a' l'espansioni",
+       "limitreport-postexpandincludesize": "Grannizza di nclusioni appressu a l'espanzioni",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte}}",
        "limitreport-templateargumentsize": "Grannizza di l'argumenti di template",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte}}",
-       "limitreport-expansiondepth": "Màssimu funnu d'espansioni",
-       "limitreport-expensivefunctioncount": "Cuntìggiu dî funzioni di l'analizzaturi sintatticu spisusi",
-       "expandtemplates": "Espansioni dî template",
+       "limitreport-expansiondepth": "Funnu d'espanzioni màssimu",
+       "limitreport-expensivefunctioncount": "Cuntiggiu dî funzioni di l'analizzaturi sintàtticu spisusi",
+       "expandtemplates": "Espanzioni dî template",
        "expand_templates_intro": "Sta pàggina spiciali pigghia un testu e espanni tutti li template chi cunteni, di manera ricursiva.\nEspanni macari li funzioni di l'analizzaturi sintàtticu chi sù suppurtati, comu <code><nowiki>{{</nowiki>#language:…}}</code>, e li variàbbili, comu <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nN pràttica, espanni cchiù o menu tuttu zocchi s'attrova ammenzu a duppî parèntisi graffi.",
-       "expand_templates_title": "Tìtulu dû cuntestu, pi' {{FULLPAGENAME}} etc.:",
-       "expand_templates_input": "Testu a' espànniri:",
-       "expand_templates_output": "Risultatu",
+       "expand_templates_title": "Tìtulu dû cuntestu, pi {{FULLPAGENAME}} ecc.:",
+       "expand_templates_input": "Testu a espànniri:",
+       "expand_templates_output": "Risurtatu",
        "expand_templates_xml_output": "Output XML",
        "expand_templates_html_output": "Output HTML grezzu",
        "expand_templates_ok": "Espanni",
-       "expand_templates_remove_comments": "Leva i cummenti",
-       "expand_templates_remove_nowiki": "Leva l'etichetti <nowiki> dû risultatu",
+       "expand_templates_remove_comments": "Leva li cummenti",
+       "expand_templates_remove_nowiki": "Leva l'etichetti <nowiki> dû risurtatu",
        "expand_templates_generate_xml": "Ammustra l'àrvulu di l'anàlisi sintàttica XML",
        "expand_templates_generate_rawhtml": "Ammustra l'HTML grezzu",
        "expand_templates_preview": "Antiprima",
-       "expand_templates_preview_fail_html": "<em>Comu chi' {{SITENAME}} havi l'HTML grezzu attivatu, e cci fu' na pèrdita dî dati di sissioni, l'antiprima vinni ammucciata, pi' pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si' chistu è nu tintativu onestu d'aviri n'antiprima, pi' favuri prova n'autra vota.</strong>\nS'ancora nun funziona, prova a' [[Special:UserLogout|nèsciri]] e tràsiri n'autra vota.",
-       "expand_templates_preview_fail_html_anon": "<em>Comu chi' {{SITENAME}} havi l'HTML grezzu attivatu, e tu nun si' trasutu, l'antiprima vinni ammucciata, pi' pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si' chistu è nu tintativu onestu d'aviri n'antiprima, pi' favuri [[Special:UserLogin|trasi]] e prova n'autra vota.",
-       "pagelanguage": "Scelta dâ lingua dâ pàggina",
+       "expand_templates_preview_fail_html": "<em>Comu chi {{SITENAME}} havi l'HTML grezzu attivatu, e ci fu na pèrdita dî dati di sissioni, l'antiprima vinni ammucciata, pi pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si chistu è nu tintativu nurmali d'aviri n'antiprima, pi favuri prova n'àutra vota.</strong>\nSi ancora nun funziona, prova a [[Special:UserLogout|nèsciri]] e tràsiri n'àutra vota.",
+       "expand_templates_preview_fail_html_anon": "<em>Comu chi {{SITENAME}} havi l'HTML grezzu attivatu, e tu nun trasisti, l'antiprima vinni ammucciata, pi pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si chistu è nu tintativu nurmali d'aviri n'antiprima, pi favuri [[Special:UserLogin|trasi]] e prova n'àutra vota.",
+       "pagelanguage": "Scigghiuta dâ lingua dâ pàggina",
        "pagelang-name": "Pàggina",
        "pagelang-language": "Lingua",
-       "pagelang-use-default": "Usa a lingua pridifinuta",
-       "pagelang-select-lang": "Scegghî na lingua",
-       "right-pagelang": "Canciari a lingua dî pàggini",
-       "action-pagelang": "canciari a lingua dî pàggini",
+       "pagelang-use-default": "Usa la lingua pridifinuta",
+       "pagelang-select-lang": "Scegghi na lingua",
+       "right-pagelang": "Canciari la lingua dî pàggini",
+       "action-pagelang": "canciari la lingua dî pàggini",
        "log-name-pagelang": "Riggistru dî canci di lingua",
        "log-description-pagelang": "Chistu è nu riggistru dî canciamenti â lingua dî pàggini.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|canciau}} a lingua dâ pàggina $3 di $4 a' $5.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|canciau}} la lingua dâ pàggina $3 di $4 a $5.",
        "default-skin-not-found": "Whoops! La peddi pridifinuta dâ tò wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nA quantu pari la tò stallazzioni ncludi {{PLURAL:$4|la peddi|li peddi}} ccassutta. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuali: Cunfigurazzioni dî peddi] pi struzzioni supra a comu {{PLURAL:$4|s'attiva|s'attìvanu e comu si scegghî chidda pridifinuta}}.\n\n$2\n\n; Si stallasti MediaWiki ora ora:\n: E' prubbàbbili ca la stallasti dû git, o direttamenti dû còdici surgenti nta quarchi n'àutra manera. Allura sta cosa è privista. Prova e stalla quarchi peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archiviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download lu prugramma di stallazzioni n furmatu tar], ca cunteni tanti peddi e stinzioni. Poi cupiari e ncuddari la cartella <code>skins/</code> di ddà dintra.\n:* Scàrrica a una a una quarchi peddi ntô furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Adòpira Git pi scarricari peddi].\n: Lu fari accussì nun avissi a ntirfiriri cû tò dipòsitu git si sî nu sviluppaturi di MediaWiki.\n\n; Si aggiurnasti MediaWiki ora ora:\n: MediaWiki virsioni 1.24 e succissivi nun attìvanu cchiù di manera autumàtica li peddi stallati (talìa [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuali: Scuperta autumàtica dî peddi]). Poi cupiari e ncuddari {{PLURAL:$5|sta riga|sti righi}} nta <code>LocalSettings.php</code> p'attivari {{PLURAL:$5|la peddi ch'è stallata pi com'ora|tutti li peddi ca sunnu stallati pi com'ora}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si canciasti <code>LocalSettings.php</code> ora ora:\n: Cuntrolla ca nun sbagghiasti a scrìviri li noma dî peddi.",
        "default-skin-not-found-no-skins": "Whoops! La peddi pridifinuta dâ tò wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nNun hai nudda peddi nstallata.\n\n; Si nstallasti o puru aggiurnasti MediaWiki ora ora:\n: È prubbàbbili chi lu nstallasti dû git, o direttamenti dû còdici surgenti nta quarchi àutra manera. Allura sta cosa è privista. MediaWiki virsioni 1.24 e succissivi nun cuntèninu nudda peddi ntô dipòsitu principali. Prova e nstalla quarchi peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archiviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download lu prugramma di nstallazzioni n furmatu tar], chi cunteni tanti peddi e stinzioni. Poi cupiari e ncuddari la cartella <code>skins/</code> di ddà dintra.\n:* Scàrrica a una a una quarchi peddi n furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Adòpira Git pi scarricari peddi].\n: Fari accussì nun avissi a ntirfiriri cû tò dipòsitu git si sî nu sviluppaturi di MediaWiki. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuali: Cunfigurazzioni dî peddi] pi struzzioni supra a comu s'attìvanu li peddi e comu si scegghî chidda pridifinuta.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (attivata)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disattivata''')",
        "mediastatistics": "Statìstichi supra ê file multimidiali",
-       "mediastatistics-summary": "Statìstichi supra ê tipi di file carricati. Si cùntunu sulu i virsioni cchiu' novi dî file. I virsioni vecchî o cancillati vènunu escluduti.",
+       "mediastatistics-summary": "Statìstichi supra ê tipi di file carricati. Si cùntanu sulu li virsioni cchiù novi dî file. Li virsioni vecchî o cancillati vèninu escluduti.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
        "mediastatistics-table-mimetype": "Tipu MIME",
-       "mediastatistics-table-extensions": "Estinsioni pussìbbili",
+       "mediastatistics-table-extensions": "Estinzioni pussìbbili",
        "mediastatistics-table-count": "Nùmmiru di file",
-       "mediastatistics-table-totalbytes": "Rannizza cumplissiva",
+       "mediastatistics-table-totalbytes": "Diminzioni cumminata",
        "mediastatistics-header-unknown": "Scanusciuti",
        "mediastatistics-header-bitmap": "Mmàggini bitmap",
        "mediastatistics-header-drawing": "Disigni (mmàggini vitturiali)",
-       "mediastatistics-header-audio": "Audiu",
-       "mediastatistics-header-video": "Vidiu",
+       "mediastatistics-header-audio": "Àudiu",
+       "mediastatistics-header-video": "Vìdiu",
        "mediastatistics-header-multimedia": "File multimidiali cumplessi",
        "mediastatistics-header-office": "Ufficiu",
        "mediastatistics-header-text": "Tistuali",
        "mediastatistics-header-executable": "Esiguìbbili",
        "mediastatistics-header-archive": "Furmati cumpressi",
-       "json-warn-trailing-comma": "$1 {{PLURAL:$1|vìrgula finali fu' livata|vìrguli finali furu livati}} dû JSON",
-       "json-error-unknown": "Mmattìu un prubblema cû JSON. Erruri: $1",
-       "json-error-depth": "Fu passatu lu massimu funnu dû stack",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|vìrgula finali fu livata|vìrguli finali foru livati}} dû JSON",
+       "json-error-unknown": "Ammattìu un prubblema cû JSON. Erruri: $1",
+       "json-error-depth": "Fu passatu lu funnu màssimu dû stack",
        "json-error-state-mismatch": "JSON nun vàlidu o malfurmatu",
        "json-error-ctrl-char": "Caràttiri di cuntrollu nun privistu, forsi cudificatu mali",
        "json-error-syntax": "Erruri di sintassi",
        "json-error-utf8": "Caràttiri UTF-8 nun vàlidi, forsi cudificati mali",
-       "json-error-recursion": "U valuri di cudificari havi unu o cchiu' ssai rifirimenti ricursivi",
-       "json-error-inf-or-nan": "U valuri di cudificari havi unu o cchiu' ssai valuri NAN o INF",
-       "json-error-unsupported-type": "Fu' passatu nu valuri dûn tipu chi' nun si po' cudificari",
+       "json-error-recursion": "Lu valuri di cudificari havi unu o cchiossai rifirimenti ricursivi",
+       "json-error-inf-or-nan": "Lu valuri di cudificari havi unu o cchiossai valuri NAN o INF",
+       "json-error-unsupported-type": "Fu passatu nu valuri dûn tipu chi nun si pò cudificari",
        "headline-anchor-title": "Ligami versu sta sizzioni",
        "special-characters-group-latin": "Latinu",
        "special-characters-group-latinextended": "Latinu estinnutu",
index 3a5ad0a..1b61e4c 100644 (file)
@@ -19,7 +19,8 @@
                        "아라",
                        "PiRSquared17",
                        "Macofe",
-                       "Caliburn"
+                       "Caliburn",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Unnerline airtins:",
        "mergehistory-go": "Shaw mergeable eidits",
        "mergehistory-submit": "Merge reveesions",
        "mergehistory-empty": "Naw reveesions can be merged.",
-       "mergehistory-success": "$3 {{PLURAL:$3|reveesion|reveesions}} o [[:$1]] successfully merged intil [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|reveesion|reveesions}} o $1 successfully merged intil [[:$2]].",
        "mergehistory-fail": "Onable tae perform histerie merge, please recheck the page n time parameters.",
        "mergehistory-fail-toobig": "Canna perform histerie merge cause mair than the leemit o $1 {{PLURAL:$1|reveesion|reveesions}} wid be muivit.",
        "mergehistory-no-source": "Soorce page $1 disna exeest.",
        "filerevert-legend": "Revert file",
        "filerevert-intro": "Ye'r aboot tae revert the file '''[[Media:$1|$1]]''' til the [$4 version aes o $3, $2].",
        "filerevert-comment": "Raison:",
-       "filerevert-defaultcomment": "Reverted til version aes o $2, $1",
+       "filerevert-defaultcomment": "Reverted til version aes o $2, $1 ($3)",
        "filerevert-submit": "Revert",
        "filerevert-success": "'''[[Media:$1|$1]]''' haes been reverted til the [$4 version aes o $3, $2].",
        "filerevert-badversion": "Thaur's naw preeveeoos local version o this file wi the gien timestamp.",
        "movepagetext": "Uisin the form ablo will rename ae page, muivin aw o its histerie til the new name.\nThe auld title will become ae reguidal page til the new title.\nYe can update reguidals that poynt til the oreeginal title autæmateeclie.\nGif ye chuise na tae, be sair tae check fer [[Special:DoubleRedirects|dooble]] or [[Special:BrokenRedirects|broken reguidals]].\nYe'r responsible fer makin sair that airtins continue tae poynt til whaur thay'r supposed to gae.\n\nMynd that the page will <strong>na</strong> be muived gif thaur is awreadie ae page at the new title, onless the latter is ae reguidal n haes nae past eedit histerie.\nThis means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, n ye canna owerwrite aen exeestin page.\n\n<strong>Warnishment!</strong>\nThis can be ae drasteec n onexpectit chynge fer ae popular page;\nplease be sair ye unnerstaunn the consequences o this afore proceedin.",
        "movepagetext-noredirectfixer": "Uising the form ablo will rename ae page, muivin aw o its histerie til the new name.\nThe auld title will become ae reguidal page til the new title.\nBe sair tae check fer [[Special:DoubleRedirects|dooble]] or [[Special:BrokenRedirects|broken reguidals]].\nYe'r responsible fer makin sair that airtins continue tae poynt whaur thay'r supposed tae gae.\n\nTak tent that the page will <strong>naw</strong> be muived gif thaur's awreadie ae page at the new title, onless it is tuim n haes naw past eedit histerie.\nThis means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, n ye canna owerwrite aen existin page.\n\n<strong>Warnishment!</strong>\nThis can be ae drastic n onexpectit chynge fer ae popular page;\nplease be sair that ye unnerstaun the consequences o this afore preceedin.",
        "movepagetalktext": "The associated tauk page will be autaematiclie muived alang wi it <strong>onless:</strong>\n*A no-tuim tauk page awreadie exeests unner the new name, or\n*Ye oncheck the kist ablo.\n\nIn thae cases, ye will hae tae muiv or merge the page manuallie gif ye sae desire.",
-       "movearticle": "Muiv page:",
        "moveuserpage-warning": "<strong>Warnishment:</strong> Ye'r aboot tae muiv ae uiser page. Please tak tent that yinlie the page will be muivd n the uiser will <em>naw</em> be renamed.",
        "movecategorypage-warning": "<strong>Wairnishment:</strong> Ye'r aboot tae muiv ae categerie page. Please mynd that yinlie the page'll be muived n onie pages in the auld categerie will <em>no</em> be recategerised intae the new categerie.",
        "movenologintext": "Ye maun be a registert uiser n [[Special:UserLogin|loggit in]] tae muiv ae page.",
        "api-error-badaccess-groups": "Ye'r na permittit tae uplaid files til this wiki.",
        "api-error-badtoken": "Inby mistak: Bad token.",
        "api-error-copyuploaddisabled": "Uplaidin bi URL is disabled oan this server.",
-       "api-error-duplicate": "Thaur {{PLURAL:$1|is [$2 anither file]|ar [$2 some ither files]}} awreadie oan the site wi the same content.",
-       "api-error-duplicate-archive": "Thaur {{PLURAL:$1|wis [$2 anither file]|were [$2 some ither files]}} awreadie oan the site wi the same content, but {{PLURAL:$1|it wis|thay were}} delytit.",
-       "api-error-duplicate-archive-popup-title": "Dupleecate {{PLURAL:$1|file that haes|files that hae}} awreadie been delytit.",
-       "api-error-duplicate-popup-title": "Dupleecate {{PLURAL:$1|file|files}}.",
+       "api-error-duplicate": "Thaur {{PLURAL:$1|is anither file|ar some ither files}} awreadie oan the site wi the same content.",
+       "api-error-duplicate-archive": "Thaur {{PLURAL:$1|wis anither file|were some ither files}} awreadie oan the site wi the same content, but {{PLURAL:$1|it wis|thay were}} delytit.",
        "api-error-empty-file": "The file that ye haunnit in wis tuim.",
        "api-error-emptypage": "Cræftin new, tuim pages isna permittit.",
        "api-error-fetchfileerror": "Internal mistak: Sommit went wrang while fetchin the file.",
index f97f953..fff1eed 100644 (file)
@@ -7,7 +7,8 @@
                        "Jun Misugi",
                        "Kaganer",
                        "Midnight Gambler",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Sotturìnia li cullegamenti:",
        "mergehistory-go": "Musthra li mudìfigghi chi pòni assé uniddi",
        "mergehistory-submit": "Unì li ribisioni",
        "mergehistory-empty": "Nisciuna ribisioni da unì.",
-       "mergehistory-success": "$3 {{PLURAL:$3|ribisioni di [[:$1]] è isthadda unidda|ribisioni di [[:$1]] so isthaddi uniddi}} a la cronologia di [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ribisioni di $1 è isthadda unidda|ribisioni di $1 so isthaddi uniddi}} a la cronologia di [[:$2]].",
        "mergehistory-fail": "Impussìbiri unì li cronologi. Verifiggà la pàgina e li parametri timpurari.",
        "mergehistory-no-source": "La pàgina d'orìgini $1 nò isisthi.",
        "mergehistory-no-destination": "La pàgina dI disthinazioni $1 nò isisthi.",
        "filerevert-legend": "Ricupara file",
        "filerevert-intro": "N'isthai pa ricuparà lu file '''[[Media:$1|$1]]''' a la [versioni $4 di lu $2, $3].",
        "filerevert-comment": "Mutibu:",
-       "filerevert-defaultcomment": "Turradda che primma la versioni di lu $1, $2",
+       "filerevert-defaultcomment": "Turradda che primma la versioni di lu $1, $2 ($3)",
        "filerevert-submit": "Turra che primma",
        "filerevert-success": "'''Lu file [[Media:$1|$1]]''' è isthaddu ricuparaddu a la [versioni $4 di lu $2, $3].",
        "filerevert-badversion": "Nò isisthono versioni lucari prizzidenti di lu file cu' la marchaddura oreria disizadda.",
        "nlinks": "$1 {{PLURAL:$1|cullegamentu|cullegamenti}}",
        "nmembers": "$1 {{PLURAL:$1|erementu|erementi}}",
        "nrevisions": "$1 {{PLURAL:$1|ribisioni|ribisioni}}",
-       "nviews": "$1 {{PLURAL:$1|visita|visiti}}",
        "specialpage-empty": "Chisthu rapporthu nò cunteni nisciun risulthaddu.",
        "lonelypages": "Pàgini òiffani",
        "lonelypagestext": "Li sighenti pàgini so chena cullegamenti chi prubenani d'althri pàgini di {{SITENAME}}.",
        "mailnologin": "Nisciun indirizzu a lu quari invià l'imbasciadda.",
        "mailnologintext": "Pa invià imbasciaddi di postha erettrònica è nezzessàriu [[Special:UserLogin|intrà]] e abé registhraddu un'indirizzu variddu i' li propri [[Special:Preferences|prifirenzi]].",
        "emailuser": "Ischribì a l'utenti",
-       "emailpage": "Invia un'imbasciadda di postha erettrònica a l'utenti",
        "emailpagetext": "Si l'utenti à registhraddu un'indirizzu di postha erettrònica vàriddu i' li propri prifirenzi, lu mòdulu in giossu cunsenti d'ischribelli una sora imbasciadda. L'indirizzu indicaddu i' li prifirenzi di lu mandanti apparirà i' lu campu \"Da:\" di l'imbasciadda pa cunsintì a  lu disthinatàriu l'eventuari rippostha.",
        "defemailsubject": "Imbasciadda da {{SITENAME}}",
        "noemailtitle": "Nisciun indirizzu di postha erettrònica",
        "deletereason-dropdown": "*Mutibazioni più cumuni pa la canzilladdura\n** Prigonta de l'autori\n** Viorazioni di lu dirittu d'autori\n** Vandarismu",
        "delete-edit-reasonlist": "Mudìfigga li mutibazioni pa la canzilladdura",
        "rollback": "Annulla li mudìfigghi",
-       "rollback_short": "Turra che primma",
        "rollbacklink": "turrà che primma",
        "rollbackfailed": "Nò è ridisciddu a turrà che primma",
        "cantrollback": "Impussìbiri annullà li mudìfigghi; l'utenti chi n'è l'autori è l'unicu cuntribudori di la pàgina.",
        "move-page-legend": "Ippusthamentu di pàgina",
        "movepagetext": "Chishu mòdulu di rinominà una pàgina, ippusthendi tutta la cronologia soia a l'innòmmu nobu.\nLa pàgina attuari sarà automatiggamenti un rinviu a lu nobu tìturu.\nI culleggamenti pudiani assé aggiornaddi.\nPoi isciubarà di nò lu fà, ma verifigga chi l'ippusthamentu nò aggia criaddu [[Special:DoubleRedirects|doppi rinvi]] o [[Special:BrokenRedirects|rinvi erraddi]]. Ài la ripunsabiriddai chi li cullegamenti a la pàgina risthini curretti.\n\nNota chi la pàgina '''nò''' sarà ippusthadda si n'isisthi già una cu' lu nobu tìturu, a mancu chi nò sia biodda o un rinviu a lu vécciu tìturu, chena versioni prizzidenti.\nIn casu d'errori i' l'ippusthamentu pói turrà immediatamenti a lu tìturu vécciu, e nò pussìbiri sobbraischribì pa errori una pàgina già esisthenti.\n\n'''ATTINZIONI!'''\nUn ciambamentu cussì forthi pó causà umbè di prubremi a tuttiganti;\nazzirthati d'abé cumpresu li cunsiguènzi di l'ippusthamentu!",
        "movepagetalktext": "La reratiba pàgina di dischussioni sarà ippusthadda automatiggamenti umpari a la pàgina prinzipari, '''fora chi i' li casi sighenti:'''\n* l'ippusthamentu di la pàgina è intra tipi di pàgina dibessi\n* isisthi già una pàgina di dischussioni a lu nobu tìturu (nò biodda)\n* la casella in giossu nò è isthadda sciubaradda\n\nIn chisthi casi, si lu vói avveru, débi ippusthà o aggiugnì a manu le infuimmazioni cuntinuddi i' la pàgina di dischussioni.",
-       "movearticle": "Ippustha la pàgina",
        "movenologintext": "L'ippusthamentu di li pàgini è cunsintiddu soru a l'utenti registhraddi chi so [[Special:UserLogin|intraddi]] i' lu situ.",
        "movenotallowed": "Nò si diponi di li primmissi nezzessàri a l'ippusthamentu di pàgini.",
        "newtitle": "Nobu tìturu:",
        "import-interwiki-text": "Sciubarà un prugettu wiki e lu tìturu di la pàgina d'impurthà.\nLi dati di prubbiggazioni e l'innòmmi di l'autori di li vàri versioni sarani cunseivaddi.\nTutti l'operazioni d'impurthazioni trans-wiki so rigisthraddi i' lu [[Special:Log/import|rigisthru d'impurthazioni]].",
        "import-interwiki-history": "Cupia l'intrea cronologia di chistha pàgina",
        "import-interwiki-submit": "Impurtha",
-       "import-interwiki-namespace": "Tipu di pagina di disthinazioni:",
        "import-comment": "Oggettu:",
        "importtext": "Pa piazeri ippurthà lu file da lu situ wiki d'origini cu' la funzioni Special:Export utility, saivvàllu i' lu propriu dischu e daboi carriggallu inogghi.",
        "importstart": "Impurthendi li pàgini...",
        "importuploaderrortemp": "Carriggamentu di file pa l'impurthazioni nò ridisciddu. Manca una carhella timpurania.",
        "importlogpage": "Impurthazioni",
        "importlogpagetext": "Rigisthru di l'impurthazioni di pàgini d'althri wiki, cumpreti di cronologia.",
-       "import-logentry-upload": "à impurthaddu [[$1]] attrabessu lu carriggamentu",
        "import-logentry-upload-detail": "{{PLURAL:$1|una ribisioni impurthadda|$1 ribisioni impurthaddi}}",
-       "import-logentry-interwiki": "ha traiffiriddu da un'althra wiki la pàgina $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|una ribisioni impurthadda|$1 ribisioni impurthaddi}} da $2",
        "tooltip-pt-userpage": "La pàgina utenti tóia",
        "tooltip-pt-anonuserpage": "La pàgina utenti di chistu indirizzu IP",
index 22bb621..c8d618f 100644 (file)
@@ -11,7 +11,8 @@
                        "The Evil IP address",
                        "Trondtr",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Liŋkkaid vuolláisárgun",
        "filerevert-legend": "Fiilla máhcaheapmi",
        "filerevert-intro": "Leat máhcaheami fiilla '''[[Media:$1|$1]]''' [$4 veršuvdnii, mii ráhkaduvvui $2 diibmu $3].",
        "filerevert-comment": "Sivva",
-       "filerevert-defaultcomment": "Máhcahuvvui veršuvdnii, mii ráhkaduvvui $1 diibmu $2",
+       "filerevert-defaultcomment": "Máhcahuvvui veršuvdnii, mii ráhkaduvvui $1 diibmu $2 ($3)",
        "filerevert-submit": "Ovddit veršuvdnii",
        "filerevert-success": "'''[[Media:$1|$1]]''' lea máhcahuvvon [$4 veršuvdnii, mii ráhkaduvvui $2 diibmu $3].",
        "filerevert-badversion": "Fiillas ii leat ráhkaduvvon veršuvdna dalle.",
        "nlinks": "$1 {{PLURAL:$1|liŋka|liŋkka}}",
        "nmembers": "$1 {{PLURAL:$1|lahttu|lahtu}}",
        "nrevisions": "$1 {{PLURAL:$1|rievdádus|rievdádusa}}",
-       "nviews": "$1 {{PLURAL:$1|láden|ládema}}",
        "specialpage-empty": "Dán siiddus ii leat teaksta.",
        "lonelypages": "Oarbbes siiddut",
        "lonelypagestext": "Čuovvovaš siidduide ii čujuhuvvo eará siidduin.",
        "mailnologin": "Sáddejeaddji čujuhus váilo",
        "mailnologintext": "Don fertet leat [[Special:UserLogin|čálligoahtán sisa]] ja du [[Special:Preferences|ásahusain]] ferte leat gelbbolaš ja <strong>sihkarastojuvvon</strong> e-poastačujuhus, ovdalgo sáhtat sáddet e-poasta eará geavaheddjiide.",
        "emailuser": "Čále e-poastta geavaheaddjái",
-       "emailpage": "Sádde e-poastta geavaheaddjái",
        "emailpagetext": "Jus dát geavaheaddji lea lasihin iežaset ásahusaide gelbbolaš e-poastačujuhusa, vuolábeale skoviin sáhtat sáddet sudnje ovtta sáni. Iežat ásahusaide lasihuvvon e-poastačujuhus oidno sáddejeaddji dieđuin, vai vuostáiváldi sáhttá vástidit.",
        "defemailsubject": "{{SITENAME}}-e-poasta",
        "noemailtitle": "Ii e-poastačujuhus",
        "deletecomment": "Sivva",
        "deleteotherreason": "Eará sivva:",
        "rollback": "máhcat ovddit veršuvdnii",
-       "rollback_short": "Máhcaheapmi",
        "rollbacklink": "máhcat",
        "rollbackfailed": "Máhccan ii lihkosmuvvan",
        "cantrollback": "Máhcaheapmi ovddit veršuvdnii ii leat vejolaš, daningo maŋimuš čálli lea siiddu aidna dahkki.",
        "lockdbsuccesssub": "Diehtovuođu gidden lihkosmuvai",
        "unlockdbsuccesssub": "Diehtovuođu rahpan lihkosmuvai",
        "move-page-legend": "Sirdde siiddu",
-       "movearticle": "Sirdde siiddu",
        "newtitle": "Ođđa namma siidui",
        "move-watch": "Čuovo dán siiddu",
        "movepagebtn": "Sirdde siiddu",
index 523b5de..005f138 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Songhay",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Dobu ganda-žeeriyan:",
        "mergehistory-go": "Fasalyaney kaŋ ga hin ka marga cebe",
        "mergehistory-submit": "Fillawey marga",
        "mergehistory-empty": "Filla kulyaŋ mana margandi.",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|filla}} $3 margandi ka boori ka tee [[:$2]].",
+       "mergehistory-done": "$1 {{PLURAL:$3|filla}} $3 margandi ka boori ka tee [[:$2]].",
        "mergehistory-fail": "Ši hin taariki margaroo tee, taare moo nda waati kayandiyaney guna ka boori. \\",
        "mergehistory-fail-toobig": "Ši hin ka taariki margaroo tee zam'a ga bisa {{PLURAL:$1|filla}} $1 kaŋ ga ganandi waati din.",
        "mergehistory-no-source": "$1 aššil moo ši bara.",
        "filerevert-legend": "Tuku willi",
        "filerevert-intro": "War ga kaa ka tukoo willi <strong>[[Media:$1|$1]]</strong> nga [$4 dumi ga $3 waate, $2 hane].",
        "filerevert-comment": "Dalil:",
-       "filerevert-defaultcomment": "Willi dumoo ga kaŋ tee $2 waate, $1 hane.",
+       "filerevert-defaultcomment": "Willi dumoo ga kaŋ tee $2 waate, $1 hane ($3)",
        "filerevert-submit": "Willi",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> n' ka willi [$4 dumi ga $3 waate, $2 hane].",
        "filerevert-badversion": "Nungu dumi bisante kul ši bara tukoo woo se nda waatišilbaa kaŋ noondi.",
        "movepagetext": "Ne ganda takaddaa goyyanoo ga moɲoo maaɲoo barmay, ka nga taarikoo kul ganandi maa taagaa here.\nMaa žeenaa ka tee kuubiyan moo maa taagaa se.\nWar ga hin ka kuubiyaney taagandi k'i sinji aššil maaɲoo ga ngi boŋše.\nNda war ši woo tee nd'anniya, wa [[Special:DoubleRedirects|kuubiyan fillantey]] wala [[Special:BrokenRedirects|ikayrantey]] koroši boryo.\nWar allamaanaa woo kaŋ dobey ma gaabandi alhakiika ra ka sinja nungey kaŋ i ga hima ga koy ga.\n\nLaasaabu kaŋ moɲoo <strong>ši</strong> ganandi nda moo foo ga bara maa taagaa cire ka ben, nda manti ikoraa ti kuubiyan nd'a ši nda fasal taariki bisante,\n\n<strong>Yaamar!</strong>\nWoo ga hin ka ti barmay gaabante kaŋ boro ši a tammahãa moo maakoyni se;\n w'alhakiika war ga faham misoo benantaa se jina nda war ga koy jine.",
        "movepagetext-noredirectfixer": "\n<strong>Yaamar!</strong>\nWoo ga hin ka ti barmay šenda kaŋ boro si a tammahã moo maakoyni se;\nwar m'alhakiika kaŋ war ga faham misoo benantaa jina nda war baa ka goy jine.",
        "movepagetalktext": "Deede moo kondantaa ši ma ganandi nga boŋše jinehere <strong> nda manti:</strong>\n*Deede moo kaŋ ši koonu ga bara ka ben moo taagaa cire, wala\n*War na maasaa ka ne ganda bataa ga.\n\nMise taney din ra, war ga hima ka moɲoo ganandi wal'a margandi war boŋše nda war ga baa.",
-       "movearticle": "Moɲoo ganandi:",
        "moveuserpage-warning": "<strong>Yaamar:</strong> War ga baa ka goykaw moo foo ganandi. Laasaabu kaŋ moɲoo hinne ma ganandi nda kaŋ goykaa <em> ši </em> maa taaga zaa.",
        "movecategorypage-warning": "<strong>Yaamar:</strong> War ga baa ka dumi moo foo ganandi. Laasaabu kaŋ moɲoo ga ganandi nda mooyaŋ kul kaŋ ga bara dumi žeenaa ra <em>ši</em> huru dumi taagaa woo ra.",
        "movenologintext": "War mma hima ka tee goykaw hantumante nda [[Special:UserLogin|hurante]] ka moɲoo ganandi.",
        "api-error-badaccess-groups": "War ši nda fondo ka tukey zijandi wikiyoo woo ga.",
        "api-error-badtoken": "Kunahere firka: Tokore laala.",
        "api-error-copyuploaddisabled": "URL zijandiyan n' ka kay feršikaa woo ga.",
-       "api-error-duplicate": "{{PLURAL:$1|ti [ti tuku tana $2]}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|ti [ti tuku tana $2]}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da, amma {{PLURAL:$1|an' ka|in' ka}} tuusandi.",
-       "api-error-duplicate-archive-popup-title": "Fillayan {{PLURAL:$1|tukoo kaŋ n' ka|tukey kaŋ n' ka}} tuusandi ka ben.",
-       "api-error-duplicate-popup-title": "Fillayan {{PLURAL:$1|tukoo|tukey}}.",
+       "api-error-duplicate": "{{PLURAL:$1|ti ti tuku tana $2}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|ti ti tuku tana}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da, amma {{PLURAL:$1|an' ka|in' ka}} tuusandi.",
        "api-error-empty-file": "Tukoo kaŋ war n'a sanba mma koonu.",
        "api-error-emptypage": "Boro ši hin ka moo taaga, koonuyaŋ tee.",
        "api-error-fetchfileerror": "Kunahere firka: Haya foo mana boori tuku zaayan waate.",
index dc7ac9a..81ead77 100644 (file)
        "mergehistory": "Sokergtė poslapė istuorėjės",
        "mergehistory-from": "Kėlėma poslapisː",
        "mergehistory-into": "Tiksla poslapisː",
-       "mergehistory-success": "$3 [[:$1]] versėju siekmėngā sojongta so [[:$2]].",
+       "mergehistory-done": "$3 $1 versėju siekmėngā sojongta so [[:$2]].",
        "revertmerge": "Atskėrtė",
        "history-title": "Poslapė „$1“ istuorėjė",
        "difference-title": "$1 – skėrtoms terp pakeitėmu.",
        "upload-misc-error": "Nažėnuoma ikielėma klaida",
        "upload-misc-error-text": "Ivīka nežėnuoma klaida vīkstont ikielėmō. Prašuom patėkrėnt, kū URL teisėngs teipuogi pasėikiams ėr pamiegīkit viel. Jē bieda ėšlėik, sosėsėikėt so sistemuos admėnėstratuoriom.",
        "upload-dialog-title": "Ožkrautė abruozdieli",
-       "upload-dialog-error": "Notėka klaida",
        "upload-dialog-button-cancel": "Pabengtė",
        "upload-dialog-button-done": "Padėrbt",
        "upload-dialog-button-save": "Ėšsauguotė",
        "upload-dialog-button-upload": "Ožkrautė",
-       "upload-dialog-label-select-file": "Rinktėis abruozdieli",
-       "upload-dialog-label-infoform-title": "Aple",
-       "upload-dialog-label-infoform-name": "Pavadėnėms",
-       "upload-dialog-label-infoform-description": "Aprašīms",
-       "upload-dialog-label-usage-title": "Nauduojėms",
-       "upload-dialog-label-usage-filename": "Abruozdielė pavadėnėms",
+       "upload-process-error": "Notėka klaida",
+       "upload-form-label-select-file": "Rinktėis abruozdieli",
+       "upload-form-label-infoform-title": "Aple",
+       "upload-form-label-infoform-name": "Pavadėnėms",
+       "upload-form-label-infoform-description": "Aprašīms",
+       "upload-form-label-usage-title": "Nauduojėms",
+       "upload-form-label-usage-filename": "Abruozdielė pavadėnėms",
        "backend-fail-notexists": "Abruozdielė „$1“ nie.",
        "backend-fail-alreadyexists": "Abruozdielis „$1“ jau īr.",
        "img-auth-accessdenied": "Ožgint prė̄tė",
        "move-page-legend": "Poslapė parvadėnėms",
        "movepagetext": "Nauduojont ta skvarma, katra apatiuo īr, parvadinsat poslapi ėr ėšlaikīsat anuo istuorėjė.\nOnkstesnis pavadėnėms palėks nosokėmo - ons ruodīs poslapin naujė varda.\nTamsta esat atsakėngs, ka nūruodas ruodītom tenā, kor ė rēk.\n\nAtminkat, ka poslapis '''nabus''' parvadints, jēgo jau īr poslapis naujo pavadinėmo, tėktās jēgo ons īr dīks aba netor keitėmu istuorėjės.\nTumet, Tamsta galat parvadintė poslapi seniou nauduoto vardo, jēgo priš šėta ons bova par klaida parvadints, ar esontiu poslapiu sogadintė negalat.\n\n'''ATĖDĖS!'''\nJēgo parvadinat tonkē nauduojama poslapi, ta galat prėdėrbtė ėškadas. Tudie kervauokat, ka dėrbat.",
        "movepagetalktext": "Sosėits aptarėma poslapis bus autuomatėškā parkelts draugom so ano, '''ėšskīrus:''':\n*Poslapis nauju pavadinėmo tor netoštė aptarėma poslapi, a\n*Paliksėt žemiau asontė varnale nepažīmieta.\nŠėtās atviejās Tamsta sava nužiūra torėt parkeltė a apjongtė aptarėma poslapi.",
-       "movearticle": "Parvadintė poslapi:",
        "moveuserpage-warning": "<strong>Atėdės:</strong> Tamsta parvadėnsat nauduotuojė poslapi. Žėnuokat, ka tėktās poslapis bat <em>ne patsā nauduotuos</em> bos parvadints.",
        "movecategorypage-warning": "<strong>Atėdės:</strong> Tamsta parvadinsat kateguorėjės poslapi. Žėnuokat, ka tėktas poslapis bos parvadints, bat <em>poslapē, katrėi anon prėgol,</em> tor būtė sokergtė apent.",
        "movenologintext": "Nuoriedamė parvadintė poslapi, torėt būtė ožsėregėstravės nauduotuos ė tēpuogi būtė [[Special:UserLogin|prisėjongės]].",
        "feedback-close": "Padėrbt",
        "searchsuggest-search": "Ėiškuotė",
        "searchsuggest-containing": "katrėi tor...",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Faila|Failu}} doblėkats.",
        "duration-seconds": "$1 {{PLURAL:$1|sekondė|sekondės|sekondiu}}",
        "duration-minutes": "$1 {{PLURAL:$1|mėnotė|mėnotės|mėnotiu}}",
        "duration-hours": "$1 {{PLURAL:$1|adīna|adīnas|adīnu}}",
index 9623c23..96a9039 100644 (file)
@@ -9,7 +9,8 @@
                        "아라",
                        "Milicevic01",
                        "Macofe",
-                       "KWiki"
+                       "KWiki",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podvuci linkove:",
        "mergehistory-go": "Prikaži izmjene koje se mogu spojiti",
        "mergehistory-submit": "Spoji revizije",
        "mergehistory-empty": "Nema revizija za spajanje.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice [[:$1]] uspješno spojeno u [[:$2]].",
+       "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-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Odredišna stranica $1 ne postoji.",
        "filerevert-legend": "Vrati datoteku/fajl",
        "filerevert-intro": "Vraćate datoteku '''[[Media:$1|$1]]''' na [$4 verziju od $3, $2].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1",
+       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1 ($3)",
        "filerevert-submit": "Vrati",
        "filerevert-success": "'''Datoteka [[Media:$1|$1]]''' je vraćena na [$4 verziju od $3, $2].",
        "filerevert-badversion": "Ne postoji ranija lokalna verzija ove datoteke sa navedenim vremenskim podacima.",
        "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.",
-       "movearticle": "Premjesti stranicu – Премјести страницу",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
        "movenologintext": "Morate se registrovati ili [[Special:Userlogin|prijaviti]] kako biste premjestili članak.<br>\nМорате се регистровати или [[Special:Userlogin|пријавити]] како бисте преместили чланак.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "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|[$2 druga datoteka]|[$2 druge datoteke]}} na ovoj stranici sa istim sadržajem",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 neke druge datoteke]}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Dupla datoteka|Duple datoteke}} koje su već obrisane",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Dvojna datoteka|Dvojne datoteke}}",
+       "api-error-duplicate": "Već postoji {{PLURAL:$1|druga datoteka|druge datoteke}} na ovoj stranici sa 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.",
        "api-error-fetchfileerror": "Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.",
index df7d659..b02efbb 100644 (file)
        "mergehistory-go": "Ẓṛ imbddln lli izḍarn ad mun.",
        "mergehistory-submit": "Smun ilqqmn.",
        "mergehistory-empty": "Ḥtta kra n ulqm ur izḍar ad imun ɣ wayya.",
-       "mergehistory-success": "$3 lqm{{PLURAL:$3||s}} n [[:$1]]  {{PLURAL:$3|imunn|munnin}} ɣ [[:$2]].",
+       "mergehistory-done": "$3 lqm{{PLURAL:$3||s}} n $1  {{PLURAL:$3|imunn|munnin}} ɣ [[:$2]].",
        "mergehistory-fail": "Ur as yuffi ad yili umun ɣ yan n imzruyn. Sti daɣ tasna d ḥtta iɣwwarn n usakud.",
        "mergehistory-no-source": "Tasna taɣbalut $1 ur tlli.",
        "mergehistory-no-destination": "Tasna n uwttas $1 ur tlli.",
        "nlinks": "$1 {{PLURAL:$1|azday|izdayn}}",
        "nmembers": "$1 {{PLURAL:$1|agmam|igmamn}}",
        "nrevisions": "$1 {{PLURAL:$1|asgadda|isgaddatn}}",
-       "nviews": "$1 {{PLURAL:$1|assag|issagn}}",
        "specialpage-empty": "Ur illa mayttukfan i asaggu yad",
        "lonelypages": "Tasnatiwin tigigilin",
        "lonelypagestext": "Tisnawinad ur ur tuyzdaynt z ulla lant ɣ tisniwin yaḍnin ɣ {{SITENAME}}.",
        "block-log-flags-nocreate": "Ammurzm n umiḍan urak ittuyskar",
        "movepagetext": "Swwur s tifrkkitad bac ad sbadlt uzwl tasna yad , s usmmattay n umzru ns s uzwl amaynu . Assaɣ Aqbur rad ig ɣil yan usmmattay n tasna s uzwl (titre) amynu . Tâḍart ad s tgt immattayn n ɣil f was fwas utumatik s dar uswl amaynu.  Iɣ tstit bac ad tskrt . han ad ur ttut ad tẓrt kullu  [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Illa fllak ad ur ttut masd izdayn rad tmattayn s sin igmmaḍn ur igan yan.\n\nSmmem masd tasna ur rad tmmatti iɣ tlla kra n yat yaḍn lli ilan asw zund nttat . Abla ɣ dars amzruy ɣ ur illa umay,  nɣd yan usmmattay ifssusn. \n\n''' Han !'''\nMaya Iẓḍar ad iglb zzu uzddar ar aflla tasna yad lli bdda n nttagga. Illa fllak ad urtskr mara yigriẓ midn d kiyyin lli iswurn ɣ tasna yad. issin mara tskr urta titskrt..",
        "movepagetalktext": "Tasna n umsgdal (imdiwiln) lli izdin d ɣta iɣ tlla, rad as ibadl w-assaɣ utumatik  '''abla iɣ :'''\n* tsmmuttim tasna s yan ugmmaḍ wassaɣ, niɣd\n* tasna n umsgdal( imdiwiln) tlla s wassaɣ ad amaynu, niɣd\n* iɣ tkrjm tasatmt ad n uzddar\n\nΓ Tiklayad illa flla tun ad tsbadlm assaɣ niɣt tsmun mayad s ufus ɣ yat, iɣ tram",
-       "movearticle": "Smmatti tasna niɣ as tsbudlt assaɣ",
        "newtitle": "dar w-assaɣ amaynu:",
        "move-watch": "Tfr tisniwin timaynutin d timẓlay",
        "movepagebtn": "Smmatti tasna niɣ as tsbudlt assaɣ",
index b17e15b..22a7991 100644 (file)
@@ -29,7 +29,8 @@
                        "Thanushka",
                        "Thirsty",
                        "Macofe",
-                       "Roonyh"
+                       "Roonyh",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "සබැඳි යටීර කිරීම:",
        "mergehistory-go": "ඒකාබද්ධ කල හැකි සංස්කරණ පෙන්වන්න",
        "mergehistory-submit": "සංශෝධන ඒකාබද්ධ කරන්න",
        "mergehistory-empty": "සංශෝධනයන් කිසිවක් ඒකාබද්ධ කල නොහැක.",
-       "mergehistory-success": " [[:$1]] හි  {{PLURAL:$3|සංශෝධනයක්|සංශෝධන  $3 ක්}}සාර්ථක ලෙස   [[:$2]] හා සමග ඒකාබද්ධ කරන ලදි.",
+       "mergehistory-done": " $1 හි  {{PLURAL:$3|සංශෝධනයක්|සංශෝධන  $3 ක්}}සාර්ථක ලෙස   [[:$2]] හා සමග ඒකාබද්ධ කරන ලදි.",
        "mergehistory-fail": "ඉතිහාස ඒකාබද්ධය සිදු කල නොහැක, පිටු හා වේලා පරාමිතීන් නැවත පිරික්සා බලන්න.",
        "mergehistory-fail-toobig": "ඉතිහාසය $1 සීමාව වඩා ලෙස ඒකාබද්ධය සිදු කල නොහැක, {{PLURAL:|සංශෝධනය|සංශෝධන $1}} ගෙන ඇත.",
        "mergehistory-no-source": "මූලාශ පිටුව $1 නොපවතී.",
        "movepagetext": "පහත ආකෘතිය භාවිතා කිරීමෙන්, එහි සියළු ඉතිහාසය නව නාමයට අනුයුක්ත කරමින්,  පිටුවක නම-වෙනස් කිරීම සිදුවේ.\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": "එය සමග ආශ්‍රිත සාකච්ඡා පිටුව ස්වයංක්‍රීය ලෙස ගෙනයාම වළක්වන '''වැළැහීම්:'''\n*නව පිටු නාමය යටතේ, හිස්-නොවන සාකච්ඡා පිටුවක් දැනටමත් පැවැතීම, හෝ\n*පහත කොටුව ඔබ විසින් නොතේරූ නිසාවෙන්.\n\nමෙවන් අවස්ථා වලදී, අවශ්‍යතාවය පැන නගී නම්, හස්තීය ලෙස ගෙන යාම හෝ ඒකාබද්ධ කිරීම හෝ සිදු කිරීමට ඔබ හට සිදුවේ.",
-       "movearticle": "පිටුව ගෙනයන්න:",
        "moveuserpage-warning": "'''අවවාදයයි:''' ඔබ යත්න දරමින් සිටිනුයේ පරිශීලක පිටුවක් ගෙන යෑමටයි. පිටුව ගෙන යෑම පමණක් සිදුවන බවද පරිශීලකයා යළි-නම්කෙරුම සිදු ''නොවන'' බවද කරුණාවෙන් සිහි තබා ගන්න.",
        "movenologintext": "පිටුවක් ගෙනයෑමට පෙර, ඔබ ලේඛනගත පරිශීලකයෙකු වී [[Special:UserLogin|ප්‍රවිෂ්ට වී]] සිටිය යුතුය.",
        "movenotallowed": "පිටු ගෙනයෑමට ඔබ හට අවසර නොමැත.",
        "api-error-badaccess-groups": "මෙම විකියට ගොනු උඩුගතකිරීම සඳහා ඔබට අවසර නැත.",
        "api-error-badtoken": "අභ්‍යන්තර දෝෂය: නොසුදුසු ටෝකනය.",
        "api-error-copyuploaddisabled": "URL මඟින් උඩුගතකිරීම මෙම සර්වරයේදී අක්‍රීය කොට තිබේ.",
-       "api-error-duplicate": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|[වෙනත් ගොනු $2 ක්]|[වෙනත් ගොනු $2 ක්]}} අඩවිය තුල දැනටමත් පවතියි.",
-       "api-error-duplicate-archive": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|[වෙනත් ගොනු $2 ක්]|[වෙනත් ගොනු $2 ක්]}} අඩවිය තුල දැනටමත් තිබුනා, නමුත්  {{PLURAL:$1|ඒක|ඒවා}} මකා දමා ඇත.",
-       "api-error-duplicate-archive-popup-title": "දැනටමත් මකා දමා ඇති එක වගේ {{PLURAL:$1|ගොනුවක්|ගොනු}}",
-       "api-error-duplicate-popup-title": "අනුපිටපත් {{PLURAL:$1|ගොනු|ගොනුව}}",
+       "api-error-duplicate": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|වෙනත් ගොනු $2 ක්|වෙනත් ගොනු $2 ක්}} අඩවිය තුල දැනටමත් පවතියි.",
+       "api-error-duplicate-archive": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|වෙනත් ගොනු ක්|වෙනත් ගොනු ක්}} අඩවිය තුල දැනටමත් තිබුනා, නමුත්  {{PLURAL:$1|ඒක|ඒවා}} මකා දමා ඇත.",
        "api-error-empty-file": "ඔබ ඉදිරිපත්කල ගොනුව හිස් එකකි.",
        "api-error-emptypage": "නවතම එකක් තනමින්, හිස් පිටුවලට ඉඩ නොදේ.",
        "api-error-fetchfileerror": "අභ්‍යන්තර දෝෂය: ගොනුව පැමිණවීම අතරතුරදී කුමක්දෝ වැරදුණා.",
index a3f4f5d..d27263e 100644 (file)
@@ -32,7 +32,8 @@
                        "Macofe",
                        "TomášPolonec",
                        "Mikulas1",
-                       "Hromoslav"
+                       "Hromoslav",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "mergehistory-go": "Zobraziť zlúčiteľné úpravy",
        "mergehistory-submit": "Zlúčiť revízie",
        "mergehistory-empty": "Žiadne revízie nie je možné zlúčiť.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revízia|revízie|revízií}} z [[:$1]] {{PLURAL:$3|bola úspešne zlúčená|boli úspešne zlúčené|bolo úspešne zlúčených}} do [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revízia|revízie|revízií}} z $1 {{PLURAL:$3|bola úspešne zlúčená|boli úspešne zlúčené|bolo úspešne zlúčených}} do [[:$2]].",
        "mergehistory-fail": "Nepodarilo sa vykonať zlúčenie histórií. Prosím, skontrolujte parametre stránka a časy.",
        "mergehistory-no-source": "Zdrojová stránka $1 neexistuje.",
        "mergehistory-no-destination": "Cieľová stránka $1 neexistuje.",
        "filerevert-legend": "Obnoviť súbor",
        "filerevert-intro": "Obnovujete '''[[Media:$1|$1]]''' na [$4 verziu z $2, $3].",
        "filerevert-comment": "Dôvod:",
-       "filerevert-defaultcomment": "Obnovená verzia z $1, $2",
+       "filerevert-defaultcomment": "Obnovená verzia z $1, $2 ($3)",
        "filerevert-submit": "Obnoviť",
        "filerevert-success": "'''[[Media:$1|$1]]''' bol obnovený na [$4 verziu z $2, $3].",
        "filerevert-badversion": "Neexistuje predchádzajúca lokálna verzia tohto súboru s požadovanou časovou značkou.",
        "movepagetext": "Pomocou tohto formulára premenujete stránku a premiestnite všetky jej predchádzajúce verzie pod zadaný nový názov.\nStarý názov sa stane presmerovacou stránkou na nový názov.\nMôžete automaticky aktualizovať odkazy odkazujúce na pôvodný názov.\nAk sa rozhodnete túto možnosť nevyužiť, ubezpečte sa, že ste skontrolovali\nvýskyt [[Special:DoubleRedirects|dvojitých]] a [[Special:BrokenRedirects|pokazených]] presmerovaní.\nVy ste zodpovedný za to, aby odkazy naďalej ukazovali tam, kam majú.\n\nUvedomte si, že stránka sa '''nepremiestni''', ak pod novým názvom už stránka existuje.\nToto neplatí iba ak je stránka prázdna alebo presmerovacia a nemá žiadne predchádzajúce verzie.\nTo znamená, že môžete premenovať stránku späť na názov, ktorý mala pred premenovaním, ak ste sa pomýlili, a že nemôžete prepísať\nexistujúcu stránku.\n\n'''UPOZORNENIE!'''\nToto môže byť drastická a nečakaná zmena pre populárnu stránku;\nubezpečte sa preto, skôr ako budete pokračovať, že chápete dôsledky svojho činu.",
        "movepagetext-noredirectfixer": "Pomocou tohto formulára premenujete stránku a premiestnite všetky jej predchádzajúce verzie pod zadaný nový názov.\nStarý názov sa stane presmerovacou stránkou na nový názov.\nUbezpečte sa, že ste skontrolovali výskyt [[Special:DoubleRedirects|dvojitých]] a [[Special:BrokenRedirects|pokazených]] presmerovaní.\nVy ste zodpovedný za to, aby odkazy naďalej ukazovali tam, kam majú.\n\nUvedomte si, že stránka sa '''nepremiestni''', ak pod novým názvom už stránka existuje.\nToto neplatí iba ak je stránka prázdna alebo presmerovacia a nemá žiadne predchádzajúce verzie.\nTo znamená, že môžete premenovať stránku späť na názov, ktorý mala pred premenovaním, ak ste sa pomýlili, a že nemôžete prepísať\nexistujúcu stránku.\n\n'''UPOZORNENIE!'''\nToto môže byť drastická a nečakaná zmena pre populárnu stránku;\nubezpečte sa preto, skôr ako budete pokračovať, že chápete dôsledky svojho činu.",
        "movepagetalktext": "Príslušná diskusná stránka (ak existuje) bude premiestnená spolu so samotnou stránkou; '''nestane sa tak, iba ak:'''\n*už existuje Diskusná stránka pod týmto novým menom, alebo\n*nezaškrtnete nižšie sa nachádzajúci textový rámček.\n\nV takých prípadoch budete musieť, ak si to želáte, premiestniť alebo zlúčiť stránku ručne.",
-       "movearticle": "Presunúť stránku",
        "moveuserpage-warning": "'''Upozornenie:''' Chystáte sa presunúť používateľskú stránku. Pamätajte, že týmto presuniete iba stránku a používateľ ''nebude'' premenovaný.",
        "movecategorypage-warning": "<strong>Upozornenie:</strong> Chystáte sa presunúť stránku kategórie. Uvedomte si, že presunutá bude iba táto stránka a že žiadne stránky v pôvodnej kategórii <em>nebudú</em> do novej kategórie automaticky preradené.",
        "movenologintext": "Musíte byť registrovaný používateľ a [[Special:UserLogin|prihlásený]], aby ste mohli presunúť stránku.",
        "api-error-badaccess-groups": "Nemáte oprávnenie nahrávať súbory na tejto wiki.",
        "api-error-badtoken": "Vnútorná chyba: Zlý token.",
        "api-error-copyuploaddisabled": "Nahrávanie z URL je na tomto serveri zakázané.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 ďalší súbor]|[$2 ďalšie súbory]}} s rovnakým obsahom už na tejto wiki existujú",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 ďalší súbor]|[$2 ďalšie súbory]}} s rovnakým obsahom už na tejto wiki existoval, ale {{PLURAL:$1|bol zmazaný|boli zmazané}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplicitný súbor, ktorý už bol zmazaný|Duplicitné súbory, ktoré už boli zmazané}}",
-       "api-error-duplicate-popup-title": "Duplikovať {{PLURAL:$1|súbor|súbory}}",
+       "api-error-duplicate": "{{PLURAL:$1|ďalší súbor|ďalšie súbory}} s rovnakým obsahom už na tejto wiki existujú",
+       "api-error-duplicate-archive": "{{PLURAL:$1|ďalší súbor|ďalšie súbory}} s rovnakým obsahom už na tejto wiki existoval, ale {{PLURAL:$1|bol zmazaný|boli zmazané}}.",
        "api-error-empty-file": "Súbor, ktorý ste poslali bol prázdny.",
        "api-error-emptypage": "Vytváranie nových, prázdnych stránok nie je dovolené.",
        "api-error-fetchfileerror": "Vnútorná chyba: Niečo pokazilo počas sťahovania súboru.",
index 6baa78e..85e43d7 100644 (file)
        "nstab-template": "Predloga",
        "nstab-help": "Pomoč",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Glavna stran",
        "nosuchaction": "Tako dejanje ne obstaja",
        "nosuchactiontext": "Dejanje, ki ga označuje spletni naslov, je napačno.\nMorda ste se pri naslovu zatipkali ali pa ste sledili napačni povezavi.\nMorda ste odkrili hrošča v programski opremi {{GRAMMAR:genitive|{{SITENAME}}}}.",
        "nosuchspecialpage": "Zahtevana posebna stran ne obstaja",
        "viewsource": "Izvorno besedilo",
        "viewsource-title": "Ogled vira $1",
        "actionthrottled": "Dejanje zaustavljeno",
-       "actionthrottledtext": "Kot ukrep proti smetju, je število izvajanj tega dejanja v časovnem obdobju omejeno, in vi ste ta limit presegli.\nProsimo, poskusite znova čez nekaj minut.",
+       "actionthrottledtext": "Kot ukrep proti zlorabam je število izvajanj tega dejanja v časovnem obdobju omejeno, in vi ste ta limit presegli.\nProsimo, poskusite znova čez nekaj minut.",
        "protectedpagetext": "Ta stran je bila zaklenjena za preprečitev urejanja ali drugih dejanj.",
        "viewsourcetext": "Vsebino te strani si lahko ogledate in kopirate.",
        "viewyourtext": "Lahko si ogledate in kopirate vsebino <strong>vaših urejanj</strong> te strani.",
        "createacct-captcha": "Varnostno preverjanje",
        "createacct-imgcaptcha-ph": "Vnesite zgornje besedilo",
        "createacct-submit": "Ustvarite svoj račun",
-       "createacct-another-submit": "Ustvarite še en račun",
+       "createacct-another-submit": "Ustvarite račun",
        "createacct-benefit-heading": "{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.",
        "createacct-benefit-body1": "{{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stran|strani}}",
        "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": "Poslali smo e-pošto za postavitev gesla.",
+       "passwordreset-emailsent": "Če je to registriran e-poštni naslov za vaš račun, 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 e-poštnega naslova",
-       "changeemail-text": "Izpolnite obrazec za spremembo vašega e-poštnega naslova. Za potrditev spremembe boste morali vnesti svoje geslo.",
+       "changeemail": "Sprememba ali odstranitev e-poštnega naslova",
+       "changeemail-text": "Izpolnite obrazec za spremembo vašega e-poštnega naslova. Za potrditev spremembe boste morali vnesti svoje geslo. Če želite s svojega računa odstraniti povezavo s katerim koli e-poštnim naslovom, pustite polje za nov e-poštni naslov med potrjevanje obrazca prazno.",
        "changeemail-no-info": "Za neposredni dostop do strani morate biti prijavljeni.",
        "changeemail-oldemail": "Trenutni e-poštni naslov:",
        "changeemail-newemail": "Novi e-poštni naslov:",
+       "changeemail-newemail-help": "Če želite odstraniti svoj e-poštni naslov, pustite polje prazno. Če e-poštni naslov odstranite, ne boste mogli ponastaviti pozabljenega gesla in ne boste prejemali e-pošte z wikija.",
        "changeemail-none": "(noben)",
        "changeemail-password": "Vaše geslo za {{GRAMMAR:tožilnik|{{SITENAME}}}}:",
        "changeemail-submit": "Spremeni e-naslov",
        "permissionserrorstext-withaction": "Za $2 zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov}} nimate dovoljenja:",
        "recreate-moveddeleted-warn": "'''Opozorilo: Pišete stran, ki je bila nekoč že izbrisana.'''\n\nPremislite preden nadaljujete s pisanjem, morda bo stran zaradi istih razlogov ponovno odstranjena.\nSpodaj je prikazan dnevnik brisanja in prestavljanja:",
        "moveddeleted-notice": "Stran je bila izbrisana.\nSpodaj sta za sklicevanje na razpolago dnevnik brisanja in dnevnik prestavljanja strani.",
+       "moveddeleted-notice-recent": "Oprostite, stran je bila nedavno izbrisana (v zadnjih 24 urah).\nDnevnik brisanja in prestavljanj strani je naveden spodaj.",
        "log-fulllog": "Ogled celotnih dnevniških zapiskov",
        "edit-hook-aborted": "Urejanje je bilo brez obrazložitve prekinjeno zaradi neznane napake.",
        "edit-gone-missing": "Strani ni mogoče posodobiti.\nIzgleda, da je bila izbrisana.",
        "mergehistory-go": "Prikaži redakcije, ki jih je možno združiti",
        "mergehistory-submit": "Združi redakcije",
        "mergehistory-empty": "Redakcij ni moč združiti.",
-       "mergehistory-success": "$3 {{PLURAL:$3|redakcija|redakciji|redakcije|redakcij}} [[:$1]] je uspešno spojenih v [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|redakcija|redakciji|redakcije|redakcij}} $1 {{PLURAL:$3|smo}} spojili v [[:$2]].",
        "mergehistory-fail": "Ne morem izvesti združitev zgodovine, prosimo, ponovno preverite strani in parametre časa.",
        "mergehistory-fail-toobig": "Ne morem izvesti združitve zgodovine, saj bi moral premakniti več kot $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}, kar je omejitev.",
        "mergehistory-no-source": "Izvirna stran $1 ne obstaja.",
        "prefs-watchlist-token": "Ključ spiska nadzorov:",
        "prefs-misc": "Druge nastavitve",
        "prefs-resetpass": "Spremeni geslo",
-       "prefs-changeemail": "Spremeni e-poštni naslov",
+       "prefs-changeemail": "Sprememba ali odstranitev e-poštnega naslova",
        "prefs-setemail": "Nastavi e-poštni naslov",
        "prefs-email": "Možnosti e-pošte",
        "prefs-rendering": "Videz",
        "group-bot": "Boti",
        "group-sysop": "Administratorji",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Nadzorniki",
+       "group-suppress": "Zatiralci",
        "group-all": "(vsi)",
        "group-user-member": "{{GENDER:$1|uporabnik|uporabnica}}",
        "group-autoconfirmed-member": "{{GENDER:$1|samodejno potrjen uporabnik|samodejno potrjena uporabnica}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorka}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratinja}}",
-       "group-suppress-member": "{{GENDER:$1|nadzornik|nadzornica}}",
+       "group-suppress-member": "{{GENDER:$1|zatiralec|zatiralka}}",
        "grouppage-user": "{{ns:project}}:Uporabniki",
        "grouppage-autoconfirmed": "{{ns:project}}:Samodejno potrjeni uporabniki",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:Administratorji",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Nadzorniki",
+       "grouppage-suppress": "{{ns:project}}:Zatiralci",
        "right-read": "Branje strani",
        "right-edit": "Urejanje strani",
        "right-createpage": "Ustvarjanje strani (ki niso pogovorne)",
        "recentchangeslinked-summary": "To je seznam nedavnih sprememb strani povezanih na določeno stran (ali iz določene kategorije).\nStrani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
        "recentchangeslinked-page": "Naslov strani:",
        "recentchangeslinked-to": "Prikaži spremembe na določeno stran povezanih strani",
+       "recentchanges-page-added-to-category": "[[:$1]] dodano v kategorijo",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] in $2 {{PLURAL:$2|stran dodana|strani dodani|strani dodane|strani dodanih}} v kategorijo",
+       "recentchanges-page-removed-from-category": "[[:$1]] odstranjeno iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] in $2 {{PLURAL:$2|stran odstranjena|strani odstranjeni|strani odstranjene|strani odstranjenih}} iz kategorije",
+       "autochange-username": "Samodejna sprememba MediaWiki",
        "upload": "Naloži datoteko",
        "uploadbtn": "Naloži datoteko",
        "reuploaddesc": "Prekliči nalaganje in se vrni na obrazec za nalaganje",
        "upload-options": "Možnosti nalaganja",
        "watchthisupload": "Opazuj to datoteko",
        "filewasdeleted": "Datoteka s tem imenom je bila nekoč že naložena in potem izbrisana. Preden jo znova naložite, preverite $1.",
+       "filename-thumb-name": "Zdi se, da je to naslov predogledne sličice. Prosimo, ne nalagajte predoglednih sličic nazaj na isti wiki. V nasprotnem primeru popravite ime datoteke, da je bolj smiselno in da nima predpone sličice.",
        "filename-bad-prefix": "Ime datoteke, ki jo nalagate, se začne z '''»$1«''', ki je neopisno ime, ponavadi dodeljeno samodejno s strani digitalnih fotoaparatov.\nProsimo, izberite bolj opisno ime vaše datoteke.",
        "filename-prefix-blacklist": " #<!-- pustite to vrstico takšno, kot je --> <pre>\n# Sintaksa:\n#   * Vse od znaka »#« in do konca vrstice je komentar\n#   * Vsaka neprazna vrstica je predpona za tipična imena datotek, določena samodejno s strani digitalnih fotoaparatov\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # nekateri mobilni telefoni\nIMG # generično\nJD # Jenoptik\nMGP # Pentax\nPICT # mešano\n #</pre> <!-- pustite to vrstico takšno, kot je -->",
        "upload-success-subj": "Datoteka je bila uspešno naložena",
        "upload-http-error": "Prišlo je do napake HTTP: $1",
        "upload-copy-upload-invalid-domain": "Nalaganje kopij s te domene ni možno.",
        "upload-dialog-title": "Naloži datoteko",
-       "upload-dialog-error": "Prišlo je do napake",
-       "upload-dialog-warning": "Pojavilo se je opozorilo",
        "upload-dialog-button-cancel": "Prekliči",
        "upload-dialog-button-done": "Končano",
        "upload-dialog-button-save": "Shrani",
        "upload-dialog-button-upload": "Naloži",
-       "upload-dialog-label-select-file": "Izberi datoteko",
-       "upload-dialog-label-infoform-title": "Podrobnosti",
-       "upload-dialog-label-infoform-name": "Ime",
-       "upload-dialog-label-infoform-description": "Opis",
-       "upload-dialog-label-usage-title": "Uporaba",
-       "upload-dialog-label-usage-filename": "Ime datoteke",
+       "upload-process-error": "Prišlo je do napake",
+       "upload-process-warning": "Pojavilo se je opozorilo",
+       "upload-form-label-select-file": "Izberi datoteko",
+       "upload-form-label-infoform-title": "Podrobnosti",
+       "upload-form-label-infoform-name": "Ime",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Uporaba",
+       "upload-form-label-usage-filename": "Ime datoteke",
+       "foreign-structured-upload-form-label-own-work": "To je moje lastno delo",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorije",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-default": "Razumem, da datoteko nalagam v deljeno hrambo. Potrjujem, da to počnem v skladu s tukajšnjimi pogoji uporabe in pravili za licenciranje.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Če datoteke ne morete naložiti pod pogoji deljene hrambe, zaprite to okno in poskusite drugo metodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Morda želite datoteko poskusiti naložiti na [[Special:Upload|strani za nalaganje na {{SITENAME}}]], če jo lahko naložite pod njihovimi pravili.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Izjavljam, da sem lastnik avtorskih pravic te datoteke, strinjam se z nepreklicno objavo datoteke v Wikimedijini Zbirki pod dovoljenjem [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 4.0] in strinjam se s [https://wikimediafoundation.org/wiki/Terms_of_Use Pogoji uporabe].",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Če niste lastnik avtorskih pravic datoteke ali jo želite objaviti pod drugačnim dovoljenje, uporabite [https://commons.wikimedia.org/wiki/Special:UploadWizard Čarovnik za nalaganje v Zbirko].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Morda želite datoteko poskusiti naložiti na [[Special:Upload|strani za nalaganje na {{SITENAME}}]], če stran dovoljuje nalaganje datoteke pod njihovimi pravili.",
        "backend-fail-stream": "Ne morem pretakati datoteke $1.",
        "backend-fail-backup": "Ne morem varnostno kopirati datoteke $1.",
        "backend-fail-notexists": "Datoteka $1 ne obstaja.",
        "filerevert-legend": "Vrni datoteko",
        "filerevert-intro": "Vračate datoteko '''[[Media:$1|$1]]''' na [$4 različico $3, $2].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "Vrnjeno na različico $2, $1.",
+       "filerevert-defaultcomment": "Vrnjeno na različico $2, $1 ($3)",
        "filerevert-submit": "Vrni",
        "filerevert-success": "Datoteka '''[[Media:$1|$1]]''' je bila vrnjena na [$4 različico $3, $2].",
        "filerevert-badversion": "Ne najdem preteklih lokalnih verzij datoteke s podanim časovnim žigom.",
        "nopagetext": "Ciljna stran, ki ste jo navedli, ne obstaja.",
        "pager-newer-n": "{{PLURAL:$1|novejši|novejša|novejši|novejših}} $1",
        "pager-older-n": "{{PLURAL:$1|starejši|starejša|starejši|starejših}} $1",
-       "suppress": "Nadzor",
+       "suppress": "Zatri",
        "querypage-disabled": "Ta posebna stran je onemogočena iz zmogljivostnih razlogov.",
        "apihelp": "Pomoč za API",
        "apihelp-no-such-module": "Modula »$1« nismo našli.",
        "emailccsubject": "Kopija tvojega sporočila iz $1: $2",
        "emailsent": "E-pismo je poslano!",
        "emailsenttext": "E-pismo je poslano.",
-       "emailuserfooter": "To e-poštno sporočilo je bilo poslal(-a) $1 uporabniku $2 s funkcijo »{{int:emailuser}}« na {{GRAMMAR:dative|{{SITENAME}}}}.",
+       "emailuserfooter": "To e-poštno sporočilo je {{GENDER:$1|poslal|poslala|poslal(-a)}} $1 uporabniku {{GENDER:$2|$2}} s funkcijo »{{int:emailuser}}« na {{GRAMMAR:dative|{{SITENAME}}}}.",
        "usermessage-summary": "Pusti sistemsko sporočilo.",
        "usermessage-editor": "Sistemski sporočevalec",
        "watchlist": "Spisek nadzorov",
        "deletepage": "Briši stran",
        "confirm": "Potrdi",
        "excontent": "vsebina: '$1'",
-       "excontentauthor": "vsebina: '$1' (edini urejevalec pa '$2')",
+       "excontentauthor": "vsebina je bila: »$1«, edini urejevalec pa »[[Special:Contributions/$2|$2]]« ([[User talk:$2|pogovor]])",
        "exbeforeblank": "vsebina pred brisanjem: '$1'",
        "delete-confirm": "Brisanje »$1«",
        "delete-legend": "Izbriši",
        "move-page-legend": "Prestavitev strani",
        "movepagetext": "Z naslednjim obrazcem lahko stran preimenujete in hkrati prestavite tudi vso njeno zgodovino.\nDosedanja stran se bo spremenila v preusmeritev na prihodnje mesto.\nSamodejno lahko posodobite preusmeritve, ki kažejo na dosedanji naslov.\nČe se za to ne odločite, ne pozabite preveriti vseh [[Special:DoubleRedirects|dvojnih]] ali [[Special:BrokenRedirects|pretrganih preusmeritev]].\nOdgovorni ste, da bodo povezave še naprej kazale na prava mesta.\n\nKjer stran z izbranim novim imenom že obstaja, dejanje '''ne''' bo izvedeno, razen če je sedanja stran preusmeritev in brez zgodovine urejanj.\nTo pomeni, da lahko, če se zmotite, strani vrnete prvotno ime, ne morete pa prepisati že obstoječe strani.\n\n'''Opozorilo!'''\nPrestavitev strani je lahko za priljubljeno stran velika in nepričakovana sprememba, zato pred izbiro ukaza dobro premislite.",
        "movepagetext-noredirectfixer": "Z uporabo spodnjega obrazca lahko preimenujete stran tako, da prestavite vso njeno zgodovino na novo ime.\nStar naslov bo postal preusmeritvena stran na nov naslov.\nNe pozabite preveriti [[Special:DoubleRedirects|dvojnih]] ali [[Special:BrokenRedirects|pretrganih preusmeritev]].\nVi ste odgovorni, da vse povezave še naprej kažejo tja, kamor naj bi.\n\nUpoštevajte, da stran '''ne''' bo prestavljena, če že obstaja stran z novim naslovom, razen če je prazna ali preusmeritev brez pretekle zgodovine urejanj.\nTo pomeni, da lahko stran preimenujete nazaj, če ste naredili napako, vendar ne morete prepisati obstoječe strani.\n\n'''Opozorilo!'''\nTo je lahko velika in nepričakovana sprememba za priljubljeno stran;\nprosimo, pred nadaljevanjem se prepričajte, da razumete posledice tega dejanja.",
-       "movepagetalktext": "Če obstaja, bo samodejno prestavljena tudi pripadajoča pogovorna stran, '''razen kadar'''\n*pod novim imenom že obstaja neprazna pogovorna stran ali\n*ste odkljukali spodnji okvirček.\n\nČe je tako, boste morali pogovorno stran, če želite, prestaviti ali povezati ročno.",
-       "movearticle": "Preimenuj stran:",
+       "movepagetalktext": "Če označite to polje, bomo pripadajočo pogovorno stran samodejno prestavili na nov naslov, razen kadar tam že obstaja neprazna pogovorna stran.\n\nČe je tako, boste morali pogovorno stran, če želite, prestaviti ali združiti ročno.",
        "moveuserpage-warning": "'''Opozorilo:''' Premikate uporabniško stran. To pomeni, da bo premaknjena samo stran in uporabnik ''ne'' bo preimenovan.",
        "movecategorypage-warning": "<strong>Opozorilo:</strong> Prestavili boste stran kategorije. Pomnite, da boste prestavili samo stran; vse strani v stari kategoriji <em>ne</em> bomo prekategorizirali v novo kategorijo.",
        "movenologintext": "Za prestavljanje strani morate biti registrirani in [[Special:UserLogin|prijavljeni]].",
        "cant-move-to-user-page": "Nimate dovoljenja, da premikate strani na uporabniške strani (razen na uporabniške podstrani).",
        "cant-move-category-page": "Nimate pravic za prestavljanje strani kategorij.",
        "cant-move-to-category-page": "Nimate pravic za prestavljanje strani na stran kategorije.",
-       "newtitle": "Na naslov:",
+       "newtitle": "Nov naslov:",
        "move-watch": "Opazuj to stran",
        "movepagebtn": "Prestavi stran",
        "pagemovedsub": "Uspešno prestavljeno",
        "logentry-newusers-byemail": "$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun $3; geslo je bilo poslano po e-pošti",
        "logentry-newusers-autocreate": "Račun $1 je bil samodejno {{GENDER:$2|ustvarjen}}",
        "logentry-protect-move_prot": "$1 je {{GENDER:$2|prestavil|prestavila|prestavil(-a)}} nastavitve zaščite s strani $4 na $3",
+       "logentry-protect-unprotect": "$1 je {{GENDER:$2|odstranil|odstranila|odstranil(-a)}} zaščito $3",
+       "logentry-protect-protect": "$1 je {{GENDER:$2|zaščitil|zaščitila|zaščitil(-a)}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 je {{GENDER:$2|zaščitil|zaščitila|zaščitil(-a)}} $3 $4 [kaskadno]",
+       "logentry-protect-modify": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} stopnjo zaščite $3 $4",
+       "logentry-protect-modify-cascade": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} stopnjo zaščite $3 $4 [kaskadno]",
        "logentry-rights-rights": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3 z $4 na $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3",
        "logentry-rights-autopromote": "$1 je {{GENDER:$2|bil samodejno povišan|bila samodejno povišana|bil(-a) samodejno povišan(-a)}} z $4 na $5",
        "api-error-badaccess-groups": "Nalaganje datotek na ta wiki vam ni dovoljeno.",
        "api-error-badtoken": "Notranja napaka: slab žeton.",
        "api-error-copyuploaddisabled": "Nalaganje preko URL je na tem strežniku onemogočeno.",
-       "api-error-duplicate": "Na strani že {{PLURAL:$1|obstaja [$2 druga datoteka]|obstajata [$2 drugi datoteki]|obstajajo [$2 druge datoteke]|obstaja [$2 drugih datotek]}} z enako vsebino",
-       "api-error-duplicate-archive": "Na strani {{PLURAL:$1|je že bila [$2 druga datoteka]|sta že bili [$2 drugi datoteki]|so že bile [$2 nekatere druge datoteke]}} z enako vsebino, vendar {{PLURAL:$1|je bila izbrisana|sta bili izbrisani|so bile izbrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Podvojena datoteka, ki je že bila izbrisana|Podvojeni datoteki, ki sta že bili izbrisani|Podvojene datoteke, ki so že bile izbrisane}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Podvojena datoteka|Podvojeni datoteki|Podvojene datoteke}}",
+       "api-error-duplicate": "Na strani že {{PLURAL:$1|obstaja druga datoteka|obstajata drugi datoteki|obstajajo druge datoteke}} z enako vsebino.",
+       "api-error-duplicate-archive": "Na strani {{PLURAL:$1|je že bila druga datoteka|sta že bili drugi datoteki|so že bile nekatere druge datoteke}} z enako vsebino, vendar {{PLURAL:$1|je bila izbrisana|sta bili izbrisani|so bile izbrisane}}.",
        "api-error-empty-file": "Poslana datoteka je prazna.",
        "api-error-emptypage": "Ustvarjanje novih, praznih strani ni dovoljeno.",
        "api-error-fetchfileerror": "Notranja napaka: pri pridobivanju datoteke je nekaj šlo narobe.",
index 45f8809..cc15fe9 100644 (file)
        "mergehistory-merge": "De folgenda Versionen vu „[[:$1]]“ kinna noach „[[:$2]]“ iebertraga waan. Markiere de Version, bis zu dar (einschließlich) de Versionen iebertraga waan sulln. Bitte beachte, doaß de Nutzung dar Navigationslinks de Auswoahl zerrickesetzt.",
        "mergehistory-go": "Zeige Versiona, de vereinigt waan kinna",
        "mergehistory-empty": "Is kinna kenne Versiona vereinigt waan.",
-       "mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versiona}} vu „[[:$1]]“ erfolgreich noach „[[:$2]]“ vereinigt.",
+       "mergehistory-done": "{{PLURAL:$3|1 Version|$3 Versiona}} vu „$1“ erfolgreich noach „[[:$2]]“ vereinigt.",
        "mergehistory-fail": "Versionsvereinigung nee meegliech, bitte prife de Seite und de Zeitoagaba.",
        "mergehistory-no-source": "Ursprungsseyte „$1“ ies ne vurhanda.",
        "mergehistory-no-destination": "Zielseyte „$1“ ies ne vurhanda.",
        "mailnologin": "Fahler beim E-Mail-Versand",
        "mailnologintext": "Du mußt [[Special:UserLogin|oagemeldet sei]] und anne bestätigte E-Mail-Atresse ei denn [[Special:Preferences|Einstellunga]] eingetraga hoan, im andern Nutzern E-Mails schicka zu kinna.",
        "emailuser": "E-Mail oa diesa Benutzer",
-       "emailpage": "E-Mail oa Benutzer",
        "emailpagetext": "Du koast damm Nutzer miet damm onda stiehenda Formular anne E-Mail senda.\nOls Obsender werd de E-Mail-Adtresse aus denn [[Special:Preferences|Einstellunga]] eingetraga, damit dar Nutzer dir antwurta koan.",
        "noemailtitle": "Kenne E-Mail-Atresse",
        "noemailtext": "Dieser Nutzer hoot kenne giltige E-Mail-Atresse oagegahn.",
        "move-page-legend": "Seite verschieba",
        "movepagetext": "Miet diesem Formular koast du anne Seite umbenenna (mitsamt olla Versiona).\nDer aale Tittel werd zim neua weiterleita.\nDu koast Weiterleitunga, de uffa Originaltittel verlinka, automatisch korrigiera lassa.\nFalls du dies nee tust, priefe uff [[Special:DoubleRedirects|doppelte]] oder [[Special:BrokenRedirects|kaputte Weiterleitunga]].\nDu best derfier verantwurtlich, dass Links weiterhin uff doas korrekte Ziel zeiga.\n\nDe Seite werd '''nee''' verschoba, wenn is bereits anne Seite mit demselba Noama gitt, sufern diese nee laar oder anne Weiterleitung ohne Versionsgeschichte ies. Dies bedeutet, dass du de Seite zerricke verschieba koast, wenn du anna Fahler gemoacht host. Du koast hingegen kenne Seite ieberschreiba.\n\n'''Warnung'''\nDe Verschiebung koan weitreichende und unerwartete Fulga fier beliebte Seita hoan.\nDu sulltest daher de Konsequenzen verstanda hoan, bevur du furtfährst.",
        "movepagetalktext": "De dazugeheerige Dischkursseite werd, sufern vorhanda, mitverschoba, ''''s sei denn:'''\n*'S existiert bereits anne Dischkursseite mit diesem Noama, oder\n*du wählst de onda stiehende Option ob.\n\nEi diesa Fäll muußt du, foalls gewinscht, den Inhalt der Seite vu Hand verschieba oder zusommafiehra.\n\nBitte den '''neua''' Tittel under '''Ziel''' eintraga, darunder de Umbenennung bitte '''begrienda.'''",
-       "movearticle": "Seite verschieba:",
        "movenologintext": "Du muoßt a registrierter Nutzer und [[Special:UserLogin|oagemeldet]] sei, im anne Seite zu verschieba.",
        "movenotallowed": "Du host kenne Berechtigung, Seyta zu verschieba.",
        "cant-move-user-page": "Du host kenne Berechtigung, Nutzerhauptseyta zu verschieba.",
index cb5de48..e74eabd 100644 (file)
                        "Macofe",
                        "Liridon",
                        "Ammartivari",
-                       "Kosovastar"
+                       "Kosovastar",
+                       "Matma Rex"
                ]
        },
-       "tog-underline": "Nënvizizimi i lidhjes:",
-       "tog-hideminor": "Fsheh redaktimet e vogla nga ndryshimet e fundit",
-       "tog-hidepatrolled": "Fshih redaktimet e vrojtuara në ndryshimet e fundit",
-       "tog-newpageshidepatrolled": "Fshih faqet e vrojtuara nga lista e faqeve të reja",
+       "tog-underline": "Nënvizimi i lidhjes:",
+       "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-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",
-       "tog-showtoolbar": "Trego mjetet e redaktimit (kërkon JavaScript)",
-       "tog-editondblclick": "Redakto faqet me dopio-klik (kërkon JavaScript)",
-       "tog-editsectiononrightclick": "Lejo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit (kërkon JavaScript)",
+       "tog-showtoolbar": "Shfaq shiritin e veglave të redaktorit",
+       "tog-editondblclick": "Redakto faqe në klikim të dyfishtë",
+       "tog-editsectiononrightclick": "Aktivizo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit",
        "tog-watchcreations": "Shtoi faqet e krijuara dhe skedat e ngarkuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchdefault": "Shto faqet dhe skedat e redaktuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchmoves": "Shto faqet dhe skedat e zhvendosura prej meje tek lista e faqeve nën mbikqyrje",
@@ -52,7 +53,7 @@
        "tog-previewontop": "Vendose kutinë e bocetit sipër kutisë së redaktimeve",
        "tog-previewonfirst": "Tregoje bocetin në redaktimin e parë",
        "tog-enotifwatchlistpages": "Më njofto me e-mail kur ndryshohet një faqe apo skedarë nga lista ime e faqeve nën mbikqyrje",
-       "tog-enotifusertalkpages": "Më njofto me e-mail kur faqja ime e dikutimeve të përdoruesit ndryshohet",
+       "tog-enotifusertalkpages": "Kur faqja ime e diskutimeve e përdoruesit ndryshohet, më dërgo email",
        "tog-enotifminoredits": "Më njofto me e-mail edhe kur ka redaktime të vogla në faqe dhe skedave",
        "tog-enotifrevealaddr": "Tregoje adresën time të e-mail-it në e-mail-et njoftuese",
        "tog-shownumberswatching": "Trego numrin e përdoruesve që vëzhgojnë këtë faqe",
        "november-gen": "nëntor",
        "december-gen": "dhjetor",
        "jan": "Jan",
-       "feb": "Shku",
+       "feb": "Shk",
        "mar": "Mar",
        "apr": "Pri",
        "may": "Maj",
        "jun": "Qer",
        "jul": "Korr",
        "aug": "Gush",
-       "sep": "Shta",
+       "sep": "Sht",
        "oct": "Tet",
        "nov": "Nën",
        "dec": "Dhje",
        "november-date": "$1 nëntor",
        "december-date": "$1 dhjetor",
        "pagecategories": "{{PLURAL:$1|Kategoria|Kategoritë}}",
-       "category_header": "Artikuj në kategorinë \"$1\"",
-       "subcategories": "Nën-kategori",
-       "category-media-header": "Skeda në kategorinë \"$1\"",
-       "category-empty": "''Kjo kategori aktualisht nuk përmban asnjë faqe apo media.''",
+       "category_header": "Faqet në kategorinë \"$1\"",
+       "subcategories": "Nënkategoritë",
+       "category-media-header": "Media në kategorinë \"$1\"",
+       "category-empty": "<em>Kjo kategori aktualisht nuk përmban asnjë faqe apo media.</em>",
        "hidden-categories": "{{PLURAL:$1|Kategori e fshehur|Kategori të fshehura}}",
        "hidden-category-category": "Kategori të fshehura",
        "category-subcat-count": "{{PLURAL:$2|Kjo kategori ka vetëm këtë nën-kategori.|Kjo kategori ka {{PLURAL:$1|këtë nën-kategori|$1 këto nën-kategori}}, nga $2 gjithësej.}}",
        "noindex-category": "Faqe jo të indeksuara",
        "broken-file-category": "Faqet me lidhjet file thyer",
        "about": "Rreth",
-       "article": "Artikulli",
+       "article": "Faqja e përmbajtjes",
        "newwindow": "(hapet në një dritare të re)",
        "cancel": "Anulo",
        "moredotdotdot": "Më shumë...",
        "morenotlisted": "Kjo listë nuk është e plotë.",
        "mypage": "Faqja",
-       "mytalk": "Diskutimet",
+       "mytalk": "Diskuto",
        "anontalk": "Diskutimet për këtë IP",
-       "navigation": "Shfleto",
+       "navigation": "Navigimi",
        "and": "&#32;dhe",
        "qbfind": "Gjeni",
        "qbbrowse": "Shfletoni",
-       "qbedit": "Redaktoni",
+       "qbedit": "Redakto",
        "qbpageoptions": "Kjo faqe",
        "qbmyoptions": "Faqet e mia",
-       "faq": "Pyetje që bëhen shpesh",
-       "faqpage": "Projekt: Pyetje që bëhen shpesh",
+       "faq": "Pyetje të shpeshta",
+       "faqpage": "Project: Pyetje të shpeshta",
        "actions": "Veprimet",
        "namespaces": "Hapsirat e emrit",
-       "variants": "Variante",
-       "navigation-heading": "Menuja e navigimit",
+       "variants": "Variantat",
+       "navigation-heading": "Menyja e navigimit",
        "errorpagetitle": "Gabim",
        "returnto": "Kthehuni tek $1",
        "tagline": "Nga {{SITENAME}}",
        "history": "Historiku i faqes",
        "history_short": "Historiku",
        "updatedmarker": "përditësuar që nga vizita ime e fundit",
-       "printableversion": "Version për printer",
+       "printableversion": "Versioni i printueshëm",
        "permalink": "Lidhje e përhershme",
        "print": "Printo",
        "view": "Shiko",
        "view-foreign": "Pamja <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
        "edit": "Redakto",
-       "edit-local": "Modifiko burimin lokalt të përshkrimit",
+       "edit-local": "Redakto përshkrimin lokal",
        "create": "Krijo",
        "create-local": "Shtonipërshkrimin lokal",
        "editthispage": "Redakto këtë faqe",
-       "create-this-page": "Krijoje këtë faqe",
-       "delete": "Grise",
+       "create-this-page": "Krijo këtë faqe",
+       "delete": "Fshi",
        "deletethispage": "Grise këtë faqe",
        "undeletethispage": "Rikthe faqen",
        "undelete_short": "Anullo fshirjen {{PLURAL:$1|një redaktim|$1 redaktime}}",
        "talk": "Diskutimet",
        "views": "Shikime",
        "toolbox": "Mjete",
-       "userpage": "Shiko faqen e përdoruesit",
-       "projectpage": "Shiko projekt-faqen",
-       "imagepage": "Shikoni faqen e skedës",
+       "userpage": "Shfaq faqen e përdoruesit",
+       "projectpage": "Shfaq faqen e projektit",
+       "imagepage": "Shfaq faqen e skedës",
        "mediawikipage": "Shiko faqen e mesazhit",
        "templatepage": "Shiko faqen e shabllonit",
        "viewhelppage": "Shiko faqen për ndihmë",
-       "categorypage": "Shiko faqen e kategorive",
+       "categorypage": "Shfaq faqen e kategorisë",
        "viewtalkpage": "Shiko diskutimet",
        "otherlanguages": "Në gjuhë të tjera",
        "redirectedfrom": "(Përcjellë nga $1)",
-       "redirectpagesub": "Faqe përcjellëse",
-       "redirectto": "Përcjellim për tek:",
+       "redirectpagesub": "Ridrejto faqen",
+       "redirectto": "Ridrejto tek:",
        "lastmodifiedat": "Kjo faqe është ndryshuar për herë te fundit më $1, në orën $2.",
        "viewcount": "Kjo faqe është shikuar {{PLURAL:$1|një|$1 herë}} .",
        "protectedpage": "Faqe e mbrojtur",
        "policy-url": "Project:Politika e rregullave",
        "portal": "Portali i komunitetit",
        "portal-url": "Project:Portali i komunitetit",
-       "privacy": "Politika e anonimitetit",
-       "privacypage": "Project:Politika e anonimitetit",
+       "privacy": "Mbrojtja e privatësisë",
+       "privacypage": "Project: Mbrojtja e privatësisë",
        "badaccess": "Leje: gabim",
        "badaccess-group0": "Nuk ju lejohet veprimi i kërkuar",
        "badaccess-groups": "Veprimi që kërkuat lejohet vetëm nga përdorues të {{PLURAL:$2|grupit|grupeve}}: $1.",
        "nstab-template": "Stampa",
        "nstab-help": "Ndihmë",
        "nstab-category": "Kategoria",
+       "mainpage-nstab": "Faqja kryesore",
        "nosuchaction": "Nuk ekziston ky veprim",
        "nosuchactiontext": "Veprimi i specifikuar nga URL është i pavlefshëm.\nJu mund të keni bërë një gabim në shkrimin e URL-së, ose keni ndjekur një lidhje të pasaktë.\nKjo mund të vijë edhe si rezultat i një gabimi në programin e përdorur nga {{SITENAME}}.",
        "nosuchspecialpage": "Nuk ekziston kjo faqe speciale",
        "badtitle": "Titull i pasaktë",
        "badtitletext": "Titulli i faqes që kërkuat nuk ishte i saktë, ishte bosh, ose ishte një titull ndër-gjuhësor/inter-wiki me lidhje të pasaktë.\nMund të përmbajë një ose më shumë germa, të cilat nuk mund të përdoren në tituj.",
        "title-invalid-empty": "Titulli i faqes së kërkuar është bosh ose përmban vetëm emrin e një hapësire.",
-       "title-invalid-interwiki": "Titulli përmban një lidhje ndërwiki",
+       "title-invalid-utf8": "Titulli i faqes së kërkuar përmban një varg të pavlefshëm UTF-8.",
+       "title-invalid-interwiki": "Titulli i faqes së kërkuar përmban një lidhje interwiki që nuk mund të përdoret në tituj.",
        "title-invalid-talk-namespace": "Titulli i faqes së kërkuar i referohet një faqeje diskutimi që nuk mund të ekzistojë.",
        "title-invalid-characters": "Titulli i faqes së kërkuar përmban karaktere të pavlefshme: \"$1\".",
+       "title-invalid-relative": "Titulli ka shteg relativ. Titujt relativ të faqes (./, ../) janë të pavlefshëm, për shkak se ata shpesh do të jenë të pakapshëm kur trajtohen nga shfletuesi i përdoruesit.",
+       "title-invalid-magic-tilde": "Titulli i faqes përmban tildë të pavlefshme magjike (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Titulli i faqes së kërkuar është shumë i gjatë. Duhet të jetë jo më shumë se $1 {{PLURAL:$1|byte|byte}} në kodimin UTF-8.",
+       "title-invalid-leading-colon": "Titulli i faqes së kërkuar përmban dy pika (:) të pavlefshme në fillim.",
        "perfcached": "nformacioni i mëposhtëm është kopje e ruajtur dhe mund të mos jetë i përditësuar. E shumta  {{PLURAL:$1|një rezultat është|$1 rezultate janë}} ruajtur në kopje.",
        "perfcachedts": "Informacioni i mëposhtëm është një kopje e rifreskuar më $1. E shumta  {{PLURAL:$4|një rezultat është|$4 rezultate janë}} ruajtur në kopje.",
        "querypage-no-updates": "Përditësimet për këtë faqe për momentin janë të ç'aktivizuara.\nKëtu informacioni nuk do të jetë i përditësuar.",
        "actionthrottled": "Veprim u ndalua",
        "actionthrottledtext": "Si masë sigurie anti-spam, është e ndaluar kryerja e shpeshtë e një veprimi brenda një hapësire kohore shumë të shkurtër. Ju kryet shumë herë të njëjtin veprim brenda një kohe shumë të shkurtër.\nJu lutemi, provojeni përsëri pas disa minutash.",
        "protectedpagetext": "Kjo faqe është e mbrojtur për të parandaluar redaktimi apo veprime të tjera.",
-       "viewsourcetext": "Ju mund të shikoni dhe kopjoni tekstin e kësaj faqeje:",
-       "viewyourtext": "Ju mund të shikoni dhe të kopjoni tekstin e '''ndryshimeve tuaja''' tek kjo faqe:",
+       "viewsourcetext": "Ju mund të shikoni dhe kopjoni tekstin burimor të kësaj faqe.",
+       "viewyourtext": "Ju mund të shikoni dhe kopjoni tekstin burimor të <strong>redaktimeve tuaja</strong> në këtë faqe.",
        "protectedinterface": "Kjo faqe përmban tekstin e dritares së programit, për këtë arsye mbrohet për të shmangur abuzimet.",
        "editinginterface": "'''Kujdes:''' Po redaktoni një faqe që përdoret për tekstin dritares së programit. \nNdryshimet në këtë faqe do të ndikojnë pamjen e dritares për përdoruesit e tjerë.\nPër përkthime, ju lutem konsideroni përdorimin e [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], projektin e lokalizimit MediaWiki.",
        "translateinterface": "Të shtoni ose të ndryshojë përkthime për të gjitha wikis, ju lutem përdorimin e [//translatewiki.net/ translatewiki.net], MediaWiki lokalizimin e projektit.",
-       "cascadeprotected": "Kjo faqe është mbrojtur nga redaktimi pasi është përfshirë në {{PLURAL:$1|faqen|faqet}} e mëposhtme që {{PLURAL:$1|është|janë}} mbrojtur sipas metodës \"cascading\":\n$2",
+       "cascadeprotected": "Kjo faqe është mbrojtur nga redaktimi pasi që është përfshirë në {{PLURAL:$1|faqen|faqet}} e mëposhtme që {{PLURAL:$1|është|janë}} mbrojtur sipas metodës \"cascading\":\n$2",
        "namespaceprotected": "Nuk ju lejohet redaktimi i faqeve në hapsirën '''$1'''.",
        "customcssprotected": "Ju nuk keni leje për të redaktuar këtë faqe CSS, sepse ai përmban cilësimet personale tjetër user's.",
        "customjsprotected": "Ju nuk keni leje për të redaktuar këtë faqe JavaScript, sepse ai përmban cilësimet personale tjetër user's.",
        "mycustomcssprotected": "Ju nuk keni leje për të redaktuar këtë faqe CSS.",
        "mycustomjsprotected": "Ju nuk keni leje për të redaktuar këtë   faqe JavaScript .",
-       "myprivateinfoprotected": "Ju nuk keni leje për të redaktuar të dhënat tuaja private.",
-       "mypreferencesprotected": "Ju nuk keni leje për të ndryshuar preferencat tuaja.",
+       "myprivateinfoprotected": "Ti nuk ke leje për të redaktuar të dhënat e tua private.",
+       "mypreferencesprotected": "Ti nuk ke leje për të ndryshuar preferencat e tua.",
        "ns-specialprotected": "Faqet speciale nuk mund të redaktohen.",
        "titleprotected": "Ky titull është mbrojtur nga [[User:$1|$1]] dhe nuk mund të krijohet.\nArsyeja e dhënë është ''$2''.",
        "filereadonlyerror": "Nuk është në gjendje që të ndryshojë skedarin \"$1\" sepse depoja e skedarit \"$2\" është në formën vetëm-lexim.\n\nAdministratori i cili e mbylli atë e dha këtë shpjegim: \"$3\".",
        "exception-nologin-text": "Ju lutem [[Special:Userlogin|hyni brënda]] për të qenë  në gjendje të hyni në këtë faqe ose veprim.",
        "exception-nologin-text-manual": "Ju lutem <span class=\"notranslate\" translate=\"asnjë\">$1</span> që të jeni në gjendje për të hyrë në këtë faqe ose të veproni.",
        "virus-badscanner": "Konfiguracion i parregullt: Skaner i panjohur virusesh: ''$1''",
-       "virus-scanfailed": "skani dështoi (code $1)",
+       "virus-scanfailed": "skanimi dështoi (code $1)",
        "virus-unknownscanner": "antivirus i pa njohur:",
        "logouttext": "'''Ju keni dalë jashtë.''' \n \n Kini parasysh që disa faqe mund të shfaqen sikur të ishit i identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
        "welcomeuser": "Mirë se vini, $1!",
-       "welcomecreation-msg": "Llogaria juaj u krijua. \nMos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.",
+       "welcomecreation-msg": "Llogaria e jote u krijua. \nMos harro të ndryshosh [[Special:Preferences|{{SITENAME}} parapëlqimet]] e tua.",
        "yourname": "Fusni nofkën tuaj",
        "userlogin-yourname": "Emri i përdoruesit",
-       "userlogin-yourname-ph": "Shtypni emrin tuaj të përdoruesit",
+       "userlogin-yourname-ph": "Fut emrin tënd të përdoruesit",
        "createacct-another-username-ph": "Shtypni emrin e përdoruesit",
        "yourpassword": "Fusni fjalëkalimin tuaj",
        "userlogin-yourpassword": "Fjalëkalimi",
        "nologinlink": "Hapeni",
        "createaccount": "Hap një llogari",
        "gotaccount": "Keni një llogari? '''$1'''.",
-       "gotaccountlink": "Hyni",
-       "userlogin-resetlink": "Keni harruar të dhënat tuaja të identifikimit?",
-       "userlogin-resetpassword-link": "Harruat fjalëkalimin",
-       "userlogin-helplink2": "Ndihmoni me hyrjen në",
+       "gotaccountlink": "Identifikohuni",
+       "userlogin-resetlink": "Ke harruar të dhënat e tua të identifikimit?",
+       "userlogin-resetpassword-link": "Keni harruar fjalëkalimin?",
+       "userlogin-helplink2": "Ndihmë rreth identifikimit",
        "userlogin-loggedin": "Ju tashmë janë të regjistruar si <span class=\"notranslate\" translate=\"asnjë\">{{GJINIA:$1|</span><span class=\"notranslate\" translate=\"asnjë\">$1</span>}}.\nPërdorim formularin më poshtë që të hyni në si një përdorues tjetër.",
        "userlogin-createanother": "Krijo një llogari tjeter",
        "createacct-emailrequired": "Posta elektronike",
        "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 tjeter",
+       "createacct-another-submit": "Krijo një llogari",
        "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.",
        "createacct-benefit-body1": "{{PLURAL:$1|redaktim|redaktime}}",
        "createacct-benefit-body2": "{{PLURAL:$1|faqe|faqe}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|kontribues}} kohët e fundit",
+       "createacct-benefit-body3": "{{PLURAL:$1|kontribuesi i|kontribuesit e}} fundit",
        "badretype": "Fjalëkalimet nuk janë njësoj.",
+       "usernameinprogress": "Një krijim i llogarisë me këtë emër përdoruesi tashmë është në progres.\nTë lutem prit.",
        "userexists": "Emri i përdoruesit që kërkuat është në përdorim. \nZgjidhni një emër tjetër.",
        "loginerror": "Gabim gjatë identifikimit",
        "createacct-error": "krijim gabim llogarie",
        "createaccounterror": "I pamundur krijimi i llogarisë: $1",
-       "nocookiesnew": "Llogaria e përdoruesit u krijua por ju nuk jeni identifikuar ende.\n{{SITENAME}} shfrytëzon \"cookies\" për të identifikuar përdoruesit.\nJu nuk mundësoni lejimin e \"cookies\".\nJu lutemi, mundësojini ato, pastaj identifikohuni me anë të të dhënave tuaja të reja: emri i përdoruesit dhe fjalëkalimi.",
+       "nocookiesnew": "Llogaria e përdoruesit u krijua por ti nuk je identifikuar akoma.\n{{SITENAME}} shfrytëzon \"cookies\" për të identifikuar përdoruesit.\nTi ke çaktivizuar e \"cookies\".\nTë lutem, avktizo ato, pastaj identifikohu emrin e ri të përdoruesit dhe fjalëkalimin.",
        "nocookieslogin": "{{SITENAME}} shfrytëzon \"cookies\" për identifikimin e përdoruesve.\nYou nuk lejoni shfrytëzimin e \"cookies\".\nJu lutemi, lejoni shfrytëzimin e \"cookies\" dhe provojeni përsëri.",
        "nocookiesfornew": "Llogaria e përdoruesit nuk u krijua, pasi ne nuk mund të konfirmojmë burimin e tij.\nSigurohuni që ju lejoni shfrytëzimin e \"cookies\", rifreskoni këtë faqe dhe provojen përsëri.",
        "noname": "Nuk keni dhënë një emër përdoruesi të pranueshëm.",
        "pt-createaccount": "Krijo llogari",
        "pt-userlogout": "Dil",
        "php-mail-error-unknown": "Gabim i panjohur në funksionin e postës PHP ()",
-       "user-mail-no-addy": "Provuat të dërgoni një korrespondencë pa adresë elektronike",
+       "user-mail-no-addy": "Është provuar të dërgohet një korrespondencë pa adresë emaili.",
        "user-mail-no-body": "U përpoqët të dërgonio email me një përmbajtje të shkurtër dhe të paarsyeshme.",
        "changepassword": "Ndërroni fjalëkalimin",
        "resetpass_announce": "Për të përfunduar regjistrimin, ju duhet të vendosni një fjalëkalim të ri.",
        "passwordreset-emailtitle": "Detajet e llogarisë në {{SITENAME}}",
        "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": "Nofka: \n$1\n\nFjalëkalimi i përkohshëm: \n$2",
+       "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-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-text": "Plotësoni këtë formular për të ndryshuar adresën tuaj të postës elektronike. Ju duhet të shkruani fjalëkalimin tuaj për të konfirmuar këtë ndryshim.",
        "changeemail-no-info": "Ju duhet të identifikoheni në mënyrë që të keni të drejtë hyrjeje në këtë faqe.",
-       "changeemail-oldemail": "Posta elektronike e aktuale:",
-       "changeemail-newemail": "Posta elektronike e re:",
+       "changeemail-oldemail": "Adresa aktuale e emailit:",
+       "changeemail-newemail": "Adresa e re e emailit:",
        "changeemail-none": "(asgjë)",
        "changeemail-password": "Fjalëkalimi juaj i {{SITENAME}}:",
        "changeemail-submit": "Ndrysho postën elektronike",
        "changeemail-throttled": "Ju keni bërë shumë tentativa hyrjeje.\nJu lutemi prisni $1 përpara se të provoni sërish.",
+       "changeemail-nochange": "Të lutem shkruaj një tjetër adresë emaili.",
+       "resettokens": "Rivendos tokens",
        "resettokens-token-label": "$1 (vlera aktuale: $2)",
        "bold_sample": "Stil i theksuar i tekstit",
        "bold_tip": "Stil i theksuar i tekstit",
        "accmailtitle": "Fjalëkalimi u dërgua.",
        "accmailtext": "Një fjalëkalim i krijuar në mënyrë të rastësishme për [[User talk:$1|$1]] u dërgua në $2.\n\nFjalëkalimi për këtë llogari mund të ndryshohet në faqen ''[[Special:ChangePassword|ndrysho fjalëkalimin]]'' pasi të jeni identifikuar.",
        "newarticle": "(I ri)",
-       "newarticletext": "Ju keni ndjekur nje lidhje drejt një faqeje që nuk ekziston.\nPër ta krijuar këtë faqe ju mund të shkruani në kutinë e mëposhtme (shih [$1 faqen e ndihmës] për më shumë informacion).\nNëse ju keni mbërritur këtu gabimisht, atëherë klikoni butonin '''pas''' të shfletuesit tuaj.",
+       "newarticletext": "Ti ke ndjekur nje lidhje drejt një faqeje që nuk ekziston.\nPër ta krijuar këtë faqe, fillo të shkruash në kutinë e mëposhtme (shih [$1 faqen e ndihmës] për më shumë informacion).\nNëse ti ke mbërritur këtu gabimisht, atëherë kliko butonin '''pas''' të shfletuesit tënd.",
        "anontalkpagetext": "----'' Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë. \n Prandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\n Në qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:UserLogin/signup|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim .''",
        "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mund [[Special:Search/{{PAGENAME}}|ta kërkoni këtë titull]] në faqe tjera,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} të kërkoni ngjarjet e ngjashme në regjistër],\nose [{{fullurl:{{FULLPAGENAME}}|action=edit}} të redaktoni këtë faqe]</span>.",
        "noarticletext-nopermission": "Për momentin faqja e kërkuar është bosh.\nJu mund të [[Special:Search/{{PAGENAME}}|kërkoni këtë titiull]] në faqet e tjera, ose të <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} këtkoni regjistrat e ngjashëm]</span>, por ju nuk mundeni ta krijoni këtë faqe.",
        "userinvalidcssjstitle": "'''Kujdes:''' Nuk ka pamje të quajtur \"$1\". Vini re se faqet .css dhe .js përdorin titull me gërma të vogla, p.sh. {{ns:user}}:Foo/vector.css, jo {{ns:user}}:Foo/Vector.css.",
        "updated": "(E ndryshuar)",
        "note": "'''Shënim:'''",
-       "previewnote": "'''Vini re! Kjo faqe është vetëm për shqyrtim.'''\nNdryshimet tuaja nuk janë ruajtur ende!",
+       "previewnote": "'''Mos harro që kjo është vetëm një parapamje.'''\nNdryshimet e tua nuk janë ruajtur ende!",
        "continue-editing": "Shko në pjesën për redaktim",
        "previewconflict": "Kjo parapamje reflekton tekstin sipër kutisë së redaktimit siç do të duket kur të kryeni ndryshimin.",
        "session_fail_preview": "'''Ju kërkojmë ndjesë! Redaktimi juaj nuk mund të perpunohej për shkak të humbjes së të dhënave të seancës.'''\nJu lutemi, provojeni përsëri.\nNëse përsëri nuk punon, provoni të [[Special:UserLogout|dilni nga faqja]] dhe të identifikoheni serish.",
        "copyrightwarning": "Ju lutemi, vini re! Të gjitha kontributet në {{SITENAME}} jepen për publikim sipas $2 (shiko $1 për më shumë detaje).\nNëse ju nuk dëshironi që shkrimet tuaja të redaktohen pa mëshirë dhe të shpërndahen sipas dëshirës, atëherë mos i vendosni këtu.<br />\nGjithashtu, ju po na premtoni ne që gjithçka e keni shkruar vetë, ose e keni kopjuar nga një domain publik ose nga burime të tjera  te hapura.\n'''Mos vendosni material të mbrojtur nga e drejta e autorit pa leje!'''",
        "copyrightwarning2": "Ju lutemi, vini re! Të gjitha kontributet në {{SITENAME}} mund të redaktohen, ndryshohen ose hiqen nga përdorues të tjerë  (shiko $1 për më shumë detaje). \nNëse ju nuk dëshironi që shkrimet tuaja të redaktohen pa mëshirë dhe të shpërndahen sipas dëshirës, atëherë mos i vendosni këtu<br />\nGjithashtu, ju po na premtoni ne që gjithçka e keni shkruar vetë, ose e keni kopjuar nga një domain publik ose nga burime të tjera  te hapura.\n'''Mos vendosni material të mbrojtur nga e drejta e autorit pa leje!'''",
        "longpageerror": "'''Gabim: Teksti që shkruat është  {{PLURAL:$1|një kilobajt|$1 kilobajt}} i gjatë, që është mëtepër se maksimumi i lejuar prej  {{PLURAL:$2|një kilobajt|$2 kilobajtësh}} .'''\nNuk mund të ruhet.",
-       "readonlywarning": "'''Kujdes: Baza e të dhënave është mbyllur për mirëmbajtje, prandaj ju nuk do të mund të ruani redaktimin tuaj për momentin.'''\nJu mund të kopjoni tekstin dhe ta ruani për më vonë në një dokument tjetër.'''\n\nAdministruesi që e bllokoi ka dhënë këtë sqarim: $1.",
+       "readonlywarning": "<strong>Kujdes: Baza e të dhënave është mbyllur për mirëmbajtje, prandaj për momentin nuk do të mund të ruash redaktimin tënd.</strong>\nTi mund ta kopjosh/ngjitësh tekstin dhe ta ruash në një dokument tjetër për ta përdorur më vonë .\n\nAdministratori që e bllokoi ka dhënë këtë sqarim: $1.",
        "protectedpagewarning": "'''KUJDES: Kjo faqe është e mbrotjur dhe mund të redaktohet nga përdorues me të drejta administratori.'''\nShënimi i fundit në regjistër është paraqitur më poshtë për reference:",
        "semiprotectedpagewarning": "'''Shënim:''' Kjo faqe është e mbrojtur dhe mund të redaktohet vetëm nga përdorues të regjistruar.\nShënimi i fundit në regjistër është paraqitur më poshtë për reference:",
        "cascadeprotectedwarning": "'''Vini re:''' Kjo faqe është e mbrojtur dhe vetëm përdoruesit me privilegje administrative mund ta redaktojnë pasi është përfshirë në mbrotjen \"ujëvarë\" të {{PLURAL:$1|faqes së|faqeve të}} mëposhtme:",
        "editwarning-warning": "Duke e lënë këtë faqe mund të shkaktojë ju për të humbur të gjitha ndryshimet që keni bërë ju.\nNëse ju jeni regjistruar, ju mund të çaktivizoni këtë paralajmërim në \"{{int:prefs-editing}}\" seksionin e preferencave tuaja.",
        "content-model-text": "tekst i thejshtë",
        "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Objekt bosh",
+       "content-json-empty-array": "Fushë boshe",
        "expensive-parserfunction-warning": "Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.\n\nDuhet të ketë më pakë se $2, {{PLURAL:$2|kërkesë|kërkesa}}, kurse tani {{PLURAL:$1|është $1 kërkesë|janë $1 kërkesa}}.",
        "expensive-parserfunction-category": "Faqe me shumë shprehje të kushtueshmë për analizë gramatikore",
        "post-expand-template-inclusion-warning": "'''Kujdes''': Numri i shablloneve që perfshihen është shumë i madh.\nDisa shabllone nuk do të përfshihen.",
        "viewpagelogs": "Shiko regjistrat për këtë faqe",
        "nohistory": "Nuk ka histori redaktimesh për këtë faqe.",
        "currentrev": "Versioni i tanishëm",
-       "currentrev-asof": "Versioni momental që nga $1",
-       "revisionasof": "Versioni i $1",
+       "currentrev-asof": "Versioni aktual i datës $1",
+       "revisionasof": "Versioni i datës $1",
        "revision-info": "Versioni i datës $1 nga {{GENDER:$6|$2}}$7",
        "previousrevision": "← Version më i vjetër",
        "nextrevision": "Version më i ri →",
        "last": "mëparshme",
        "page_first": "I parë",
        "page_last": "Së fundmi",
-       "histlegend": "Legjenda: (tani) = ndryshimet me versionin e tanishëm,\n(fund) = ndryshimet me versionin e parardhshëm, V = redaktim i vogël",
+       "histlegend": "Legjenda: <strong>({{int:cur}})</strong> = ndryshimet me versionin e tanishëm, <strong>({{int:last}})</strong> = ndryshimet me versionin e parardhshëm, <strong>{{int:minoreditletter}}</strong> = redaktim i vogël.",
        "history-fieldset-title": "Shfleto historikun",
        "history-show-deleted": "Vetëm versionet të grisur",
        "histfirst": "më të vjetër",
        "mergehistory-go": "Trego redaktimet e bashkueshme",
        "mergehistory-submit": "Bashko versionet",
        "mergehistory-empty": "Nuk ka versione të bashkueshme.",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versione}} të [[:$1]] janë bashkuar me sukses në [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versione}} të $1 janë bashkuar me sukses në [[:$2]].",
        "mergehistory-fail": "Nuk munda të bashkoj historikun, ju lutem kontrolloni përzgjedhjen e faqes dhe të kohës.",
        "mergehistory-no-source": "Faqja e burimit $1 nuk ekziston.",
        "mergehistory-no-destination": "Faqja mbledhëse $1 nuk ekzsiton.",
        "prefs-edits": "Numri i redaktimeve:",
        "prefs-skin": "Pamja",
        "skin-preview": "Parapamje",
-       "datedefault": "Parazgjedhje",
+       "datedefault": "E parazgjedhur",
        "prefs-labs": "Karakteristikat laboratorik",
        "prefs-user-pages": "Faqet e përdoruesit",
        "prefs-personal": "Përdoruesi",
-       "prefs-rc": "Ndryshime së fundmi",
+       "prefs-rc": "Ndryshimet e fundit",
        "prefs-watchlist": "Lista mbikqyrëse",
        "prefs-editwatchlist": "Redakto listën mbikqyrëse",
+       "prefs-editwatchlist-clear": "Boshatis listën tënde mbikqyrëse",
        "prefs-watchlist-days": "Numri i ditëve të treguara tek lista mbikqyrëse:",
        "prefs-watchlist-days-max": "Maksimumi $1 ditë",
        "prefs-watchlist-edits": "Numri i redaktimeve të treguara tek lista mbikqyrëse e zgjeruar:",
        "prefs-resetpass": "Ndrysho fjalëkalimin",
        "prefs-changeemail": "Ndrysho postën elektronike",
        "prefs-setemail": "Vendos adresën e postës elektronike",
-       "prefs-email": "Opsionet E-mail",
-       "prefs-rendering": "Dukja",
+       "prefs-email": "Opsionet e emailit",
+       "prefs-rendering": "Pamja",
        "saveprefs": "Ruaj parapëlqimet",
        "restoreprefs": "Rikthe të gjitha të dhënat e mëparshme",
        "prefs-editing": "Redaktimi",
        "recentchangesdays-max": "(maksimum $1 {{PLURAL:$1|dit|ditë}})",
        "recentchangescount": "Numri i redaktimeve për të treguar:",
        "prefs-help-recentchangescount": "Kjo përfshin ndryshimet e freskëta, historikun e faqes dhe regjistrat.",
-       "savedprefs": "Parapëlqimet tuaja janë ruajtur.",
+       "savedprefs": "Parapëlqimet e tua janë ruajtur.",
        "timezonelegend": "Zona kohore:",
        "localtime": "Ora lokale:",
        "timezoneuseserverdefault": "wiki default Përdorimi ( $1 )",
        "allowemail": "Lejo përdoruesit të më dërgojnë email",
        "prefs-searchoptions": "Kërko",
        "prefs-namespaces": "Hapësirat",
-       "default": "parazgjedhje",
+       "default": "e parazgjedhur",
        "prefs-files": "Figura",
        "prefs-custom-css": "CSS i përpunuem",
        "prefs-custom-js": "JavaScripti i përpunuar",
        "prefs-help-gender": "Vendosja e këtij parapëlqimi nuk është e detyrueshme.\nSoftueri përdor vlerat e tij për t'ju adresuar dhe për t'ju përmendur ju te të tjerët duke përdorur gjininë e duhur gramatikore.\nKy informacion do të jetë publik.",
        "email": "Email",
        "prefs-help-realname": "* Emri i vërtetë nuk është i domosdoshëm: Nëse e jipni do të përmendeni si kontribues për punën që ke bërë.",
-       "prefs-help-email": "Posta elektronike është zgjedhore, por ju mundëson që fjalëkalimi i ri të ju dërgohet nëse e harroni atë. Gjithashtu mund të zgjidhni nëse doni të tjerët t'ju shkruajnë ose jo përmes faqes suaj të diskutimit pa patur nevojë të zbulojnë identitetin tuaj.",
+       "prefs-help-email": "Dhënia e adresës së emailit është opsionale, por ju mundëson dërgimin e fjalëkalimit të ri të nëse e harroni atë.",
        "prefs-help-email-others": "Mundeni gjithashtu të zgjidhni të kontaktoheni nga të tjerët përmes faqeve tuaja të diskutimit ose përdoruesit pa e treguar identitetin.",
        "prefs-help-email-required": "Nevojitet e-mail adresa .",
        "prefs-info": "Informatat bazike",
-       "prefs-i18n": "Internacionalizimi",
+       "prefs-i18n": "Gjuha",
        "prefs-signature": "Firma",
-       "prefs-dateformat": "Data i formatit",
-       "prefs-timeoffset": "Kohë të kompensuar",
+       "prefs-dateformat": "Formati i datës",
+       "prefs-timeoffset": "Diferenca kohore",
        "prefs-advancedediting": "Opsionet e avancuar",
        "prefs-editor": "redaktor",
        "prefs-preview": "Parapamje",
-       "prefs-advancedrc": "Opsionet e avancuar",
-       "prefs-advancedrendering": "Opsionet e avancuar",
-       "prefs-advancedsearchoptions": "Opsionet e avancuar",
-       "prefs-advancedwatchlist": "Opsionet e avancuar",
+       "prefs-advancedrc": "Opsione të avancuara",
+       "prefs-advancedrendering": "Opsione të avancuara",
+       "prefs-advancedsearchoptions": "Opsione të avancuara",
+       "prefs-advancedwatchlist": "Opsione të avancuara",
        "prefs-displayrc": "Shfaq opsionet",
        "prefs-displaywatchlist": "Shfaq opsionet",
        "prefs-diffs": "Ndryshimet",
        "email-address-validity-invalid": "Futni një e-mali adresë të vlefshme.",
        "userrights": "Ndrysho privilegjet e përdoruesve",
        "userrights-lookup-user": "Ndrysho grupet e përdoruesit",
-       "userrights-user-editname": "Fusni emrin e përdoruesit:",
+       "userrights-user-editname": "Fut emrin e përdoruesit:",
        "editusergroup": "Redakto grupet e përdoruesve",
        "editinguser": "Duke ndryshuar privilegjet e {{GENDER:$1|përdoruesit|përdorueses}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Anëtarësimi tek grupet",
        "userrights-notallowed": "Ju nuk keni leje për të shtuar ose hequr privilegjet e përdoruesve.",
        "userrights-changeable-col": "Grupe që mund të ndryshoni",
        "userrights-unchangeable-col": "Grupe që s'mund të ndryshoni",
-       "userrights-conflict": "Konflikt në ndryshimin e të drejtave të përdoruesit! Ju lutemi të rishikoni dhe konfirmomi ndryshimet tuaja.",
+       "userrights-conflict": "Konflikt në ndryshimin e të drejtave të përdoruesit! Të lutem të rishiko dhe konfirmo ndryshimet e tua.",
        "group": "Grupi:",
        "group-user": "Përdorues",
        "group-autoconfirmed": "Përdorues të vërtetuar automatikisht",
        "group-bot": "Robot",
        "group-sysop": "Administrues",
        "group-bureaucrat": "Burokrat",
-       "group-suppress": "Kujdestari",
+       "group-suppress": "Shtypësit",
        "group-all": "(të gjitha)",
        "group-user-member": "{{GENDER:$1|përdorues|përdoruese}}",
        "group-autoconfirmed-member": "{{GENDER:$1|përdorues i vërtetuar automatikisht|përdoruese e vërtetuar automatikisht}}",
        "grouppage-bot": "{{ns:project}}:Robotë",
        "grouppage-sysop": "{{ns:project}}:Administruesit",
        "grouppage-bureaucrat": "{{ns:project}}:Burokratë",
-       "grouppage-suppress": "{{ns:project}}:Kujdestari",
+       "grouppage-suppress": "{{ns:project}}:Shtypur",
        "right-read": "Lexo faqe",
        "right-edit": "Redakto faqet",
        "right-createpage": "Hap faqe (që nuk janë faqe diskutimi)",
        "right-unblockself": "Zhblloko veten",
        "right-protect": "Ndrysho nivelin mbrojtës dhe redakto faqet e mbrojtura",
        "right-editprotected": "Redakto faqet e mbrojtura (pa ndryshuar mbrojtjen)",
+       "right-editsemiprotected": "Redakto faqet e mbrojtura, si \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Redakto modelin e përmbajtjes së një faqeje",
        "right-editinterface": "Ndrysho parapamjen e përdoruesit",
        "right-editusercssjs": "Redakto skedat CSS dhe JS të përdoruesve tjerë",
        "right-editusercss": "Redakto skedat CSS të përdoruesve tjerë",
        "right-edituserjs": "Redakto skedat JS të përdoruesve tjerë",
+       "right-editmyusercss": "Redakto CSS - skedat e tua të përdoruesit",
+       "right-editmyuserjs": "Redakto JavaScript - skedat e tua të përdoruesit",
+       "right-viewmywatchlist": "Shfaq listën time mbikqyrëse",
+       "right-editmyoptions": "Redakto parapëlqimet e tua",
        "right-rollback": "Rikthen shpejt redaktimet  e pedaktuesit të fundit",
        "right-markbotedits": "Shëno rikthimet si redaktime robotësh",
        "right-noratelimit": "Mos u prek nga kufizimet e vlerësimit",
        "right-override-export-depth": "Eksoprto faqet duke përfshirë e lidhura deri në një thellësi prej 5",
        "right-sendemail": "Dërgo e-mail tek përdoruesit e tjerë",
        "right-passwordreset": "Shiko e-mail-et e rivendosjes së fjalëkalimit",
+       "right-managechangetags": "Krijoni dhe fshini [[Special:Tags|tags]] nga baza e të dhënave",
+       "right-applychangetags": "Aplikoni [[Special:Tags|tags]] së bashku me ndryshimet",
+       "right-changetags": "Shtoni dhe të largoni në mënyrë arbitrare [[Special:Tags|tags]] në rishikimet individuale dhe regjistrimet e historikut",
        "newuserlogpage": "Regjistri i llogarive",
        "newuserlogpagetext": "Ky është një regjistër i llogarive të fundit që janë hapur",
        "rightslog": "Regjistri i privilegjeve të përdoruesit",
        "action-createpage": "krijo faqe",
        "action-createtalk": "krijo faqe diskutimi",
        "action-createaccount": "krijo këtë llogari përdoruesi",
+       "action-history": "shiko historinë e kësaj faqeje",
        "action-minoredit": "shëno këtë redaktim si të vogël",
        "action-move": "zhvendos këtë faqe",
        "action-move-subpages": "zhvendos këtë faqe dhe nënfaqet e saj",
        "action-move-rootuserpages": "lëviz rrënjët e faqeve të përdoruesve",
+       "action-move-categorypages": "lëviz faqet kategori",
        "action-movefile": "lëviz këtë skedë",
        "action-upload": "ngarko këtë skedë",
        "action-reupload": "rishkruaj këtë skedë ekzistuese",
        "action-block": "blloko përdoruesin",
        "action-protect": "ndrysho nivelin e mbrojtjes për këtë faqe",
        "action-rollback": "ritkthen shpejt redaktimet e përdoruesit të fundit që redaktoi një faqe të veçantë",
-       "action-import": "importo këtë faqe nga një wiki tjetër",
-       "action-importupload": "importo këtë faqe nga një ngarkim i një skedari",
+       "action-import": "importo faqe nga një wiki tjetër",
+       "action-importupload": "Importo faqe nga një ngarkim skede",
        "action-patrol": "shëno redaktimin e tjerëve si të patrulluar",
-       "action-autopatrol": "shëno redaktimet tua si të patrulluara",
+       "action-autopatrol": "shëno redaktimet tua si të patrulluara",
        "action-unwatchedpages": "shiko listën e faqeve të pa vrojtuara",
        "action-mergehistory": "bashko historikun e kësaj faqeje",
        "action-userrights": "ndrysho të gjitha të drejtat e përdoruesit",
        "action-userrights-interwiki": "ndrysho të drejtat e përdoruesve në wiki-t tjera",
        "action-siteadmin": "mbyll ose hap bazën e të dhënave",
        "action-sendemail": "dërgo e-maile",
+       "action-editmywatchlist": "redaktoni listën tuaj mbikqyrëse",
+       "action-viewmywatchlist": "shikoni listën tuaj mbikqyrëse",
        "nchanges": "$1 {{PLURAL:$1|ndryshim|ndryshime}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|që nga vizita e fundit}}",
        "enhancedrc-history": "historia",
        "recentchanges": "Ndryshimet e fundit",
        "recentchanges-legend": "Zgjedhjet e ndryshimeve momentale",
-       "recentchanges-summary": "Ndiqni ndryshime së fundmi tek kjo faqe.",
+       "recentchanges-summary": "Ndiq ndryshimet më të fundit të Wiktionary në këtë faqe.",
        "recentchanges-noresult": "Nuk ka ndryshime gjatë periudhës së dhënë që plotësojnë këto kritere.",
        "recentchanges-feed-description": "Ndjek ndryshimet më të fundit në wiki tek kjo fushë.",
        "recentchanges-label-newpage": "Ky redaktim krijoi një faqe të re",
        "recentchanges-label-plusminus": "Madhësia e faqes ndryshoi me këtë numër bajtësh",
        "recentchanges-legend-heading": "'''Legjenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (shiko gjithashtu [[Special:NewPages|listën e faqeve të reja]])",
-       "rcnotefrom": "Më poshtë janë ndryshime së fundmi nga <b>$2</b> (treguar deri në <b>$1</b>).",
+       "rcnotefrom": "Më poshtë {{PLURAL:$5|është shfaqur ndryshimi|janë shfaqur ndryshimet}} që nga <strong>$3, $4</strong> (deri në <strong>$1</strong>).",
        "rclistfrom": "Tregon ndryshime së fundmi duke filluar nga $3 $2",
        "rcshowhideminor": "$1 redaktimet e vogla",
        "rcshowhideminor-show": "Shfaq",
        "rcshowhidebots-show": "Shfaq",
        "rcshowhidebots-hide": "Fshih",
        "rcshowhideliu": "$1 përdorues të regjistruar",
+       "rcshowhideliu-show": "Shfaq",
        "rcshowhideliu-hide": "Fshih",
        "rcshowhideanons": "$1 përdoruesit anonim",
        "rcshowhideanons-show": "Shfaq",
        "rcshowhideanons-hide": "Fshih",
        "rcshowhidepatr": "$1 redaktime të patrulluara",
+       "rcshowhidepatr-show": "Shfaq",
+       "rcshowhidepatr-hide": "Fshih",
        "rcshowhidemine": "$1 redaktimet e mia",
        "rcshowhidemine-show": "Shfaq",
        "rcshowhidemine-hide": "Fshih",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 duke u mbikqyrur nga {{PLURAL:$1|përdorues|përdorues}}]",
        "rc_categories": "Kufizimi i kategorive (të ndara me \"|\")",
-       "rc_categories_any": "Të gjitha",
+       "rc_categories_any": "Ndonjë nga të zgjedhurat",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtë}} pas ndryshimit",
        "newsectionsummary": "/* $1 */ seksion i ri",
        "rc-enhanced-expand": "Trego detajet",
        "reuploaddesc": "Kthehu tek formulari i dhënies.",
        "upload-tryagain": "Dërgo përshkrimin e modifikuar të skedarit",
        "uploadnologin": "Nuk keni hyrë brënda",
-       "uploadnologintext": "Duhet të keni [[Special:UserLogin|hyrë brenda]] për të dhënë skeda.",
+       "uploadnologintext": "Ju lutem $1 ngarkoni skedat.",
        "upload_directory_missing": "Direktoriumi ($1) i ngarkimit po mungon dhe nuk është arritur që të krijohet nga webserveri.",
        "upload_directory_read_only": "Skedari i ngarkimit ($1) nuk mund të shkruhet nga shërbyesi.",
        "uploaderror": "Gabim dhënie",
        "upload-too-many-redirects": "Adresa URL përmbante shumë përcjellime.",
        "upload-http-error": "Ndodhi një gabim HTTP: $1",
        "upload-copy-upload-invalid-domain": "Ngarkesat e kopjimit nuk janë në dispozicion nga ky domein.",
+       "upload-dialog-title": "Ngarko skedën",
+       "upload-dialog-button-cancel": "Anulo",
+       "upload-dialog-button-done": "Mbyll",
+       "upload-dialog-button-save": "Ruaj",
+       "upload-dialog-button-upload": "Ngarko",
+       "upload-process-error": "Një gabim ka ndodhur",
        "backend-fail-stream": "Nuk mund të kalojë skedën $1.",
        "backend-fail-backup": "Nuk mund të rezervojë skedën $1.",
        "backend-fail-notexists": "Skeda $1 nuk ekziston.",
        "uploadstash-summary": "Kjo faqe ofron qasje tek skedat të cilat janë ngarkuar (ose janë në proçes ngarkimi) por që nuk janë publikuat akoma në wiki. Këto skeda nuk janë të dukshme për këdo përveç për përdoruesin që i ka ngarkuar ato.",
        "uploadstash-clear": "Spastro skedat e fshehura",
        "uploadstash-nofiles": "Ju nuk keni skeda të fshehura.",
-       "uploadstash-badtoken": "Kryerja e këtij veprimi ishte e pasuksesshme, ndoshta sepse kredencialet redaktuese tuaja kanë skaduar. Provoni përsëri.",
+       "uploadstash-badtoken": "Kryerja e këtij veprimi ishte e pasuksesshme, ndoshta sepse kredencialet e tua redaktuese kanë skaduar. Provo përsëri.",
        "uploadstash-errclear": "Spastrimi i skedave ishte i pasuksesshëm.",
        "uploadstash-refresh": "Rifreskoni listën e skedave",
        "invalid-chunk-offset": "Kompensim cope i pavlefshëm",
        "img-auth-nologinnWL": "Ju nuk jeni i regjistruar dhe \"$1\" nuk është në listën e bardhë.",
        "img-auth-nofile": "Skeda \"$1\" nuk ekziston.",
        "img-auth-isdir": "Ju po përpiqeni të hyni në një drejtori \"$1\".\nVetëm  qasja e skedës është e lejuar.",
-       "img-auth-streaming": "Duke rrejdhur \"$1\"",
+       "img-auth-streaming": "Duke ngarkuar \"$1\"",
        "img-auth-public": "Funksioni i img_auth.php është për të larguar skedat nga një wiki privat.\nKy wiki është i konfiguruar si një wiki publik.\nPër siguri optimale, img_auth.php është çaktivizuar.",
        "img-auth-noread": "Përdoruesi nuk ka qasje për të lexuar \"$1\".",
        "http-invalid-url": "Adresë URL e pavlefshme: $1",
        "listfiles_size": "Madhësia (bytes)",
        "listfiles_description": "Përshkrimi",
        "listfiles_count": "Versionet",
+       "listfiles-latestversion": "Versioni aktual",
+       "listfiles-latestversion-yes": "Po",
+       "listfiles-latestversion-no": "Jo",
        "file-anchor-link": "Figura",
        "filehist": "Historiku i dosjes",
        "filehist-help": "Shtypni një datë/kohë për ta parë skedën ashtu si dukej në atë kohë.",
        "filerevert-legend": "Rikthe skedën",
        "filerevert-intro": "Po ktheni '''[[Media:$1|$1]]''' tek [versioni $4 i $3, $2].",
        "filerevert-comment": "Arsyeja:",
-       "filerevert-defaultcomment": "U rikthye tek versioni i $2, $1",
+       "filerevert-defaultcomment": "Rikthyer në versionin e datës $2, ora $1 ($3)",
        "filerevert-submit": "Riktheje",
        "filerevert-success": "'''[[Media:$1|$1]]''' është kthyer tek [versioni $4 i $3, $2].",
        "filerevert-badversion": "Nuk ka version vendor tjetër të kësaj skede në kohën e dhënë.",
        "filedelete-comment": "Arsyeja:",
        "filedelete-submit": "Grise",
        "filedelete-success": "'''$1''' është grisur.",
-       "filedelete-success-old": "Versioni i '''[[Media:$1|$1]]''' që nga $3, $2 është grisur.",
+       "filedelete-success-old": "Versioni i '''[[Media:$1|$1]]''' i datës $3, ora $2 është fshirë.",
        "filedelete-nofile": "'''$1''' nuk ekziston.",
        "filedelete-nofile-old": "Nuk ka version të arkivuar të '''$1''' me të dhënat e kërkuara.",
        "filedelete-otherreason": "Arsye tjetër / shtesë:",
        "nopagetext": "Faqja e kërkuar nuk ekziston.",
        "pager-newer-n": "{{PLURAL:$1|1 më i reja|$1 më të reja}}",
        "pager-older-n": "{{PLURAL:$1|1 më i vjetër|$1 më të vjetra}}",
-       "suppress": "Kujdestari",
+       "suppress": "Shtypur",
        "querypage-disabled": "Kjo faqe speciale është çaktivizuar për arsye të performancës.",
        "apihelp-no-such-module": "Moduli \"$1\" nuk u gjet.",
        "booksources": "Burime librash",
        "log-title-wildcard": "Kërko tituj që fillojnë me këtë tekst",
        "showhideselectedlogentries": "Paraqit/fshih shënimet e përzgjedhura të regjistruara.",
        "allpages": "Të gjitha faqet",
-       "nextpage": "Faqja më pas ($1)",
-       "prevpage": "Faqja më parë ($1)",
+       "nextpage": "Faqja tjetër ($1)",
+       "prevpage": "Faqja e mëparshme ($1)",
        "allpagesfrom": "Trego faqet duke filluar nga:",
        "allpagesto": "Shfaq faqet që mbarojnë në:",
        "allarticles": "Të gjithë artikujt",
        "mailnologin": "S'ka adresë dërgimi",
        "mailnologintext": "Duhet të keni [[Special:UserLogin|hyrë brenda]] dhe të keni një adresë të saktë në [[Special:Preferences|parapëlqimet]] tuaja për tu dërguar email përdoruesve të tjerë.",
        "emailuser": "Email {{GENDER:{{PAGENAME}}|përdoruesit|përdorueses}}",
+       "emailuser-title-notarget": "Email për përdoruesin",
        "emailpagetext": "Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky përdorues.\nAdresa e email-it që shkruat tek [[Special:Preferences|preferencat tuaja]] do të duket si \"Nga\" adresa e email-it, pra marrësi do të ketë mundësinë t'ju përgjigjet direkt.",
-       "defemailsubject": "{{SITENAME}} posta elektronike nga përdoruesi \"$1\"",
+       "defemailsubject": "{{SITENAME}} emaili nga përdoruesi \"$1\"",
        "usermaildisabled": "Email-i i përdoruesit çaktivizua",
        "usermaildisabledtext": "Ju nuk mund të dërgoni e-mail tek përdoruesit e tjerë në këtë wiki",
        "noemailtitle": "S'ka adresë email-i",
        "wlshowlast": "Trego $1 orët $2 ditët",
        "watchlist-options": "Mundësitë e listës mbikqyrëse",
        "watching": "Duke mbikqyrur...",
-       "unwatching": "Duke çmbikqyrur...",
+       "unwatching": "Mos e mbikqyr më...",
        "watcherrortext": "Është paraqitur një gabim përderisa ndryshuat parametrat e listës suaj mbikqyrëse për \"$1\".",
        "enotif_reset": "Shëno të gjitha faqet e vizituara",
        "enotif_impersonal_salutation": "Përdorues i {{SITENAME}}",
        "delete-warning-toobig": "Kjo faqe ka një historik të madh redaktimesh, më shumë se $1 {{PLURAL:$1|version|versione}}.\nGrisja e saj mund të ndërpresë operacionet e bazës së të dhënave të {{SITENAME}};\nvazhdoni me kujdes.",
        "rollback": "Riktheji mbrapsh redaktimet",
        "rollbacklink": "riktheje",
-       "rollbacklinkcount": "riktheni $1 {{PLURAL:$1|ndryshim|ndryshime}}",
+       "rollbacklinkcount": "rikthe $1 {{PLURAL:$1|ndryshim|ndryshime}}",
        "rollbacklinkcount-morethan": "riktheni më tepër $1 {{PLURAL:$1|ndryshim|ndryshime}}",
        "rollbackfailed": "Rikthimi dështoi",
        "cantrollback": "Redaktimi nuk mund të kthehej;\nredaktori i fundit është i vetmi autor i këtij artikulli.",
        "rollback-success": "Ndryshimet e $1 u kthyen mbrapsh; artikulli ndodhet tek verzioni i $2.",
        "sessionfailure-title": "Dështim sesioni",
        "sessionfailure": "Duket se ka një problem me seancën tuaj hyrëse; ky veprim është anuluar për tu mbrojtur nga ndonjë veprim dashakeq kundrejt shfletimit tuaj. Ju lutemi kthehuni mbrapsh, rifreskoni faqen prej nga erdhët dhe provojeni përsëri veprimin.",
+       "changecontentmodel-title-label": "Titulli i faqes",
        "changecontentmodel-reason-label": "Arsyeja:",
        "protectlogpage": "Regjistri i mbrojtjeve",
        "protectlogtext": "Më poshtë është lista e kyçjeve dhe çkyçjeve të faqes.\nShih listën e [[Special:ProtectedPages|faqeve të mbrojtura]] nga lista e mbrojtjeve të faqeve tani në veprim.",
        "protect-existing-expiry": "Koha ekzistuese e skadimit: $3, $2",
        "protect-otherreason": "Arsye tjera/shtesë:",
        "protect-otherreason-op": "Arsyeja tjetër",
-       "protect-dropdown": "*Arsye të zakonshme të mbrojtjes\n**Vandalizëm i tepërt\n**Spam i tepërt\n**Paralajmërim i redaktimeve joprodukive\n**Faqe e trafikut të lartë",
+       "protect-dropdown": "*Arsye të përgjithshme të mbrojtjes\n**Vandalizëm i tepërt\n**Spam i tepërt\n**Paralajmërim i redaktimeve joprodukive\n**Faqe me trafik të lartë",
        "protect-edit-reasonlist": "Redakto arsyet e mbrojtjes",
        "protect-expiry-options": "1 Orë:1 hour,1 Ditë:1 day,1 Javë:1 week,2 Javë:2 weeks,1 Muaj:1 month,3 Muaj:3 months,6 Muaj:6 months,1 Vjet:1 year,Pa kufi:infinite",
        "restriction-type": "Lejet:",
        "ipbreason-dropdown": "*Arsye të zakonshme të bllokimit\n** Vendosja e të dhënave të rreme\n** Largimi i përmbajtjeve të faqeve\n** Vendosja e lidhjeve spam \n** Vendosja e të dhënave të pakuptimta\n** Sjellje arrogante dhe/ose ngacmuese\n** Përdorimi i më shumë llogarive\n** Nofkë e papranueshme",
        "ipb-hardblock": "Parandalo përdoruesit e kyçur për të redaktuar nga kjo IP adresë",
        "ipbcreateaccount": "Mbroje krijimin e llogarive",
-       "ipbemailban": "Pa mundëso dërgimin  e porosive elektronike nga përdoruesit",
+       "ipbemailban": "Pamundëso përdoruesit dërgimin e emailit",
        "ipbenableautoblock": "Blloko edhe IP adresën që ka përdor ky përdorues deri tash, si dhe të gjitha subadresat nga të cilat mundohet ky përdorues të editoj.",
        "ipbsubmit": "Blloko këtë përdorues",
        "ipbother": "Kohë tjetër",
        "blocklog-showsuppresslog": "Ky përdorues ka qenë i bllokuar dhe i fshehur më parë.\nRegjistri i bllokimeve është poshtë për referncë:",
        "blocklogentry": "bllokoi [[$1]] për një kohë prej: $2 $3",
        "reblock-logentry": "ndryshoi parametrat e bllokimit për [[$1]] me një kohë prej $2 $3",
-       "blocklogtext": "Ky është një regjistër i veprimeve bllokuese dhe zhbllokuese të përdoruesit.\n\nAdresat I të bllokuara automatikisht nuk janë të paraqitura. \n\nShikoni dhe [[Special:BlockList|listën e të bllokuarve]] për një listë të bllokimeve dhe ndalimeve vepruese të tanishme.",
+       "blocklogtext": "Ky është një regjistër i veprimeve bllokuese dhe zhbllokuese të përdoruesit.\n\nAdresat e IP-ve të bllokuara automatikisht nuk janë të paraqitura. \n\nShih [[Special:BlockList|listën e IP-ve të bllokuara]] të bllokimeve të tanishme.",
        "unblocklogentry": "çbllokoi \"$1\"",
        "block-log-flags-anononly": "vetëm anonimët",
        "block-log-flags-nocreate": "krijimi i llogarive është pamundësuar",
        "ipb_already_blocked": "\"$1\" është i bllokuar",
        "ipb-needreblock": "$1 është i bllokuar.\nDëshironi t'i ndryshoni parametrat?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Bllokim tjetër|Bllokime të tjera}}",
-       "unblock-hideuser": "Ju nuk mund të zhbllokoni këtë përdorues, përderisa nofka e tij është e fshehur.",
-       "ipb_cant_unblock": "Gabim: Bllokimi ID $1 nuk u gjet.\n\nMund të jetë zhbllokuar deri tani.",
+       "unblock-hideuser": "Nuk mund ta zhbllokosh këtë përdorues, përderisa nofka e tij është e fshehur.",
+       "ipb_cant_unblock": "Gabim: ID $1 e bllokuar nuk u gjet. Mund të jetë zhbllokuar deri tani.",
        "ipb_blocked_as_range": "Gabim: Adresa IP $1 nuk është bllokuar direkt dhe nuk mund të zhbllokohet.\nAjo është, megjithatë, e bllokuar si pjesë e rangut $2, që nuk mund të zhbllokohet.",
        "ip_range_invalid": "Shtrirje IP gabim.",
        "ip_range_toolarge": "Radhitja e bllokimeve më të mëdha se /$1 nuk lejohet.",
        "sorbsreason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL.",
        "sorbs_create_account_reason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL që përdoret nga {{SITENAME}}. Nuk ju lejohet të hapni një llogari.",
        "cant-see-hidden-user": "Përdoruesi që po përpiqeni të bllokoni është i bllokuar dhe i fshehur.\nPërderisa ju nuk keni të drejtën e fshehjes së përdoruesve, ju nuk mund të shikoni ose redaktoni bllokimet e përdoruesit.",
-       "ipbblocked": "Ju nuk mund të bllokoni ose zhbllokoni përdoruesit e tjerë, sepse jeni për vete i bllokuar",
+       "ipbblocked": "Ti nuk mund t'i bllokosh ose zhbllokosh përdoruesit e tjerë, sepse je vet i bllokuar",
        "ipbnounblockself": "Ju nuk mund të zhbllokoni veten tuaj",
        "lockdb": "Blloko regjistrin",
        "unlockdb": "Çblloko regjistrin",
        "lockdbsuccesssub": "Regjistri u bllokua me sukses",
        "unlockdbsuccesssub": "Regjistri u zhbllokua me sukses",
        "lockdbsuccesstext": "Regjistri është bllokuar.<br />\nKujtohuni ta [[Special:UnlockDB|çbllokoni]] pasi të keni mbaruar mirëmbajtjen.",
-       "unlockdbsuccesstext": "Regjistri i {{SITENAME}} është zhbllokuar.",
+       "unlockdbsuccesstext": "Baza e të dhënave {{SITENAME}} është zhbllokuar.",
        "lockfilenotwritable": "Skeda për bllokimin e regjistrit s'mund të shkruhet.\nShërbyesi i rrjetit duhet të jetë në gjendje të shkruaj këtë skedë për të bllokuar ose çbllokuar regjistrin.",
        "databasenotlocked": "Regjistri nuk është bllokuar.",
        "lockedbyandtime": "(nga {{GENDER:$1|$1}} më $2 në $3)",
        "movepagetext": "Duke përdorur formularin e mëposhtëm do të ndërroni titullin e një faqeje, duke zhvendosur gjithë historkun e saj tek titulli i ri.\nTitulli i vjetër do të bëhet një faqe ridrejtuese tek titulli i ri.\nLidhjet tek faqja e vjetër nuk do të ndryshohen;\nduhet të kontrolloni mirëmbajtjen për përcjellime të [[Special:DoubleRedirects|dyfishta]] ose të [[Special:BrokenRedirects|prishura]].\nKeni përgjegjësinë për tu siguruar që lidhjet të vazhdojnë të jenë të sakta.\n\nKini parasysh se kjo faqe '''nuk''' do të zhvendoset n.q.s. ekziston një faqe me titullin e ri, përveçse nëse ajo është bosh ose një përcjellim dhe nuk ka historik të redaktimeve.\nKjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.s. keni bërë një gabim, dhe s'mund ta prishësh një faqe që ekziston.\n\n'''KUJDES!'''\nKy mund të jetë një ndryshim i madh dhe i papritur për një faqe të shumë-frekuentuar; ju lutem, kini kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
        "movepagetext-noredirectfixer": "Duke përdorur formularin e mëposhtëm do të ndërroni titullin e një faqeje, duke zhvendosur gjithë historinë përkatëse tek titulli i ri.\nTitulli i vjetër do të bëhet një faqe përcjellëse tek titulli i ri.\nLidhjet tek faqja e vjetër nuk do të ndryshohen;\nduhet të kontrolloni mirëmbajtjen për përcjellime të [[Special:DoubleRedirects|dyfishta]] ose të [[Special:BrokenRedirects|prishura]].\nKeni përgjegjësinë për tu siguruar që lidhjet të vazhdojnë të jenë të sakta.\n\nVini re se kjo faqe '''nuk''' do të zhvendoset n.q.s. ekziston një faqe me titullin e ri, përveçse kur ajo të jetë bosh ose një përcjellim dhe të mos ketë një histori të vjetër.\nKjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.s. keni bërë një gabim, dhe s'mund ta prishësh një faqe që ekziston.\n\n'''KUJDES!'''\nKy mund të jetë një ndryshim i madh dhe gjëra të papritura mund të ndodhin për një faqe të shumë-frekuentuar; ju lutem, kini kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
        "movepagetalktext": "Faqja a bashkangjitur e diskutimit, n.q.s. ekziston, do të zhvendoset automatikisht '''përveçse''' kur:\n*Zhvendosni një faqe midis hapësirave të ndryshme,\n*Një faqe diskutimi jo-boshe ekziston nën titullin e ri, ose\n*Nuk zgjidhni kutinë më poshtë.\n\nNë ato raste, duhet ta zhvendosni ose përpuqni faqen vetë n.q.s. dëshironi.",
-       "movearticle": "Zhvendose faqen",
        "moveuserpage-warning": "'''Kujdes:''' Ju po zhvendosni një faqe përdoruesi. Ju lutemi, kujtoni se vetëm faqja do të zhvendoset dhe përdoruesi ''nuk'' do të ndryshojë emrin.",
        "movenologintext": "Duhet të keni hapur një llogari dhe të keni [[Special:UserLogin|hyrë brenda]] për të zhvendosur një faqe.",
        "movenotallowed": "Nuk ju lejohet të zhvendosni faqe.",
        "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, grise faqen",
+       "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]]\"",
        "selfmove": "Nuk munda ta zhvendos faqen sepse titulli i ri është i njëjtë me të vjetrin.",
        "immobile-source-namespace": "Nuk mund të lëvizet faqja tek \"$1\"",
        "move-leave-redirect": "Lini një përcjellim prapa",
        "protectedpagemovewarning": "'''Kujdes''': Kjo faqe është mbrojtur, kështu që vetëm përdoruesit me privilegje administratorësh mund ta zhvendosin atë.\nVeprimi i fundit mbi këtë faqe është poshtë për referncë:",
        "semiprotectedpagemovewarning": "'''Kujdes''': Kjo faqe është mbrojtur, kështu që vetëm përdoruesit e regjistruar mund ta zhvendosin atë.\nVeprimi i fundit mbi këtë faqe është poshtë për referncë:",
-       "move-over-sharedrepo": "== Skeda ekziston ==\n[[:$1]] ekziston në një magazinë të përbashkët. Zhvendosja e një skede tek ky titull do të prishë skedën e përbashkët.",
+       "move-over-sharedrepo": "== Skeda ekziston ==\n[[:$1]] ekziston në një magazinë të përbashkët. Zhvendosja e një skede tek ky titull do të mbishkruajë skedën e përbashkët.",
        "file-exists-sharedrepo": "Emri i zgjedhur i skedës është në përdorim në një magazinë të përbashkët.\nJu lutemi zgjidhni në emët tjetër.",
        "export": "Eksportoni faqe",
        "exporttext": "Mund të eksportoni tekstin dhe historinë e redaktimit e një faqeje ose disa faqesh të mbështjesha në XML; kjo mund të importohet në një wiki tjetër që përdor softuerin MediaWiki (tani për tani, ky opsion nuk është përfshirë tek {{SITENAME}}).\n\nPër të eksportuar faqe, thjesht shtypni një emër për çdo rresht, ose krijoni lidhje të tipit [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] si [[{{MediaWiki:Mainpage}}]].",
        "allmessages-prefix": "Filtroni nga parashtesat:",
        "allmessages-language": "Gjuha:",
        "allmessages-filter-submit": "Shko",
+       "allmessages-filter-translate": "Përkthe",
        "thumbnail-more": "Zmadho",
        "filemissing": "Mungon skeda",
        "thumbnail_error": "Gabim gjatë krijimit të figurës përmbledhëse: $1",
+       "thumbnail_error_remote": "Mesazh gabimi nga $1:\n$2",
        "djvu_page_error": "Faqja DjVu jashtë renditjes",
        "djvu_no_xml": "Nuk mund të gjendet XML për skedën DjVu",
        "thumbnail-temp-create": "Nuk mund të krijohej parapamja e përkohshme e skedës",
        "import": "Importoni faqe",
        "importinterwiki": "Import ndër-wiki",
        "import-interwiki-text": "Zgjidhni një wiki dhe titull faqeje për të importuar.\nDatat e versioneve dhe emrat e redaktuesve do të ruhen.\nTë gjitha veprimet e importit transwiki janë të regjistruara tek [[Special:Log/import|registri i importimeve]].",
+       "import-interwiki-sourcewiki": "Burimi wiki:",
+       "import-interwiki-sourcepage": "Burimi i faqes:",
        "import-interwiki-history": "Kopjo të gjitha versionet e historisë për këtë faqe",
        "import-interwiki-templates": "Përfshini të gjitha stampat",
        "import-interwiki-submit": "Importo",
        "javascripttest-pagetext-frameworks": "Ju lutemi zgjidhni njërën nga kornizat vijuese punuese të testimit: $1",
        "javascripttest-pagetext-skins": "Zgjidhni një mostër për t'i kryer testimet:",
        "javascripttest-qunit-intro": "Shiko [$1 dokumentacionin e testimit] në mediawiki.org.",
-       "tooltip-pt-userpage": "Faqja juaj e përdoruesit",
+       "tooltip-pt-userpage": "Faqja jote e përdoruesit",
        "tooltip-pt-anonuserpage": "Faqja e përdoruesve anonim nga kjo adresë IP",
-       "tooltip-pt-mytalk": "Faqja juaj e diskutimeve",
+       "tooltip-pt-mytalk": "Faqja jote e diskutimeve",
        "tooltip-pt-anontalk": "Faqja e diskutimeve të përdoruesve anonim për këtë adresë IP",
-       "tooltip-pt-preferences": "Parapëlqimet tuaja",
+       "tooltip-pt-preferences": "Parapëlqimet e tua",
        "tooltip-pt-watchlist": "Lista e faqeve nën mbikqyrjen tuaj.",
-       "tooltip-pt-mycontris": "Lista e kontributeve tuaja",
+       "tooltip-pt-mycontris": "Lista e kontributeve tua",
        "tooltip-pt-login": "Identifikimi nuk është i detyrueshëm, megjithatë ne jua rekomandojmë.",
        "tooltip-pt-logout": "Dalje",
        "tooltip-pt-createaccount": "Ju rekomandojmë të krijoni një llogari dhe të kyqeni; megjithatë,  nuk është e detyrueshme",
        "tooltip-search-go": "Shko tek faqja me këtë emër nëse ekziston",
        "tooltip-search-fulltext": "Kërko faqet për këtë tekst",
        "tooltip-p-logo": "Vizito faqen kryesore",
-       "tooltip-n-mainpage": "Vizitoni Faqen kryesore",
+       "tooltip-n-mainpage": "Vizito faqen kryesore",
        "tooltip-n-mainpage-description": "Vizito faqen kryesore",
        "tooltip-n-portal": "Rreth projektit, çfarë mund të bëni dhe ku gjenden gjërat",
        "tooltip-n-currentevents": "Kërko informacion të mëparshëm për ngjarjet aktuale.",
        "tooltip-t-print": "Version i shtypshëm i kësaj faqeje",
        "tooltip-t-permalink": "Lidhja e përhershme tek ky version i faqes",
        "tooltip-ca-nstab-main": "Shikoni përmbajtjen e atikullit.",
-       "tooltip-ca-nstab-user": "Shikoni faqen e përdoruesit",
-       "tooltip-ca-nstab-media": "Shikoni faqen e skedës",
+       "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-project": "Shikoni faqen e projektit",
+       "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",
        "tooltip-ca-nstab-template": "Shikoni stampën",
        "spam_deleting": "Të gjitha inspektimet përmbanin lidhje në $1, duke fshirë",
        "simpleantispam-label": "Kontrolli anti-spam.\n<strong>Mos</strong> e plotëso këtë!",
        "pageinfo-title": "Informacion për \" $1 \"",
+       "pageinfo-header-basic": "Informatat bazike",
        "pageinfo-header-edits": "Historiku i redaktimeve",
+       "pageinfo-header-restrictions": "Mbrojtja e faqes",
+       "pageinfo-header-properties": "Tiparet e faqes",
+       "pageinfo-display-title": "Shfaq titullin",
+       "pageinfo-length": "Gjatësia e faqes (në bajt)",
+       "pageinfo-article-id": "ID-ja e faqes",
+       "pageinfo-language": "Gjuha e përmbajtjes së faqes",
        "pageinfo-watchers": "Numri i mbikqyrësve të faqes",
+       "pageinfo-firstuser": "Krijuesi i faqes",
+       "pageinfo-firsttime": "Data e krijimit të faqes",
+       "pageinfo-lastuser": "Redaktori i fundit",
+       "pageinfo-lasttime": "Data e redaktimit të fundit",
        "pageinfo-edits": "Numri total i redaktimeve",
        "pageinfo-authors": "Numri i përgjithshëm i autorëve të veçantë",
+       "pageinfo-recent-edits": "Numri i redaktimeve më të fundit (gjatë $1 ditëve të kaluara)",
        "pageinfo-toolboxlink": "Informacioni i faqes",
+       "pageinfo-redirectsto-info": "info",
+       "pageinfo-contentpage": "Llogaritet si një përmbajtje e faqes",
+       "pageinfo-contentpage-yes": "Po",
+       "pageinfo-protect-cascading-yes": "Po",
+       "pageinfo-category-info": "Informacioni i kategorisë",
        "pageinfo-category-total": "Numri i përgjithshëm i anëtarëve",
+       "pageinfo-category-pages": "Numri i faqeve",
+       "pageinfo-category-subcats": "Numri i nënkategorive",
+       "pageinfo-category-files": "Numri i skedave",
        "markaspatrolleddiff": "Shënoje si të patrulluar",
        "markaspatrolledtext": "Shënoje këtë artikull të patrulluar",
        "markedaspatrolled": "Shënoje të patrulluar",
        "filedeleteerror-short": "Gabim gjatë grisjes së skedës: $1",
        "filedeleteerror-long": "U hasën gabime gjatë grisjes së skedës:\n\n$1",
        "filedelete-missing": "Skeda \"$1\" nuk mund të griset pasi nuk ekziston.",
-       "filedelete-old-unregistered": "Versioni i skedës që keni zgjedhur \"$1\" nuk ndodhet në regjistër.",
+       "filedelete-old-unregistered": "Versioni i skedës së zgjedhur \"$1\" nuk ndodhet në bazën e të dhënave.",
        "filedelete-current-unregistered": "Skeda e zgjedhur \"$1\" nuk ndodhet në regjistër.",
        "filedelete-archive-read-only": "Skedari i arkivimit \"$1\" nuk mund të ndryshohet nga shëbyesi.",
        "previousdiff": "← Ndryshimi më para",
        "hours": "{{PLURAL:$1|$1 orë|$1 orë}}",
        "days": "{{PLURAL:$1|$1 ditë|$1 ditë}}",
        "ago": "$1 më parë",
+       "just-now": "mu tani",
+       "hours-ago": "$1 {{PLURAL:$1|orë|orë}} më parë",
+       "minutes-ago": "$1 {{PLURAL:$1|minutë|minuta}} më parë",
+       "seconds-ago": "$1 {{PLURAL:$1|sekond|sekonda}} më parë",
        "monday-at": "Të hënën në $1",
        "tuesday-at": "Të martën në $1",
        "wednesday-at": "Të mërkurën në $1",
        "exif-compressedbitsperpixel": "Lloji i ngjeshjes së figurës",
        "exif-pixelydimension": "Gjerësia Image",
        "exif-pixelxdimension": "lartësi Image",
-       "exif-usercomment": "Vërejtjet e përdoruesit",
+       "exif-usercomment": "Komentet e përdoruesit",
        "exif-relatedsoundfile": "Skeda audio shoqëruese",
        "exif-datetimeoriginal": "Data dhe koha e prodhimit të të dhënave",
        "exif-datetimedigitized": "Data dhe ora e digjitalizimit",
        "exif-preferredattributionname": "Kur ri-shfrytëzoni këtë punë, ju lutem atribuoni",
        "exif-pngfilecomment": "Komenti i PGN dokumentit",
        "exif-disclaimer": "Shfajësimet",
-       "exif-contentwarning": "Paralajmërim i përmbajtjes",
+       "exif-contentwarning": "Paralajmërim rreth përmbajtjes",
        "exif-giffilecomment": "Komenti i GIF dokumentit",
        "exif-intellectualgenre": "Lloji i artikullit",
        "exif-subjectnewscode": "Kodi i subjektit",
        "exif-gpslongitude-w": "Gjatësi perëndimore",
        "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|metër|metra}} mbi nivelin detar",
        "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|metër|metra}} nën nivelin detar",
-       "exif-gpsstatus-a": "Duke bërë matje",
+       "exif-gpsstatus-a": "Matja është në progres",
        "exif-gpsstatus-v": "Matja e nderveprimit",
        "exif-gpsmeasuremode-2": "matje në 2 madhësi",
        "exif-gpsmeasuremode-3": "matje në 3 madhësi",
        "confirm-watch-top": "Shto këtë faqe në listën mbikqyrëse tuajen?",
        "confirm-unwatch-button": "Në rregull",
        "confirm-unwatch-top": "Largo këtë faqe nga lista juaj mbikqyrëse ?",
-       "imgmultipageprev": "← faqja e kaluar",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← faqja e mëparshme",
        "imgmultipagenext": "faqja tjetër →",
        "imgmultigo": "Shko!",
        "imgmultigoto": "Shko tek faqja $1",
+       "img-lang-default": "(gjuha e parazgjedhur)",
        "ascending_abbrev": "ngritje",
        "descending_abbrev": "zbritje",
-       "table_pager_next": "Faqja më pas",
-       "table_pager_prev": "Faqja më parë",
+       "table_pager_next": "Faqja tjetër",
+       "table_pager_prev": "Faqja e mëparshme",
        "table_pager_first": "Faqja e parë",
        "table_pager_last": "Faqja e fundit",
        "table_pager_limit": "Trego $1 rreshta për faqe",
        "specialpages-group-maintenance": "Përmbledhje mirëmbajtjeje",
        "specialpages-group-other": "Faqe speciale të tjera",
        "specialpages-group-login": "Hyrje dhe hapje llogarie",
-       "specialpages-group-changes": "Ndryshime së fundmi dhe regjistra",
+       "specialpages-group-changes": "Ndryshimet më të fundit dhe regjistrat",
        "specialpages-group-media": "Përmbledhje media dhe ngarkime",
        "specialpages-group-users": "Përdoruesit dhe privilegjet",
        "specialpages-group-highuse": "Faqe të shumëpërdorura",
        "tags-title": "Etiketat",
        "tags-intro": "Kjo faqe liston etiketat që softueri mund t'i shënojë me një redaktim, dhe kuptimin e tyre.",
        "tags-tag": "Emri i etiketës",
-       "tags-display-header": "Dukja në listat e ndryshimeve",
+       "tags-display-header": "Pamja në listat e ndryshimeve",
        "tags-description-header": "Përshkrimi i plotë i kuptimit",
        "tags-hitcount-header": "Ndrzshimet e etikuara",
        "tags-edit": "redakto",
        "dberr-usegoogle": "Ju mund të provoni të kërkoni përmes Googles në ndërkohë.",
        "dberr-outofdate": "Vini re se indekset e tyre të përmbajtjes tona mund të jetë e vjetëruar.",
        "dberr-cachederror": "Kjo është një kopje e faqes së kërkuar dhe mund të jetë e vjetëruar.",
-       "htmlform-invalid-input": "Ka probleme me disa kontribute tuaja",
+       "htmlform-invalid-input": "Ka probleme me disa nga kontributet e tua",
        "htmlform-select-badoption": "Vlera që ju e specifikuat nuk është një alternativë e vlefshme.",
        "htmlform-int-invalid": "Vlera që ju e specifikuat nuk është numër i plotë.",
        "htmlform-float-invalid": "Vlera që ju e specifikuat nuk është numër.",
        "sqlite-no-fts": "$1 pa mbështetje të kërkimit me teskt të plotë",
        "logentry-delete-delete": "$1 {{GENDER:$2|grisi}} faqen $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|riktheu}} faqen $3",
-       "logentry-delete-event": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|e një ngjarjeje regjistri|$5 ngjarjeve regjitri}} në $3: $4",
-       "logentry-delete-revision": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|një rishikimi|$5 rishikimeve}} në faqen $3: $4",
+       "logentry-delete-event": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|e një ngjarjeje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|ka dryshuar}} dukshmërinë e {{PLURAL:$5|një rishikimi|$5 rishikimeve}} në faqen $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e ngjarjeve të regjistit në $3",
-       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|ndryshpi}} dukshmërinë e rishikimeve në faqen $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e rishikimeve në faqen $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|shtypi}} faqen $3",
        "logentry-suppress-event": "$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një ngjarje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
        "logentry-suppress-revision": "$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një versioni|$5 versioneve}} në $3: $4",
        "logentry-newusers-create": "Llogaria e {{GENDER:$2|përdoruesit|përdorueses}} $1 u krijua.",
        "logentry-newusers-create2": "Llogaria e përdoruesit $3 është {{GENDER:$2|krijuar}} nga $1",
        "logentry-newusers-autocreate": "Llogaria e {{GENDER:$2|përdoruesit|përdorueses}} $1 u {{GENDER:$2|krijua}} automatikisht",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|ka hequr}} mbrojtjen nga faqja $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|ka mbrojtur}} faqen $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ka mbrojtur}} faqen $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ka ndryshuar}} nivelin e mbrojtjes për $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ka ndryshuar}} nivelin e mbrojtjes për $3 $4 [cascading]",
        "logentry-rights-rights": "$1 {{GENDER:$2|ndërroi}} anëtarësinë e grupit për $3 nga $4 në $5",
        "logentry-rights-autopromote": "$1 është {{GENDER:$2|promovuar}} automatikisht nga $4 në $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngarkoi}} $3",
        "api-error-badaccess-groups": "Ju nuk lejoheni të ngarkoni skeda në këtë wiki.",
        "api-error-badtoken": "Gabim i brendshëm: Shenjë e keqe.",
        "api-error-copyuploaddisabled": "Ngarkimi nga URL-ja është çaktivizuar në këtë server.",
-       "api-error-duplicate": "{{PLURAL:$1|Ekziston [$2 një skedë tjetër]|Ekzistojnë [$2 disa skeda të tjera]}} me të njëjtën përmbajtje.",
-       "api-error-duplicate-archive": "{{Ekzistonte [$2 një skedë tjetër]|Ekzistonin [$2 disa skeda të tjera]}} me të njëjtën përmbajtje, por {{PLURAL:$1|u gris|u grisën}}.",
-       "api-error-duplicate-archive-popup-title": "Dublo {{PLURAL:$1|skedë|skeda}} që janë grisur tashmë",
-       "api-error-duplicate-popup-title": "Dublo {{PLURAL:$1|skedë|skeda}}",
+       "api-error-duplicate": "{{PLURAL:$1|Ekziston një skedë tjetër|Ekzistojnë disa skeda të tjera}} me të njëjtën përmbajtje.",
+       "api-error-duplicate-archive": "{{Ekzistonte një skedë tjetër|Ekzistonin disa skeda të tjera}} me të njëjtën përmbajtje, por {{PLURAL:$1|ajo është|ato janë}} fshirë.",
        "api-error-empty-file": "Skeda që paraqitët ishte bosh.",
        "api-error-emptypage": "Nuk lejohet krijimi i faqeve të reja bosh.",
        "api-error-fetchfileerror": "Gabim i brendshëm: Diçka shkoi keq gjatë marrjes së skedës.",
index 88033d5..6ba16e9 100644 (file)
@@ -27,7 +27,8 @@
                        "아라",
                        "Nemo bis",
                        "Aktron",
-                       "Srdjan m"
+                       "Srdjan m",
+                       "Macofe"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "youhavenewmessagesfromusers": "Имате $1 од {{PLURAL:$3|другог корисника|$3 корисника|$3 корисника}} ($2).",
        "youhavenewmessagesmanyusers": "Имате $1 од много корисника ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|нову поруку|999=нове поруке}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|последњу измену|999=последње измене}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|последња измена|999=последње измене}}",
        "youhavenewmessagesmulti": "Имате нових порука на $1",
        "editsection": "уреди",
        "editold": "уреди",
        "nstab-template": "Шаблон",
        "nstab-help": "Помоћ",
        "nstab-category": "Категорија",
+       "mainpage-nstab": "Главна страна",
        "nosuchaction": "Нема такве радње",
        "nosuchactiontext": "Радња наведена у адреси није исправна.\nМожда сте погрешно написали адресу или сте пратили застарелу везу.\nМогуће је и да се ради о грешци у софтверу викија.",
        "nosuchspecialpage": "Нема такве посебне странице",
        "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|страница|странице}}",
        "passwordreset-emailsent": "Подсетник о лозинци је послат на вашу адресу.",
        "passwordreset-emailsent-capture": "Послат је подсетник преко е-поште (приказан доле).",
        "passwordreset-emailerror-capture": "Е-порука за ресетовање лозинке, приказана испод је послата, али слање {{GENDER:$2|кориснику|корисници}} није успело: $1",
-       "changeemail": "Ð\9fÑ\80омена Ðµ-адÑ\80еÑ\81е",
+       "changeemail": "Ð\9fÑ\80омени Ð¸Ð»Ð¸ Ñ\83клони Ðµ-адÑ\80еÑ\81Ñ\83",
        "changeemail-text": "Попуните овај образац да бисте променили своју е-адресу. Мораћете да унесете лозинку да потврдите измену.",
        "changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "changeemail-oldemail": "Тренутна е-адреса:",
        "noarticletext": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} уредити страницу]</span>.",
        "noarticletext-nopermission": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама или <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне дневнике]</span>, али немате дозволу да направите ову страницу.",
        "missing-revision": "Не могу да пронађем измену бр. $1 на страници под називом „{{FULLPAGENAME}}“.\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
-       "userpage-userdoesnotexist": "Кориснички налог „<nowiki>$1</nowiki>“ није отворен.\nРазмислите да ли заиста желите да направите или уредите ову страницу.",
+       "userpage-userdoesnotexist": "Кориснички налог „<nowiki>$1</nowiki>“ није отворен.\nРазмислите да ли заиста желите да направите/уредите ову страницу.",
        "userpage-userdoesnotexist-view": "Кориснички налог „$1“ није отворен.",
        "blocked-notice-logextract": "Овај корисник је тренутно блокиран.\nИзвештај о последњем блокирању можете погледати испод:",
        "clearyourcache": "'''Напомена:''' након чувања, можда ћете морати да очистите кеш прегледача.\n*'''Фајерфокс и Сафари:''' држите ''Shift'' и кликните на ''Освежи'', или притисните ''Ctrl-F5'' или Ctrl-R (''⌘-R'' на Макинтошу)\n*'''Гугл кроум:''' притисните ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Макинтошу)\n*'''Интернет експлорер: '''држите ''Ctrl'' и кликните на ''Освежи'', или притисните ''Ctrl-F5''\n*'''Опера:''' очистите привремену меморију преко менија ''Алатке → Поставке''.",
        "permissionserrorstext-withaction": "Немате дозволу за $2 из {{PLURAL:$1|следећег|следећих}} разлога:",
        "recreate-moveddeleted-warn": "'''Упозорење: поново правите страницу која је претходно обрисана.'''\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
        "moveddeleted-notice": "Ова страница је обрисана.\nИсторија њеног брисања и премештања налази се испод:",
+       "moveddeleted-notice-recent": "Жао нам је, ова страница је недавно обрисана (у последњих 24 сата).\nОвде је наведена историја брисања и премештања с образложењем.",
        "log-fulllog": "Погледај целу историју",
        "edit-hook-aborted": "Измену је прекинула кука.\nНије дато никакво образложење.",
        "edit-gone-missing": "Не могу да ажурирам страницу.\nИзгледа да је обрисана.",
        "mergehistory-go": "Прикажи измене које се могу спојити",
        "mergehistory-submit": "Споји измене",
        "mergehistory-empty": "Нема измена за спајање.",
-       "mergehistory-success": "$3 {{PLURAL:$3|измена странице [[:$1]] је спојена|измене странице [[:$1]] су спојене|измена странице [[:$1]] је спојено}} у [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|измена странице $1 је спојена|измене странице $1 су спојене|измена странице $1 је спојено}} у [[:$2]].",
        "mergehistory-fail": "Не могу да спојим историје. Проверите страницу и временске параметре.",
        "mergehistory-fail-toobig": "Није могуће спојити историје јер више од $1 {{PLURAL:$1|измене ће бити премештене|измена ће бити премештено}}.",
        "mergehistory-no-source": "Изворна страница $1 не постоји.",
        "prefs-watchlist-token": "Жетон списка надгледања:",
        "prefs-misc": "Друга подешавања",
        "prefs-resetpass": "Промени лозинку",
-       "prefs-changeemail": "Промени е-адресу",
+       "prefs-changeemail": "Ð\9fÑ\80омени Ð¸Ð»Ð¸ Ñ\83клони Ðµ-адÑ\80еÑ\81Ñ\83",
        "prefs-setemail": "Постави е-адресу",
        "prefs-email": "Поставке е-поште",
        "prefs-rendering": "Изглед",
        "grouppage-sysop": "{{ns:project}}:Администратори",
        "grouppage-bureaucrat": "{{ns:project}}:Бирократе",
        "grouppage-suppress": "{{ns:project}}:Ревизор",
-       "right-read": "прегледање страница",
+       "right-read": "читање страница",
        "right-edit": "уређивање страница",
        "right-createpage": "прављење страница (изузев страница за разговор)",
        "right-createtalk": "прављење страница за разговор",
        "right-move-rootuserpages": "премештање основних корисничких страница",
        "right-move-categorypages": "премештање категорија",
        "right-movefile": "премештање датотека",
-       "right-suppressredirect": "прескакање стварања преусмерења при премештању страница",
+       "right-suppressredirect": "премештање страница без остављања преусмерења",
        "right-upload": "отпремање датотека",
        "right-reupload": "замењивање постојећих датотека",
        "right-reupload-own": "замењивање сопствених датотека",
        "right-undelete": "враћање обрисаних страница",
        "right-suppressrevision": "прегледање, скривање и враћање одређених измена страница од свих корисника",
        "right-viewsuppressed": "прегледање измена скривених од свих корисника",
-       "right-suppressionlog": "гледање приватних дневника",
+       "right-suppressionlog": "пÑ\80егледаÑ\9aе Ð¿Ñ\80иваÑ\82ниÑ\85 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ°",
        "right-block": "блокирање даљих измена других корисника",
        "right-blockemail": "онемогућавање корисницима да шаљу е-поруке",
        "right-hideuser": "блокирање корисничког имена и његово сакривање од јавности",
        "right-ipblock-exempt": "заобилажење блокирања ИП адресе, аутоматска блокирања и блокирања опсега",
        "right-proxyunbannable": "заобилажење аутоматских блокирања посредника",
-       "right-unblockself": "одблокиÑ\80аÑ\98 самог себе",
-       "right-protect": "пÑ\80омени Ð½Ð¸Ð²Ð¾Ðµ Ð·Ð°Ñ\88Ñ\82иÑ\82е Ð¸ Ñ\83Ñ\80еди Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81а преносивом заштитом",
+       "right-unblockself": "деблокиÑ\80аÑ\9aе самог себе",
+       "right-protect": "меÑ\9aаÑ\9aе Ñ\81Ñ\82епена Ð·Ð°Ñ\88Ñ\82иÑ\82е Ð¸ Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ð´ преносивом заштитом",
        "right-editprotected": "уређивање страница под заштитом „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "уређивање страница под заштитом „{{int:protect-level-autoconfirmed}}“",
        "right-editcontentmodel": "мењање модела садржаја странице",
        "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 странице}} су уклоњене из категорије",
        "upload": "Пошаљи датотеку",
        "uploadbtn": "Пошаљи датотеку",
        "reuploaddesc": "Назад на образац за отпремање",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Сачувај",
        "upload-dialog-button-upload": "Пошаљи",
-       "upload-dialog-label-select-file": "Изабери датотеку",
-       "upload-dialog-label-infoform-title": "Детаљи",
-       "upload-dialog-label-infoform-name": "Назив",
-       "upload-dialog-label-infoform-description": "Опис",
-       "upload-dialog-label-usage-filename": "Назив датотеке",
+       "upload-form-label-select-file": "Изабери датотеку",
+       "upload-form-label-infoform-title": "Детаљи",
+       "upload-form-label-infoform-name": "Назив",
+       "upload-form-label-infoform-description": "Опис",
+       "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 не постоји.",
        "filerevert-legend": "Врати датотеку",
        "filerevert-intro": "Враћате датотеку '''[[Media:$1|$1]]''' на [$4 издање од $2; $3].",
        "filerevert-comment": "Разлог:",
-       "filerevert-defaultcomment": "Враћено на верзију од $2, $1",
+       "filerevert-defaultcomment": "Враћено на верзију од $2, $1 ($3)",
        "filerevert-submit": "Врати",
        "filerevert-success": "Датотека '''[[Media:$1|$1]]''' је враћена на [$4 издање од $2; $3].",
        "filerevert-badversion": "Не постоји раније локално издање датотеке с наведеним временским подацима.",
        "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": "додавање {{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": "Ð\94одаÑ\98 Ñ\81ве Ð³Ñ\80Ñ\83пе на сопствени налог",
+       "listgrouprights-addgroup-self": "додавање следећих {{PLURAL:$2|група}} на сопствени налог: $1",
+       "listgrouprights-removegroup-self": "уклањање следећих {{PLURAL:$2|група}} са сопственог налог: $1",
+       "listgrouprights-addgroup-self-all": "додаваÑ\9aе Ñ\81виÑ\85 Ð³Ñ\80Ñ\83па на сопствени налог",
        "listgrouprights-removegroup-self-all": "уклањање свих група са сопственог налога",
        "listgrouprights-namespaceprotection-header": "Ограничења именских простора",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "emailccsubject": "Копија ваше поруке кориснику $1: $2",
        "emailsent": "Порука је послата",
        "emailsenttext": "Ваша е-порука је послата.",
-       "emailuserfooter": "Ову е-поруку је послао $1 кориснику $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}.",
+       "emailuserfooter": "Ову е-поруку је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}.",
        "usermessage-summary": "Слање системске поруке.",
        "usermessage-editor": "Уређивач системских порука",
        "usermessage-template": "MediaWiki:UserMessage",
        "deletepage": "Обриши страницу",
        "confirm": "Потврди",
        "excontent": "садржај је био: „$1“",
-       "excontentauthor": "садржај је био: „$1“ (а једини уредник [[Special:Contribs/$2|$2]])",
+       "excontentauthor": "садржај је био: „$1“, а једини уредник [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])",
        "exbeforeblank": "садржај пре брисања је био: „$1“",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
        "pagesize": "(бајтови)",
        "restriction-edit": "уређивање",
        "restriction-move": "премештање",
-       "restriction-create": "Ð\9fрављење",
+       "restriction-create": "прављење",
        "restriction-upload": "слање",
        "restriction-level-sysop": "потпуно заштићено",
        "restriction-level-autoconfirmed": "полузаштићено",
        "sp-contributions-logs": "дневници",
        "sp-contributions-talk": "разговор",
        "sp-contributions-userrights": "управљање корисничким правима",
-       "sp-contributions-blocked-notice": "Овај корисник је блокиран. Испод су наведени последњи записи у дневнику блокирања:",
-       "sp-contributions-blocked-notice-anon": "Ð\9eвоÑ\98 Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81и Ñ\98е Ñ\82Ñ\80енÑ\83Ñ\82но Ð·Ð°Ð±Ñ\80аÑ\9aен Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п.\nÐ\98звеÑ\88Ñ\82аÑ\98 Ð¾ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аним ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸ Ð¸Ñ\81под:",
+       "sp-contributions-blocked-notice": "Овај корисник је тренутно блокиран. \nИспод су наведени последњи записи у дневнику блокирања:",
+       "sp-contributions-blocked-notice-anon": "Ð\9eва Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ñ\82Ñ\80енÑ\83Ñ\82но Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана.\nÐ\98Ñ\81под Ñ\81Ñ\83 Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸ Ð¿Ð¾Ñ\81ледÑ\9aи Ð·Ð°Ð¿Ð¸Ñ\81и Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83 Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа:",
        "sp-contributions-search": "Претрага доприноса",
        "sp-contributions-username": "ИП адреса или корисничко име:",
        "sp-contributions-toponly": "Само најновије измене",
        "ipbexpiry": "Истиче:",
        "ipbreason": "Разлог:",
        "ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уношење лажних информација\n** Уклањање садржаја са страница\n** Постављање веза до спољашњих сајтова\n** Уношење бесмислица у странице\n** Непристојно понашање\n** Употреба више налога\n** Неприхватљиво корисничко име",
-       "ipb-hardblock": "Ð\97абÑ\80ани пријављеним корисницима да уређују с ове ИП адресе",
+       "ipb-hardblock": "Ð\9eнемогÑ\83Ñ\9bи пријављеним корисницима да уређују с ове ИП адресе",
        "ipbcreateaccount": "Онемогући отварање налога",
        "ipbemailban": "Онемогући кориснику да шаље е-поруке",
        "ipbenableautoblock": "Аутоматски блокирај последњу ИП адресу овог корисника и све даљње адресе с којих покуша да уређује",
        "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": "Одговарајућа страница за разговор, ако постоји, биће аутоматски премештена заједно с њом, осим ако:\n*Већ постоји страница за разговор с новим насловом, или\n*Ако је означено доленаведено поље.\n\nУ овом случају мора ручно да се премести или споји, ако има потребе за тим.",
-       "movearticle": "Премести страницу:",
        "moveuserpage-warning": "'''Упозорење:''' на путу сте да преместите корисничку страницу. Имајте у виду да ће само страница бити премештена, а сам корисник ''неће'' бити преименован.",
        "movecategorypage-warning": "<strong>Упозорење:</strong> премештате страницу категорије. Имајте на уму да ће само страница бити премештена и да све странице у старој категорији <em>неће</em> бити рекатегорисане у нову категорију.",
        "movenologintext": "Морате да будете регистровани и [[Special:UserLogin|пријављени]] да бисте премештали странице.",
        "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 je {{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",
        "api-error-badaccess-groups": "Није вам дозвољено да отпремате датотеке на овај вики.",
        "api-error-badtoken": "Унутрашња грешка: неисправан жетон.",
        "api-error-copyuploaddisabled": "Отпремање путем адресе је онемогућено на овом серверу.",
-       "api-error-duplicate": "Већ {{PLURAL:$1|постоји [$2 друга датотека]|постоје [$2 друге датотеке]}} с истим садржајем.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Постојала је [$2 друга датотека]|Постојале су [$2 друге датотеке]}} с истим садржајем, али {{PLURAL:$1|је обрисана|су обрисане}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Дуплирана датотека која је већ обрисана|Дуплиране датотеке које су већ обрисане}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Дуплирана датотека|Дуплиране датотеке}}",
+       "api-error-duplicate": "Већ {{PLURAL:$1|1=постоји друга датотека|постоје друге датотеке}} с истим садржајем.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Постојала је друга датотека|Постојале су друге датотеке}} с истим садржајем, али {{PLURAL:$1|је обрисана|су обрисане}}.",
        "api-error-empty-file": "Послата датотека је празна.",
        "api-error-emptypage": "Стварање нових празних страница није дозвољено.",
        "api-error-fetchfileerror": "Унутрашња грешка: дошло је до грешке при добављању датотеке.",
index c59d881..3a1cb43 100644 (file)
@@ -18,7 +18,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Nemo bis",
-                       "Srdjan m"
+                       "Srdjan m",
+                       "Macofe"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "youhavenewmessagesfromusers": "Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika|$3 korisnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od mnogo korisnika ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|poslednju izmenu|999=poslednje izmene}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|poslednja izmena|999=poslednje izmene}}",
        "youhavenewmessagesmulti": "Imate novih poruka na $1",
        "editsection": "uredi",
        "editold": "uredi",
        "nstab-template": "Šablon",
        "nstab-help": "Pomoć",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Glavna strana",
        "nosuchaction": "Nema takve radnje",
        "nosuchactiontext": "Radnja navedena u adresi nije ispravna.\nMožda ste pogrešno napisali adresu ili ste pratili zastarelu vezu.\nMoguće je i da se radi o grešci u softveru vikija.",
        "nosuchspecialpage": "Nema takve posebne stranice",
        "createacct-captcha": "Sigurnosna provera",
        "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Otvori nalog",
-       "createacct-another-submit": "Otvori još jedan nalog",
+       "createacct-another-submit": "Otvori nalog",
        "createacct-benefit-heading": "{{SITENAME}} je napravljen od strane ljudi kao što ste vi.",
        "createacct-benefit-body1": "{{PLURAL:$1|izmena|izmene}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice}}",
        "passwordreset-emailsent": "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": "Promena e-adrese",
+       "changeemail": "Promeni ili ukloni e-adresu",
        "changeemail-text": "Popunite ovaj obrazac da biste promenili svoju e-adresu. Moraćete da unesete lozinku da potvrdite izmenu.",
        "changeemail-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutna e-adresa:",
        "noarticletext": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti stranicu]</span>.",
        "noarticletext-nopermission": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne dnevnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
        "missing-revision": "Ne mogu da pronađem izmenu br. $1 na stranici pod nazivom „{{FULLPAGENAME}}“.\n\nOvo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
-       "userpage-userdoesnotexist": "Korisnički nalog „<nowiki>$1</nowiki>“ nije otvoren.\nRazmislite da li zaista želite da napravite ili uredite ovu stranicu.",
+       "userpage-userdoesnotexist": "Korisnički nalog „<nowiki>$1</nowiki>“ nije otvoren.\nRazmislite da li zaista želite da napravite/uredite ovu stranicu.",
        "userpage-userdoesnotexist-view": "Korisnički nalog „$1“ nije otvoren.",
        "blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nIzveštaj o poslednjem blokiranju možete pogledati ispod:",
        "clearyourcache": "'''Napomena:''' nakon čuvanja, možda ćete morati da očistite keš pregledača.\n*'''Fajerfoks i Safari:''' držite ''Shift'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5'' ili Ctrl-R (''⌘-R'' na Makintošu)\n*'''Gugl kroum:''' pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Makintošu)\n*'''Internet eksplorer: '''držite ''Ctrl'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5''\n*'''Opera:''' očistite privremenu memoriju preko menija ''Alatke → Postavke''.",
        "mergehistory-go": "Prikaži izmene koje se mogu spojiti",
        "mergehistory-submit": "Spoji izmene",
        "mergehistory-empty": "Nema izmena za spajanje.",
-       "mergehistory-success": "$3 {{PLURAL:$3|izmena stranice [[:$1]] je spojena|izmene stranice [[:$1]] su spojene|izmena stranice [[:$1]] je spojeno}} u [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|izmena stranice $1 je spojena|izmene stranice $1 su spojene|izmena stranice $1 je spojeno}} u [[:$2]].",
        "mergehistory-fail": "Ne mogu da spojim istorije. Proverite stranicu i vremenske parametre.",
        "mergehistory-fail-toobig": "Nije moguće spojiti istorije jer više od $1 {{PLURAL:$1|izmene će biti premeštene|izmena će biti premešteno}}.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "prefs-watchlist-token": "Žeton spiska nadgledanja:",
        "prefs-misc": "Druga podešavanja",
        "prefs-resetpass": "Promeni lozinku",
-       "prefs-changeemail": "Promeni e-adresu",
+       "prefs-changeemail": "Promeni ili ukloni e-adresu",
        "prefs-setemail": "Postavi e-adresu",
        "prefs-email": "Postavke e-pošte",
        "prefs-rendering": "Izgled",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrate",
        "grouppage-suppress": "{{ns:project}}:Revizor",
-       "right-read": "pregledanje stranica",
+       "right-read": "čitanje stranica",
        "right-edit": "uređivanje stranica",
        "right-createpage": "pravljenje stranica (izuzev stranica za razgovor)",
        "right-createtalk": "pravljenje stranica za razgovor",
        "right-move-rootuserpages": "premeštanje osnovnih korisničkih stranica",
        "right-move-categorypages": "premeštanje kategorija",
        "right-movefile": "premeštanje datoteka",
-       "right-suppressredirect": "preskakanje stvaranja preusmerenja pri premeštanju stranica",
+       "right-suppressredirect": "premeštanje stranica bez ostavljanja preusmerenja",
        "right-upload": "otpremanje datoteka",
        "right-reupload": "zamenjivanje postojećih datoteka",
        "right-reupload-own": "zamenjivanje sopstvenih datoteka",
        "right-undelete": "vraćanje obrisanih stranica",
        "right-suppressrevision": "pregledanje, skrivanje i vraćanje određenih izmena stranica od svih korisnika",
        "right-viewsuppressed": "pregledanje izmena skrivenih od svih korisnika",
-       "right-suppressionlog": "gledanje privatnih dnevnika",
+       "right-suppressionlog": "pregledanje privatnih dnevnika",
        "right-block": "blokiranje daljih izmena drugih korisnika",
        "right-blockemail": "onemogućavanje korisnicima da šalju e-poruke",
        "right-hideuser": "blokiranje korisničkog imena i njegovo sakrivanje od javnosti",
        "right-ipblock-exempt": "zaobilaženje blokiranja IP adrese, automatska blokiranja i blokiranja opsega",
        "right-proxyunbannable": "zaobilaženje automatskih blokiranja posrednika",
-       "right-unblockself": "odblokiraj samog sebe",
-       "right-protect": "promeni nivoe zaštite i uredi stranice sa prenosivom zaštitom",
+       "right-unblockself": "deblokiranje samog sebe",
+       "right-protect": "menjanje stepena zaštite i uređivanje stranica pod prenosivom zaštitom",
        "right-editprotected": "uređivanje stranice pod zaštitom „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "uređivanje stranica pod zaštitom „{{int:protect-level-autoconfirmed}}“",
        "right-editinterface": "uređivanje korisničkog okruženja",
        "filerevert-legend": "Vrati datoteku",
        "filerevert-intro": "Vraćate datoteku '''[[Media:$1|$1]]''' na [$4 izdanje od $2; $3].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1",
+       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1 ($3)",
        "filerevert-submit": "Vrati",
        "filerevert-success": "Datoteka '''[[Media:$1|$1]]''' je vraćena na [$4 izdanje od $2; $3].",
        "filerevert-badversion": "Ne postoji ranije lokalno izdanje datoteke s navedenim vremenskim podacima.",
        "listgrouprights-members": "(spisak članova)",
        "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": "dodaje {{PLURAL:$2|sledeću grupu|sledeće grupe}}: $1",
-       "listgrouprights-removegroup": "briše {{PLURAL:$2|sledeću grupu|sledeće grupe}}: $1",
+       "listgrouprights-addgroup": "dodavanje {{PLURAL:$2|sledećih grupa}}: $1",
+       "listgrouprights-removegroup": "uklanjanje {{PLURAL:$2|sledećih grupa}}: $1",
        "listgrouprights-addgroup-all": "dodavanje svih grupa",
        "listgrouprights-removegroup-all": "brisanje svih grupa",
-       "listgrouprights-addgroup-self": "dodavanje {{PLURAL:$2|grupe|grupa}} na svoj nalog: $1",
-       "listgrouprights-removegroup-self": "uklanjanje {{PLURAL:$2|grupe|grupa}} sa svog naloga: $1",
-       "listgrouprights-addgroup-self-all": "Dodaj sve grupe na sopstveni nalog",
+       "listgrouprights-addgroup-self": "dodavanje sledećih {{PLURAL:$2|grupa}} na sopstveni nalog: $1",
+       "listgrouprights-removegroup-self": "uklanjanje sledećih {{PLURAL:$2|grupa}} sa sopstvenog nalog: $1",
+       "listgrouprights-addgroup-self-all": "dodavanje svih grupa na sopstveni nalog",
        "listgrouprights-removegroup-self-all": "uklanjanje svih grupa sa sopstvenog naloga",
        "listgrouprights-namespaceprotection-header": "Ograničenja imenskih prostora",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "emailccsubject": "Kopija vaše poruke korisniku $1: $2",
        "emailsent": "Poruka je poslata",
        "emailsenttext": "Vaša e-poruka je poslata.",
-       "emailuserfooter": "Ovu e-poruku je poslao $1 korisniku $2 pomoću „{{int:emailuser}}“ s vikija {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku je {{GENDER:$1|poslao|poslala}} $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću „{{int:emailuser}}“ s vikija {{SITENAME}}.",
        "usermessage-summary": "Slanje sistemske poruke.",
        "usermessage-editor": "Uređivač sistemskih poruka",
        "usermessage-template": "MediaWiki:UserMessage",
        "deletepage": "Obriši stranicu",
        "confirm": "Potvrdi",
        "excontent": "sadržaj je bio: „$1“",
-       "excontentauthor": "sadržaj je bio: „$1“ (a jedini urednik [[Special:Contribs/$2|$2]])",
+       "excontentauthor": "sadržaj je bio: „$1“, a jedini urednik [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj pre brisanja je bio: „$1“",
        "delete-confirm": "Brisanje stranice „$1“",
        "delete-legend": "Obriši",
        "pagesize": "(bajtovi)",
        "restriction-edit": "uređivanje",
        "restriction-move": "premeštanje",
-       "restriction-create": "Pravljenje",
+       "restriction-create": "pravljenje",
        "restriction-upload": "slanje",
        "restriction-level-sysop": "potpuno zaštićeno",
        "restriction-level-autoconfirmed": "poluzaštićeno",
        "sp-contributions-logs": "dnevnici",
        "sp-contributions-talk": "razgovor",
        "sp-contributions-userrights": "upravljanje korisničkim pravima",
-       "sp-contributions-blocked-notice": "Ovaj korisnik je blokiran. Ispod su navedeni poslednji zapisi u dnevniku blokiranja:",
-       "sp-contributions-blocked-notice-anon": "Ovoj IP adresi je trenutno zabranjen pristup.\nIzveštaj o blokiranim korisnicima se nalazi ispod:",
+       "sp-contributions-blocked-notice": "Ovaj korisnik je trenutno blokiran. \nIspod su navedeni poslednji zapisi u dnevniku blokiranja:",
+       "sp-contributions-blocked-notice-anon": "Ova IP adresa je trenutno blokirana.\nIspod su navedeni poslednji zapisi u dnevniku blokiranja:",
        "sp-contributions-search": "Pretraga doprinosa",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Samo najnovije izmene",
        "ipbexpiry": "Ističe:",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi za blokiranje\n** Unošenje lažnih informacija\n** Uklanjanje sadržaja sa stranica\n** Postavljanje veza do spoljašnjih sajtova\n** Unošenje besmislica u stranice\n** Nepristojno ponašanje\n** Upotreba više naloga\n** Neprihvatljivo korisničko ime",
-       "ipb-hardblock": "Zabrani prijavljenim korisnicima da uređuju s ove IP adrese",
+       "ipb-hardblock": "Onemogući prijavljenim korisnicima da uređuju s ove IP adrese",
        "ipbcreateaccount": "Onemogući otvaranje naloga",
        "ipbemailban": "Onemogući korisniku da šalje e-poruke",
        "ipbenableautoblock": "Automatski blokiraj poslednju IP adresu ovog korisnika i sve daljnje adrese s kojih pokuša da uređuje",
        "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.",
-       "movearticle": "Premesti stranicu:",
        "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.",
        "api-error-badaccess-groups": "Nije vam dozvoljeno da otpremate datoteke na ovaj viki.",
        "api-error-badtoken": "Unutrašnja greška: neispravan žeton.",
        "api-error-copyuploaddisabled": "Otpremanje putem adrese je onemogućeno na ovom serveru.",
-       "api-error-duplicate": "Već {{PLURAL:$1|postoji [$2 druga datoteka]|postoje [$2 druge datoteke]}} s istim sadržajem.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 druge datoteke]}} s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplirana datoteka koja je već obrisana|Duplirane datoteke koje su već obrisane}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duplirana datoteka|Duplirane datoteke}}",
+       "api-error-duplicate": "Već {{PLURAL:$1|1=postoji druga datoteka|postoje druge datoteke}} s istim sadržajem.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su druge datoteke}} s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
        "api-error-empty-file": "Poslata datoteka je prazna.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
        "api-error-fetchfileerror": "Unutrašnja greška: došlo je do greške pri dobavljanju datoteke.",
index 8218904..7cf0bcc 100644 (file)
@@ -7,7 +7,8 @@
                        "Ooswesthoesbes",
                        "Stretsh",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Poti strepi ondro den miti:",
        "filerevert-legend": "Gefre bakadray",
        "filerevert-intro": "Yu ben '''[[Media:$1|$1]]''' bakadrayn tu a [$4 si opo $2, $3]",
        "filerevert-comment": "Opotaki:",
-       "filerevert-defaultcomment": "E bakadray tu a si opo $1, $2",
+       "filerevert-defaultcomment": "E bakadray tu a si opo $1, $2 ($3)",
        "filerevert-submit": "Bakadray",
        "filerevert-success": "'''[[Media:$1|$1]]''' ben bakadray tu a [$4 si opo $2, $3]",
        "filedelete": "\"$1\" trowe",
        "nlinks": "$1 {{PLURAL:$1|miti|miti}}",
        "nmembers": "$1 {{PLURAL:$1|memre|memre}}",
        "nrevisions": "$1 {{PLURAL:$1|si|si}}",
-       "nviews": "$1 {{PLURAL:$1|mansi|mansi}}",
        "lonelypages": "Weisi papira",
        "lonelypagestext": "Na den ondroben peprewoysi sey fu u {{SITENAME}} no skaki.",
        "uncategorizedpages": "Papira sondro grupu",
        "listusers-noresult": "No masyin dyaso.",
        "mailnologin": "No stiradresi",
        "emailuser": "E-mail a kebroikiman disi",
-       "emailpage": "Mayin e-mail",
        "defemailsubject": "E-mail fu {{SITENAME}}",
        "noemailtitle": "Disi masyin abi no e-mailadresi",
        "emailfrom": "Fu",
        "move-page-legend": "Dribi papira",
        "movepagetext": "Nanaga a ondroben box kan yu wan papira dribi.\nA stori go na a nyun papira.\nA owru nen sey wan stir na a nyun papira sey.\nStir na a owru papira ben no kenki.\nLuku na a dribi efu da no tustir efu broko stir ben e kon.\nYu ben risponsibu fu den stir.\n\nA papira kan '''wawan''' dribi sey leki a nyun papiranen:\n* no da ben, efu\n* a stirpapira nanga no stori ben.\n\n'''ATESSI!'''\nFu poppelari peprewoysi kan a drabi drastiki nanga ofusi folo abi.\nBen suri taki den folo abrasi ben pre yu disi aksi du.",
        "movepagetalktext": "A takipapira sey a trawan nen, '''iksi''':\n* A takipapira ondro a nyun nen da ala ben;\n* Yu a ondroben box odu.",
-       "movearticle": "Dribi papira:",
        "newtitle": "Na nyun papiranen:",
        "move-watch": "Disi papira si",
        "movepagebtn": "Dribi papira",
index b47950d..233ca3d 100644 (file)
@@ -9,7 +9,8 @@
                        "Pyt",
                        "Reedy",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Ferwiese unnerstriekje:",
        "mergehistory-go": "Wies Versione, do der fereeniged wäide konnen",
        "mergehistory-submit": "Fereenige Versione",
        "mergehistory-empty": "Der konnen neen Versione fereeniged wäide.",
-       "mergehistory-success": "{{PLURAL:$3|Beoarbaidenge|Beoarbaidengen}} fon [[:$1]] mäd Ärfoulch ätter [[:$2]] fereeniged.",
+       "mergehistory-done": "{{PLURAL:$3|Beoarbaidenge|Beoarbaidengen}} fon $1 mäd Ärfoulch ätter [[:$2]] fereeniged.",
        "mergehistory-fail": "Versionsfereenigenge nit muugelk, pröif ju Siede un do Tiedangoawen.",
        "mergehistory-no-source": "Uursproangssiede „$1“ is nit deer.",
        "mergehistory-no-destination": "Sielsiede „$1“ is nit deer.",
        "filerevert-legend": "Doatäi touräächsätte",
        "filerevert-intro": "Du sätst ju Doatäi '''[[Media:$1|$1]]''' ap ju [$4 Version fon $2, $3 Uure] tourääch.",
        "filerevert-comment": "Begruundenge:",
-       "filerevert-defaultcomment": "touräächsät ap ju Version fon $1, $2 Uure",
+       "filerevert-defaultcomment": "touräächsät ap ju Version fon $1, $2 Uure ($3)",
        "filerevert-submit": "Touräächsätte",
        "filerevert-success": "'''[[Media:$1|$1]]''' wuud ap ju [$4 Version fon $2, $3 Uure] touräächsät.",
        "filerevert-badversion": "Et rakt neen Version fon ju Doatäi tou dän ounroate Tiedpunkt.",
        "movepagetext": "Mäd dissen Formular koast du ne Siede tou n uur Noome ferskuuwe (touhoope mäd aal Versione).\nFoar dän oolde Noome wäd ne Fäärelaitenge tou dän Näie iengjucht.\nDu koast Fäärelaitengen, do ap dän Originoaltittel ferlinkje, automatisk korrigierje läite.\nFals du dit nit dääst, pröif ap [[Special:DoubleRedirects|dubbelde]] of [[Special:BrokenRedirects|defekte Fäärelaitengen]].\nDu bäst deerfoar feroantwoudelk, dät Ferbiendengen noch altied waiwiese ätter wier jo dieden.\n\nBeoachtje, dät ju Siede '''nit''' ferskäuwen wäd, wan dät al ne Siede mäd dän näie Tittel rakt, of et moaste weese dät ju loos is of ne Fäärelaitenge un dät ju nit neen allere Versione häd. Dät hat, dät du ne Siede ferskuuwe koast tou dän Noome, dän ju juust hiede, wan du die fersäin hiest. Un uk, dät du neen bestoundene Siede uurskrieuwe koast.\n\n'''WOARSKAUENGE!'''\nDit kon ne drastiske un uunferwachtede Ferannerenge reeke foar ne beljoowede Siede;\nwääs die deeruum sicher, dät du do Konsequenzen deerfon iensjuchst, eer du fääre moakest.",
        "movepagetext-noredirectfixer": "Mäd dän unnerstoundende Formular koast du ne Siede uumenaame, wierbie du ju mädsamt aal Versione ap dän näien Tittel ferskufst.\nDie oolde Tittel wäd deerätter tou dän näie fäärelaitje.\nStaal sicher, dät di in n Anslus aal  [[Special:DoubleRedirects|dubbelde]] of [[Special:BrokenRedirects|breekene Fäärelaitengen]] wröigest.\nDu bäst deerfoar feroantwoudelk, dät Links uk fääre ap dät korrekte Siel ferwiese.\n\nJu Siede wäd ‘’‘nit’‘’ferskäuwen, sowied et al ne Siede mäd dän foarsäine Tittel rakt, of ju moaste loos weese of ne Fäärelaitenge sunner Versionsgeskichte.\nDät betjut, dät du ju Uumenaamenge tourääch traale koast, wan du n Failer moaked hääst. Du koast deerjuun neen Siede uurskrieuwe.\n\n'''WOARSKAUENGE!'''\nJu Ferskuuwenge kon fierräkkende un uunferwachtede Foulgen foar oafte besoachte Sieden hääbe.\nDu skuust deeruum do Konsequenze fersteen hääbe, eer du nu fääregungst.",
        "movepagetalktext": "Ju touheerige Diskussionssiede wäd, sofier deer, mee ferskäuwen, '''of dät moast weese dät'''\n* der bestoant al n Diskussionssiede mäd dän näie Noome\n* du wäälst ju unnerstoundene Option ou.\n\nIn disse Falle moast du ju Siede, wan wonsked, fon Hounde ferskuuwe. Jädden dän '''näie''' Tittel unner '''Siel''' iendreege, deerunner ju Uumnaamenge jädden '''begründje'''.",
-       "movearticle": "Siede ferskuuwe:",
        "moveuserpage-warning": "'''Woarskauenge:''' Du bäst tougong, ne Benutserssiede tou ferskuuwen. Betoank, dät deertruch bloot ju Benutsersiede ferskäuwen, man '''nit''' die Benutser uumenaamd wäd.",
        "movenologintext": "Du moast n registrierden Benutser un [[Special:UserLogin|anmälded]] weese, uum ne Siede ferskuuwe tou konnen.",
        "movenotallowed": "Du hääst neen Begjuchtigenge, Sieden tou ferskuuwen.",
index e862faa..35e35d1 100644 (file)
@@ -10,7 +10,8 @@
                        "Reedy",
                        "Urhixidur",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Gurat-handapan tutumbu",
        "mergehistory-go": "Témbongkeun éditan nu bisa digabungkeun",
        "mergehistory-submit": "Gabungkeun révisi",
        "mergehistory-empty": "Euweuh révisi nu bisa digabungkeun.",
-       "mergehistory-success": "$3 {{PLURAL:$3|révisi|révisi}} tina [[:$1]] parantos digabung ka [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|révisi|révisi}} tina $1 parantos digabung ka [[:$2]].",
        "mergehistory-fail": "Jujutan teu bisa digabungkeun! Mangga pariiksa deui paraméter kaca jeung titimangsana.",
        "mergehistory-no-source": "Sumber kaca $1 teu aya.",
        "mergehistory-no-destination": "Kaca nu dituju ($1) teu aya.",
        "filerevert-legend": "Balikkeun gambar",
        "filerevert-intro": "Anjeun keur mulangkeun '''[[Media:$1|$1]]''' ka [vérsi $4, $3, $2].",
        "filerevert-comment": "Alesan:",
-       "filerevert-defaultcomment": "Dipulangkeun ka vérsi $2, $1",
+       "filerevert-defaultcomment": "Dipulangkeun ka vérsi $2, $1 ($3)",
        "filerevert-submit": "Balikkeun",
        "filerevert-success": "'''[[Media:$1|$1]]''' geus dipulangkeun ka [vérsi $4, $3, $2].",
        "filerevert-badversion": "Euweuh vérsi lokal tiheula ti koropak ieu kalawan cap waktu anu dimaksud.",
        "move-page-legend": "Pindahkeun kaca",
        "movepagetext": "Migunakeun formulir di handap bakal ngaganti ngaran hiji kaca, mindahkeun sadaya jujutanana ka ngaran anyar.\nJudul nu heubeul bakal jadi kaca alihan ka judul nu anyar.\nAnjeun bisa menerkeun alihan nu nujul ka judul asli sacara otomatis.\nMun henteu, pariksa bisi aya [[Special:DoubleRedirects|alihan ganda]] atawa [[Special:BrokenRedirects|buntu]]\nAnjeun tanggel waler pikeun mastikeun yén tumbu-tumbu tetep nujul ka tempat nu sakuduna dituju.\n\nCatet yén kacana '''moal''' pindah mun judul nu anyar geus aya eusian, kajaba mangrupa alihan sarta teu mibanda jujutan.\nIeu ngandung harti yén anjeun bisa ngaganti ngaran hiji kaca balik deui ka nu cikénéh diganti ngaranna mun anjeun nyieun kasalahan, sarta anjeun teu bisa nimpah kaca nu geus aya.\n\n'''AWAS!'''\nIeu parobahan bisa gedé pangaruhna mun dilarapkeun kana kaca anu payu;\nanjeun kudu bener-bener ngarti kana hal ieu.",
        "movepagetalktext": "Kaca obrolan nu patali, mun aya, bakal sacara otomatis kapindahkeun, '''iwal:'''\n*Anjeun mindahkeun kacana meuntas spasingaran nu béda,\n*Kaca obrolan dina ngaran nu anyar geus aya eusian, atawa\n*Anjeun teu nyontréngan kotak di handap.\n\nDina kajadian kitu, mun hayang (jeung perlu) anjeun kudu mindahkeun atawa ngagabungkeun kacana sacara manual.",
-       "movearticle": "Pindahkeun kaca",
        "movenologintext": "Anjeun kudu jadi pamaké nu kadaptar tur [[Special:UserLogin|asup log]] pikeun mindahkeun kaca.",
        "movenotallowed": "Anjeung teu boga kawenangan mindahkeun kaca.",
        "movenotallowedfile": "Anjeung teu boga kawenangan mindahkeun kaca.",
index 7d454fd..0d8795f 100644 (file)
        "nstab-template": "Mall",
        "nstab-help": "Hjälpsida",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Huvudsida",
        "nosuchaction": "Funktionen finns inte",
        "nosuchactiontext": "Den handling som specificerats av webbadressen är ogiltig.\nDu kan ha stavat webbadressen fel, eller följt en felaktig länk.\nDet kan även bero på en bugg i mjukvaran som används på {{SITENAME}}.",
        "nosuchspecialpage": "Någon sådan specialsida finns inte",
        "createacct-captcha": "Säkerhetskontroll",
        "createacct-imgcaptcha-ph": "Fyll i texten du ser ovan",
        "createacct-submit": "Skapa ditt konto",
-       "createacct-another-submit": "Skapa ett till konto",
+       "createacct-another-submit": "Skapa konto",
        "createacct-benefit-heading": "{{SITENAME}} är skapad av människor som dig.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringar}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sida|sidor}}",
        "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": "En lösenordsåterställning via e-post har skickats.",
+       "passwordreset-emailsent": "Om detta är en registrerad e-postadress för ditt konto kommer en lösenordsåterställning via e-post skickas.",
        "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 e-postadress",
-       "changeemail-text": "Fyll i detta formulär för att ändra din e-postadress. Du måste ange ditt lösenord för att bekräfta ändringen.",
+       "changeemail": "Ändra eller ta bort e-postadress",
+       "changeemail-text": "Fyll i detta formulär för att ändra din e-postadress. Du måste ange ditt lösenord för att bekräfta ändringen. Lämna fältet för den nya e-postadressen tomt om du vill ta bort associeringen av din e-postadress från ditt konto när du skickar formuläret.",
        "changeemail-no-info": "Du måste vara inloggad för att komma åt den här sidan direkt.",
        "changeemail-oldemail": "Nuvarande e-postadress:",
        "changeemail-newemail": "Ny e-postadress:",
+       "changeemail-newemail-help": "Detta fält bör lämnas tomt om du vill ta bort din e-postadress. Du kommer inte kunna återställa ett glömt lösenord och kommer inte att få e-post från denna wiki om e-postadressen tas bort.",
        "changeemail-none": "(ingen)",
        "changeemail-password": "Ditt lösenord till {{SITENAME}}:",
        "changeemail-submit": "Ändra e-post",
        "permissionserrorstext-withaction": "Du har inte behörighet att $2, av följande {{PLURAL:$1|anledning|anledningar}}:",
        "recreate-moveddeleted-warn": "'''Varning: Du återskapar en sida som tidigare raderats.'''\n\nDu bör överväga om det är lämpligt att fortsätta redigera den här sidan.\nRaderings- och sidflyttningsloggen för den här sidan visas här som hjälp:",
        "moveddeleted-notice": "Den här sidan har raderats.\nRaderings- och sidflyttningsloggen för sidan visas nedan som referens.",
+       "moveddeleted-notice-recent": "Tyvärr, denna sida raderades nyligen (inom de senaste 24 timmarna).\nLoggen för radering och flyttning av sidan visas nedan som referens.",
        "log-fulllog": "Visa fullständig logg",
        "edit-hook-aborted": "Redigering avbruten av hook.\nDen gav ingen förklaring.",
        "edit-gone-missing": "Kunde inte uppdatera sidan.\nDet verkar som att den har raderats.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
        "content-json-empty-array": "Tomt fält",
-       "duplicate-args-warning": "<strong>Varning:</strong> [[:$1]] anropar [[:$2]] med mer än ett värde för \"$3\"-parametern. Endast det sista värdet kommer att användas.",
+       "duplicate-args-warning": "<strong>Varning:</strong> [[:$1]] anropar [[:$2]] med mer än ett värde för parametern \"$3\". Endast det sista värdet kommer att användas.",
        "duplicate-args-category": "Sidor som använder upprepade argument i mallanrop",
        "duplicate-args-category-desc": "Sidan innehåller mallanrop som använder repeterade argument, så som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Varning: Denna sida innehåller för många anrop av resurskrävande parserfunktioner.\n\nAntalet anrop får vara högst $2, nu görs {{PLURAL:$1|$1 anrop}}",
        "mergehistory-go": "Visa redigeringar som kan slås samman",
        "mergehistory-submit": "Sammanfoga sidversioner",
        "mergehistory-empty": "Inga versioner av sidorna kan sammanfogas.",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versioner}} av [[:$1]] har infogats i [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versioner}} av $1 {{PLURAL:$3|har}} infogats i [[:$2]].",
        "mergehistory-fail": "Historikerna kunde inte sammanfogas, kontrollera de sidor och den sidversion som du valt.",
        "mergehistory-fail-toobig": "Kunde inte utföra historiksammanslagningen då fler än maxgränsen på $1 {{PLURAL:$1|version|versioner}} skulle ha flyttats.",
        "mergehistory-no-source": "Källsidan $1 finns inte.",
        "prefs-watchlist-token": "Bevakningslistsnyckel:",
        "prefs-misc": "Diverse",
        "prefs-resetpass": "Ändra lösenord",
-       "prefs-changeemail": "Ändra e-post",
+       "prefs-changeemail": "Ändra eller ta bort e-postadress",
        "prefs-setemail": "Ange en e-postadress",
        "prefs-email": "Alternativ för e-post",
        "prefs-rendering": "Utseende",
        "recentchangeslinked-summary": "Detta är en lista över de senaste ändringarna på sidor som länkas till från en given sida (eller på sidor som hör till en viss kategori).\nSidor på [[Special:Watchlist|din bevakningslista]] är markerade med '''fetstil'''.",
        "recentchangeslinked-page": "Sidnamn:",
        "recentchangeslinked-to": "Visa ändringar på sidor med länkar till den givna sidan istället",
+       "recentchanges-page-added-to-category": "[[:$1]] lades till i kategorin",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} lades till i kategorin",
+       "recentchanges-page-removed-from-category": "[[:$1]] togs bort från kategorin",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} togs bort från kategorin",
        "upload": "Ladda upp fil",
        "uploadbtn": "Ladda upp fil",
        "reuploaddesc": "Avbryt uppladdningen och gå tillbaka till uppladdningsformuläret.",
        "file-thumbnail-no": "Filnamnet börjar med <strong>$1</strong>.\nDet verkar vara en bild med förminskad storlek ''(miniatyrbild)''.\nOm du har denna bild i full storlek, ladda då hellre upp den, annars var vänlig och ändra filens namn.",
        "fileexists-forbidden": "En fil med detta namn existerar redan, och kan inte överskrivas.\nOm du fortfarande vill ladda upp din fil, var god gå tillbaka och välj ett nytt namn. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "En fil med detta namn finns redan bland de delade filerna.\nOm du ändå vill ladda upp din fil, gå då tillbaka och använd ett annat namn. [[File:$1|thumb|center|$1]]",
-       "file-exists-duplicate": "Den här filen är en dubblett till följande {{PLURAL:$1|fil|filer}}:",
+       "file-exists-duplicate": "Denna fil är en dubblett av följande {{PLURAL:$1|fil|filer}}:",
        "file-deleted-duplicate": "En identisk fil till den här filen ([[:$1]]) har tidigare raderats. Du bör kontrollera den filens raderingshistorik innan du fortsätter att återuppladda den.",
        "file-deleted-duplicate-notitle": "En identisk fil till den här filen har tidigare raderats och titeln har undanhållits.\nDu borde be någon som kan se undanhållen fildata att granska situationen innan du försöker ladda upp den.",
        "uploadwarning": "Uppladdningsvarning",
        "upload-options": "Uppladdningsalternativ",
        "watchthisupload": "Bevaka den här filen",
        "filewasdeleted": "En fil med detta namn har tidigare laddats upp och därefter tagits bort. Du bör kontrollera $1 innan du fortsätter att ladda upp den.",
+       "filename-thumb-name": "Detta ser ut som en titel på en miniatyrbild. Ladda inte upp miniatyrer tillbaka till samma wiki. Om så inte är fallet, ändra vänligen filnamnet så att det blir mer meningsfullt, och inte har prefixet miniatyr (eller thumbnail).",
        "filename-bad-prefix": "Namnet på filen du vill ladda upp börjar med '''\"$1\"'''. Filnamnet kommer förmodligen direkt från en digitalkamera och beskriver inte filens innehåll. Välj ett annat filnamn som bättre beskriver filen.",
        "filename-prefix-blacklist": " #<!-- ändra inte den här raden --> <pre>\n# Syntaxen är följande:\n#   * All text från ett #-tecken till radens slut är en kommentar\n#   * Icke-tomma rader anger typiska prefix för filnamn som används av olika digitalkameror\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # en del mobiltelefoner\nIMG # allmänt bildprefix\nJD # Jenoptik\nMGP # Pentax\nPICT # allmänt bildprefix\n #</pre> <!-- ändra inte den här raden -->",
        "upload-success-subj": "Uppladdningen lyckades",
        "upload-http-error": "Ett HTTP-fel uppstod: $1",
        "upload-copy-upload-invalid-domain": "Uppladdning av kopior är inte tillgängligt från denna domän.",
        "upload-dialog-title": "Ladda upp fil",
-       "upload-dialog-error": "Ett fel uppstod",
-       "upload-dialog-warning": "En varning uppstod",
        "upload-dialog-button-cancel": "Avbryt",
        "upload-dialog-button-done": "Klar",
        "upload-dialog-button-save": "Spara",
        "upload-dialog-button-upload": "Ladda upp",
-       "upload-dialog-label-select-file": "Välj fil",
-       "upload-dialog-label-infoform-title": "Detaljer",
-       "upload-dialog-label-infoform-name": "Namn",
-       "upload-dialog-label-infoform-description": "Beskrivning",
-       "upload-dialog-label-usage-title": "Användning",
-       "upload-dialog-label-usage-filename": "Filnamn",
+       "upload-process-error": "Ett fel uppstod",
+       "upload-process-warning": "En varning uppstod",
+       "upload-form-label-select-file": "Välj fil",
+       "upload-form-label-infoform-title": "Detaljer",
+       "upload-form-label-infoform-name": "Namn",
+       "upload-form-label-infoform-description": "Beskrivning",
+       "upload-form-label-usage-title": "Användning",
+       "upload-form-label-usage-filename": "Filnamn",
+       "foreign-structured-upload-form-label-own-work": "Detta är mitt eget verk",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorier",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-default": "Jag förstår att jag laddar upp denna fil till ett delat centralförvar. Jag bekräftar att jag gör det enligt de användarvillkor och licenspolicys som finns där.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Stäng denna dialogruta och prova en annan metod om du inte kan ladda upp denna fil under de policys som gäller för det delade centralförvaret.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Du kanske också skulle vilja prova att använda [[Special:Upload|uppladdningssidan på {{SITENAME}}]] om denna fil kan laddas upp där under deras policys.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Jag intygar att jag äger upphovsrätten för denna fil och samtycker till att oåterkalleligen släppa filen på Wikimedia Commons under licensen \n[https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] och jag accepterar [https://wikimediafoundation.org/wiki/Terms_of_Use villkoren för användning].",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Om du inte äger upphovsrätten för denna fil eller om du önskar att släppa den under en annan licens bör du överväga att använda [https://commons.wikimedia.org/wiki/Special:UploadWizard uppladdningsguiden på Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Du kanske skulle vilja prova att använda [[Special:Upload|uppladdningssidan på {{SITENAME}}]] om webbplatsens policys tillåter att denna fil laddas upp.",
        "backend-fail-stream": "Kunde inte strömma filen $1.",
        "backend-fail-backup": "Kunde inte säkerhetskopiera filen ''$1''.",
        "backend-fail-notexists": "Filen $1 finns inte.",
        "filerevert-legend": "Återställ fil",
        "filerevert-intro": "Du återställer '''[[Media:$1|$1]]''' till [$4 versionen från $2 kl. $3].",
        "filerevert-comment": "Anledning:",
-       "filerevert-defaultcomment": "Återställer till versionen från $1 kl. $2.",
+       "filerevert-defaultcomment": "Återställer till versionen från $1 kl. $2 ($3)",
        "filerevert-submit": "Återställ",
        "filerevert-success": "'''[[Media:$1|$1]]''' har återställts till [$4 versionen från $2 kl. $3].",
        "filerevert-badversion": "Det finns ingen tidigare version av filen från den angivna tidpunkten.",
        "emailccsubject": "Kopia av ditt meddelande till $1: $2",
        "emailsent": "E-post har nu skickats",
        "emailsenttext": "Ditt e-postmeddelande har skickats",
-       "emailuserfooter": "Detta e-postmeddelande skickades av $1 till $2 med funktionen \"{{int:emailuser}}\" på {{SITENAME}}.",
+       "emailuserfooter": "Detta e-postmeddelande {{GENDER:$1|skickades}} av $1 till {{GENDER:$2|$2}} med funktionen \"{{int:emailuser}}\" på {{SITENAME}}.",
        "usermessage-summary": "Lämnar systemmeddelande.",
        "usermessage-editor": "Systemmeddelare",
        "watchlist": "Bevakningslista",
        "deletepage": "Radera sida",
        "confirm": "Bekräfta",
        "excontent": "Före radering: \"$1\"",
-       "excontentauthor": "innehållet var: \"$1\" (den enda som skrivit var \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "innehållet var: \"$1\", den enda som skrivit var \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|diskussion]])",
        "exbeforeblank": "innehåll före tömning var: \"$1\"",
        "delete-confirm": "Radera \"$1\"",
        "delete-legend": "Radera",
        "move-page-legend": "Flytta sida",
        "movepagetext": "Med hjälp av formuläret härunder kan du byta namn på en sida, och flytta hela dess historik till ett nytt namn.\nDen gamla sidtiteln kommer att göras om till en omdirigering till den nya titeln.\nDu kan välja att automatiskt uppdatera omdirigeringar som leder till den gamla titeln.\nOm du väljer att inte göra det, kontrollera då att du inte skapar några [[Special:DoubleRedirects|dubbla]] eller [[Special:BrokenRedirects|trasiga omdirigeringar]].\nDu bör också se till att länkar fortsätter att peka dit de ska.\n\nNotera att sidan '''inte''' kan flyttas om det redan finns en sida under den nya sidtiteln, såvida inte den sidan är en omdirigering till den gamla titeln och saknar annan versionshistorik.\nDet innebär att du kan flytta tillbaks en sida om du råkar göra fel, och att du inte kan skriva över existerande sidor.\n\n'''VARNING!'''\nAtt flytta en populär sida kan vara en drastisk och oväntad ändring;\ndärför bör du vara säker på att du förstår konsekvenserna innan du fortsätter med flytten.",
        "movepagetext-noredirectfixer": "Formuläret nedan kommer att byta namn på en sida, och flytta hela sin historik till det nya namnet.\nDen gamla titeln kommer att bli en omdirigeringssida till den nya titeln.\nGlöm inte att kontrollera [[Special:DoubleRedirects|dubbla]] eller [[Special:BrokenRedirects|brutna omdirigeringar]].\nDu är ansvarig för att se till att länkar fortsätter att peka där de förväntas gå.\n\nObservera att sidan '''inte''' kommer att flyttas om det finns redan en sida på den nya titeln, förutom om den är tom eller en omdirigering och saknar tidigare redigeringshistorik.\nDetta innebär att du kan byta tillbaka namnet på en sida om du av misstag bytt namn på den, och du kan inte skriva över en befintlig sida.\n\n'''Varning!'''\nDetta kan vara en drastisk och oväntad förändring för en populär sida;\nse till att du förstår konsekvenserna av detta innan du fortsätter.",
-       "movepagetalktext": "Diskussionssidan kommer att även den automatiskt flyttas '''om inte''':\n*Det redan finns en diskussionssida som inte är tom med det nya namnet, eller\n*Du avmarkerar rutan nedan.\n\nI de fallen måste du flytta eller sammanfoga sidan manuellt, om det önskas.",
-       "movearticle": "Flytta sidan:",
+       "movepagetalktext": "Om du markerar denna ruta kommer den associerade diskussionssidan att automatiskt flyttas till en ny titel om inte en befintlig diskussionssida redan finns där.\n\nI detta fall måste du flytta eller sammanfoga sidan manuellt, om det önskas.",
        "moveuserpage-warning": "'''Varning:''' Du håller på att flytta en användarsida. Observera att endast sidan kommer att flyttas och att användaren ''inte'' kommer att byta namn.",
        "movecategorypage-warning": "<strong>Varning:</strong> Du är på väg att flytta en kategorisida. Observera att endast sidan kommer att flyttas och eventuella sidor i den gamla kategorin kommer <em>inte</em> att kategoriseras om till den nya kategorin.",
        "movenologintext": "För att flytta en sida måste du vara registrerad användare och [[Special:UserLogin|inloggad]].",
        "cant-move-to-user-page": "Du har inte behörighet att flytta en sida till en användarsida (förutom till en användarundersida).",
        "cant-move-category-page": "Du har inte behörighet att flytta kategorisidor.",
        "cant-move-to-category-page": "Du har inte behörighet att en sida till en kategorisida.",
-       "newtitle": "Till nya titeln:",
+       "newtitle": "Ny titel:",
        "move-watch": "Bevaka denna sida",
        "movepagebtn": "Flytta sidan",
        "pagemovedsub": "Flyttningen lyckades",
        "logentry-newusers-byemail": "Användarkontot $3 har {{GENDER:$2|skapats}} av $1 och lösenordet skickades via e-post",
        "logentry-newusers-autocreate": "Användarkontot $1 {{GENDER:$2|skapades}} automatiskt",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|flyttade}} skyddsinställningarna från $4 till $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|tog bort}} skyddet från $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|skyddade}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|skyddade}} $3 $4 [kaskaderande]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ändrade}} skyddsnivån för $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ändrade}} skyddsnivån för $3 $4 [kaskaderande]",
        "logentry-rights-rights": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3 från $4 till $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|befordrades}} automatiskt från $4 till $5",
        "api-error-badaccess-groups": "Du får inte ladda upp filer till denna wiki.",
        "api-error-badtoken": "Internt fel: felaktig nyckel.",
        "api-error-copyuploaddisabled": "Uppladdning via URL är inaktiverad på den här servern.",
-       "api-error-duplicate": "Det finns redan {{PLURAL:$1|[$2 en annan fil]|[$2 andra filer]}} på webbplatsen med samma innehåll.",
-       "api-error-duplicate-archive": "Det fanns redan {{PLURAL:$1|[$2 en annan fil]|[$2 några andra filer]}} på webbplatsen med samma innehåll, men {{PLURAL:$1|den har|de har}} raderats.",
-       "api-error-duplicate-archive-popup-title": "Dubblett av {{PLURAL:$1|fil|filer}} som redan har tagits bort",
-       "api-error-duplicate-popup-title": "Dubblett{{PLURAL:$1|fil|filer}}",
+       "api-error-duplicate": "Det finns redan {{PLURAL:$1|en annan fil|andra filer}} på webbplatsen med samma innehåll.",
+       "api-error-duplicate-archive": "Det fanns redan {{PLURAL:$1|en annan fil|några andra filer}} på webbplatsen med samma innehåll, men {{PLURAL:$1|den har|de har}} raderats.",
        "api-error-empty-file": "Filen du skickade var tom.",
        "api-error-emptypage": "Det är inte tillåtet att skapa nya, tomma sidor.",
        "api-error-fetchfileerror": "Internt fel: något gick fel vid hämtningen av filen.",
index 4174493..94794ef 100644 (file)
@@ -16,7 +16,8 @@
                        "Baba Tabita",
                        "Rich Farmbrough",
                        "Kipala",
-                       "Kwisha"
+                       "Kwisha",
+                       "Macofe"
                ]
        },
        "tog-underline": "Wekea mstari viungo:",
        "mergehistory-go": "Onyesha hariri ambazo zinaweza kushikanishwa",
        "mergehistory-submit": "Unganisha mapitio",
        "mergehistory-empty": "Hakuna mapitio yanayoweza kuunganishwa",
-       "mergehistory-success": "{{PLURAL:$3|Pitio $3 la [[:$1]] liliingizwa|Mapitio $3 ya [[:$1]] yaliingizwa}} ndani ya [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Pitio $3 la $1 liliingizwa|Mapitio $3 ya $1 yaliingizwa}} ndani ya [[:$2]].",
        "mergehistory-no-source": "Chanzo cha ukurasa $1 hakipo.",
        "mergehistory-no-destination": "Ukurasa wa makusudio $1 haupo.",
        "mergehistory-invalid-source": "Chanzo cha ukurasa lazima kiwe na jina uhalali.",
        "filerevert-legend": "Rejesha faili",
        "filerevert-intro": "Unataka kulirudisha faili la '''[[Media:$1|$1]]''' hadi [$4 pitio la saa $3, tarehe $2].",
        "filerevert-comment": "Sababu:",
-       "filerevert-defaultcomment": "Ilirejeshwa hadi sahihisho lile la $2, $1",
+       "filerevert-defaultcomment": "Ilirejeshwa hadi sahihisho lile la $2, $1 ($3)",
        "filerevert-submit": "Rejesha",
        "filerevert-success": "'''[[Media:$1|$1]]''' limerudishwa hadi [$4 pitio la saa $3, tarehe $2].",
        "filerevert-badversion": "Katika wiki hii hakuna mtindo wa awali wa faili hili lenye stempu ya saa iliyotajwa.",
        "move-page-legend": "Kuhamisha ukurasa",
        "movepagetext": "Tumia fomu hapo chini ili kubadilisha jina la ukurasa, pamoja na kuhamisha historia yake yote katika jina jipya lile lile.\nJina la awali litahamishwa na kuelekezwa kwa ukurasa wa jina jipya.\nUnaweza kurekebisha maelekezo yanayokwenda kwenye ukurasa wa zamani kwa kujiendesha.\nUsipotaka marekebisho yafanyike kwa kujiendesha, kumbuka kutafutia maelekezo [[Special:DoubleRedirects|mawilimawili]] au maelezo [[Special:BrokenRedirects|yenye hitilafu]].\nWewe mwenyewe una madaraka kuhakikisha kwamba viungo viendelee kuelekea vinapolengwa.\n\nUwe mwangalifu kwamba ukurasa '''hautahamishwa''' kama tayari kuna ukurasa wenye jina jipya, isipokuwa wakati ukurasa mpya ni tupu au ni elekezo, na hauna historia ya kuhaririwa.\nYaani unaweza kurudisha ukurasa kwenye jina la awali ukikosea, na haiwezekani kufuta ukurasa mwingine kwa kuchukua nafasi yake.\n\n'''ILANI!'''\nKuhamisha ukurasa wenye wasomaji wengi kunaweza kuathirika watumiaji wetu.\nTafadhali hakikisha kwamba unaelewa matokeo ya kitendo hiki kabla ya kuendelea.",
        "movepagetalktext": "Ukurasa wa majadiliano wa ukurasa huu utasogezwa pamoja yake\n'''ila:'''\n*tayari kuna ukurasa wa majadiliano (usiyo tupu) kwenye jina jipya, au\n*ukifuta tiki katika kisanduku hapa chini.\n\nKama tayari kuna ukurasa au ukifuta tiki, itabidi usogeze au uunganishe ukurasa kwa mkono ukitaka.",
-       "movearticle": "Ukurasa wa majadiliano wa ukurasa huu utasogezwa pamoja yake '''ila:'''\n*tayari kuna ukurasa wa majadiliano (usiyo tupu) kwenye jina jipya, au\n*ukifuta tiki katika kisanduku hapa chini.\n\nKama tayari kuna ukurasa au ukifuta tiki, itabidi usogeze au uunganishe ukurasa kwa mkono ukitaka.",
        "moveuserpage-warning": "'''Ilani:''' Unatarajia kuhamisha ukurasa wa mtumiaji. Tafadhali kumbuka kwamba ni ukurasa tu utakaohamishwa; jina la mtumiaji ''haitabadilishwa''.",
        "movenologintext": "Lazima uwe mtumiaji aliyesajiliwa na [[Special:UserLogin|uliyeingia]] ili uhamishe ukurasa.",
        "movenotallowed": "Huna ruhusa ya kuhamisha kurasa.",
index 1abc1c5..5990845 100644 (file)
@@ -16,7 +16,8 @@
                        "Przemub",
                        "Tchoř",
                        "Timpul",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Podsztrychńyńcy linkůw:",
        "mergehistory-go": "Pokoż půmjyńańo kere idźe scalić",
        "mergehistory-submit": "Scal historyjo půmjyńań",
        "mergehistory-empty": "Ńy mo historyje zmjan do scalyńo.",
-       "mergehistory-success": "$3 {{PLURAL:$3|pomjyńańe|pomjyńańa|pomjyńań}} we [[:$1]] ze sukcesym uostało scalonych ze [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|pomjyńańe|pomjyńańa|pomjyńań}} we $1 ze sukcesym uostało scalonych ze [[:$2]].",
        "mergehistory-fail": "Ńy idźe scalić historyje půmjyńań. Zmjyń sztalowańo parametrůw tyj uoperacyji.",
        "mergehistory-no-source": "Ńy ma sam zajty zdrzůdłowyj $1.",
        "mergehistory-no-destination": "Ńy ma sam zajty docelowyj $1.",
        "filerevert-legend": "Přiwracańy poprzedńy wersje plika",
        "filerevert-intro": "Zamjeřoš přiwrůćić '''[[Media:$1|$1]]''' do wersje z [$4 $3, $2].",
        "filerevert-comment": "Kůmyntorz:",
-       "filerevert-defaultcomment": "Přiwrůcůno wersyjo z $2, $1",
+       "filerevert-defaultcomment": "Přiwrůcůno wersyjo z $2, $1 ($3)",
        "filerevert-submit": "Přiwrůć",
        "filerevert-success": "Plik '''[[Media:$1|$1]]''' zostou cofńynty do [wersyje $4 ze $3, $2].",
        "filerevert-badversion": "Ńy ma sam popředńij lokalnyj wersyji tygo plika s podanům datům.",
        "move-page-legend": "Przećiś artikel",
        "movepagetext": "Przi půmocy formularza půńiżej możesz půmjyńyć mjano zajty i przećepnůńć jej gyszichta. Pod downym mjanym uostańe śa zajta przekerowujůnca. Zajty adresowane na stare mjano uostanům jak bůły.\n\nJak śe na to decydujesz, sprowdź, eli ńy je to [[Special:DoubleRedirects|podwůjne]] abo [[Special:BrokenRedirects|złomane przekerowańy]].\nUodpowjadosz za to, coby linki wjodły ku prawym artiklům!\n\nZajta '''ńy''' bydźe przećepano, jak:\n*je pusto i ńy bůła sprowjano\n*je zajtům przekerowujůncą\n*zajta uo takym mjane już sam je\n\n'''DEJ POZŮR!'''\nTo może być drastyczno abo ńyprzewidywalno zmjano, jak przećepńysz jako popularno zajta. Bydź pewny, aże wjesz co robiysz, ńim klikńysz knefel \"przećep\"!",
        "movepagetalktext": "Uodpowiednio zajta godki, jeśli jest, bydzie přećepano automatyčńe, pod warůnkiem, že:\n*ńy přećepuješ zajty do inkšy přestřeńy mjan\n*ńy ma sam zajty godki o takiym mjańe\nW takiych razach tekst godki třa přećepać, a jak třeba to i pouůnčyć z tym co juž sam jest, rynčńe. Abo možeš sie namyślić i nie přećepywać wcale (\"checkbox\" půnižyi).",
-       "movearticle": "Przećiś artikel:",
        "movenologintext": "Muśyš być zarejerowanym i [[Special:UserLogin|zalůgowanym]] užytkowńikym coby můc přećepnůńć zajta.",
        "movenotallowed": "Ńy moš uprownień do přećepywańo zajtůw.",
        "cant-move-user-page": "Ńy mosz uprowńyń do przekludzańo zajtůw użytkowńikůw (wyjůntkym sům jejich podstrony).",
index ab74dad..3ba32c6 100644 (file)
@@ -40,7 +40,9 @@
                        "AntanO",
                        "கலைவாணன்",
                        "Mohammed Ammar",
-                       "Shrikarsan"
+                       "Shrikarsan",
+                       "Matma Rex",
+                       "Anj.balaji"
                ]
        },
        "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
        "createacct-captcha": "பாதுகாப்பு சோதனை",
        "createacct-imgcaptcha-ph": "மேலே காணும் சொற்களை உள்ளிடுக",
        "createacct-submit": "உங்கள் கணக்கை உருவாக்குக",
-       "createacct-another-submit": "மறà¯\8dà®±à¯\8aà®°à¯\81 à®\95ணà®\95à¯\8dà®\95à¯\81 à®\92னà¯\8dà®±ை உருவாக்கவும்",
+       "createacct-another-submit": "à®\95ணà®\95à¯\8dà®\95ை உருவாக்கவும்",
        "createacct-benefit-heading": "{{SITENAME}} தங்களைப் போன்றோர்களால் உருவாக்கப்பட்டது",
        "createacct-benefit-body1": "{{PLURAL:$1|தொகுப்பு|தொகுப்புகள்}}",
        "createacct-benefit-body2": "{{PLURAL:$1|பக்கம்|பக்கங்கள்}}",
        "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": "à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\85னà¯\81பà¯\8dபபà¯\8dபà®\9fà¯\8dà®\9fதà¯\81.",
+       "passwordreset-emailsent": "à®\87தà¯\81 à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95ணà®\95à¯\8dà®\95ிறà¯\8dà®\95ான à®ªà®¤à®¿à®µà¯\81 à®\9aà¯\86யà¯\8dயபà¯\8dபà®\9fà¯\8dà®\9f à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலாயினà¯\8d, à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\85னà¯\81பà¯\8dபபà¯\8dபà®\9fà¯\81à®®à¯\8d",
        "passwordreset-emailsent-capture": "கீழே காண்பிக்கப்பட்டுள்ளது போல் கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்பட்டது.",
        "passwordreset-emailerror-capture": "கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல்  உருவாக்கப்பட்டுவிட்டது, அது கீழே காட்டப்பட்டுள்ளது, ஆனால் {{GENDER:$2|user}} அனுப்புவது தோல்வியடைந்தது:$1",
-       "changeemail": "மின்னஞ்சல் முகவரியை மாற்று",
-       "changeemail-text": "இந்த படிவத்தை உங்கள் மின்னஞ்சல் முகவரியை மாற்ற பூர்த்தி செய்யவும். நீங்கள் இந்த மாற்றத்தை உறுதிசெய்ய உங்கள் கடவுச்சொல்லை உள்ளிட வேண்டிவரும்.",
+       "changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
+       "changeemail-text": "இந்த படிவத்தை உங்கள் மின்னஞ்சல் முகவரியை மாற்ற பூர்த்தி செய்யவும். நீங்கள் இந்த மாற்றத்தை உறுதிசெய்ய உங்கள் கடவுச்சொல்லை உள்ளிட வேண்டிவரும்.  உங்கள் கணக்கிலிருந்து ஏதாவது மின்னஞ்சலை நீக்க விரும்பினால், படிவத்தை சமர்ப்பிக்கும்போது மின்னஞ்சல் முகவரியை காலியாக விடவும்.",
        "changeemail-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
        "changeemail-oldemail": "தற்பொழுதுள்ள மின்னஞ்சல் முகவரி:",
        "changeemail-newemail": "புதிய மின்னஞ்சல் முகவரி:",
        "mergehistory-go": "இணைக்கப்படக் கூடிய தொகுப்புக்களைக் காட்டு",
        "mergehistory-submit": "திருத்தங்களை இணை",
        "mergehistory-empty": "இணைக்கப்படக்கூடிய திருத்தங்கள் எதுவுமில்லை.",
-       "mergehistory-success": "[[:$1]] பக்கத்தின் {{PLURAL:$3|ஒரு திருத்தம்|$3 திருத்தங்கள்}} வெற்றிகரமாக [[:$2]] பக்கத்தில் இணைக்கப்பட்ட{{PLURAL:$3|து|ன}}.",
+       "mergehistory-done": "$1 பக்கத்தின் {{PLURAL:$3|ஒரு திருத்தம்|$3 திருத்தங்கள்}} வெற்றிகரமாக [[:$2]] பக்கத்தில் இணைக்கப்பட்ட{{PLURAL:$3|து|ன}}.",
        "mergehistory-fail": "வரலாற்றை இணைக்க முடியவில்லை. அருள் கூர்ந்து நேரங்களை ஒரு முறை சரி பார்க்கவும்.",
        "mergehistory-fail-toobig": "$1 அளவுக்கு மேல் வரலாறு இணைப்பு செய்ய இயலவில்லை {{PLURAL:$1|revision|திருத்தங்கள்}} நகர்த்தப்படும்.",
        "mergehistory-no-source": "மூலப் பக்கம் $1 இல்லை.",
        "prefs-watchlist-token": "கவனிப்பு பட்டியலின் அடையாளம்:",
        "prefs-misc": "பலதரப்பட்டவை",
        "prefs-resetpass": "கடவுச்சொல்லை மாற்றுக",
-       "prefs-changeemail": "மின்னஞ்சல் முகவரியை மாற்று",
+       "prefs-changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
        "prefs-setemail": "மின்னஞ்சல் முகவரி அமை",
        "prefs-email": "மின்னஞ்சல் விருப்பத்தேர்வுகள்",
        "prefs-rendering": "தோற்றம்",
        "upload-too-many-redirects": "இந்த URL மிக அதிகமான திருப்பங்களை (redirects) கொண்டுள்ளது.",
        "upload-http-error": "ஒரு HTTP பிழை ஏற்பட்டுள்ளது:$1",
        "upload-copy-upload-invalid-domain": "இந்தக் களத்தில் இருந்து படியெடுத்துப் பதிவேற்றம் செய்யும் வசதி கிடையாது.",
+       "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 கோப்பை stream செய்ய இயலவில்லை  .",
        "backend-fail-backup": " $1 கோப்பை பின்சேமிப்பு (backup) செய்ய இயலவில்லை  .",
        "backend-fail-notexists": " \"$1\"  என்னும் கோப்பு எதுவும் இல்லை",
        "movepagetext": "தாங்கள் தற்போதுள்ள கட்டுரையை வேறு தலைப்பிற்கு மாற்றும் நோக்கத்துடன் இங்கு வந்திருக்கிறீர்கள். தற்போது இருக்கும் தலைப்பிலிருந்து மற்றொரு புதிய தலைப்பிற்கு நகர்த்த கீழ்காணும் படிவத்தை நிரப்புவதுடன் காரணம் எனும் கட்டத்தினுள் தங்கள் மாற்றத்திற்கான காரணத்தைத் தெரிவிப்பது விரும்பத்தக்கது. இந்த நகர்த்தலில் கட்டுரையுடன், கட்டுரைக்கான உரையாடல் பக்கத்தில் செய்திகள் இடம் பெற்றிருந்தால் அந்தப் பக்கத்தையும் நகர்த்துவதற்கான கட்டத்தில் குறியிடுங்கள். இப்படி நகர்த்தப்படும் பொழுது கட்டுரையின் முழு வரலாறும் அப்படியே மாற்றப்பட்டுவிடும் என்பதையும் கவனத்தில் கொள்ள வேண்டும். நீங்கள் பழைய தலைப்புக்கு தானியக்கமாக வழிகாட்டும் வழிமாற்றுக்களை மாற்றியமைக்கலாம். அப்படி நீங்கள் செய்ய விரும்பவில்லை எனில்,[[Special:DoubleRedirects|இரட்டை]] அல்லது [[Special:BrokenRedirects|முறிந்த வழிமாற்றுகள்]]  உள்ளனவா என்பதைச் சரி பார்த்து உறுதி செய்யவும்.\n\n\nஇந்த நகர்த்தலின் போது தாங்கள் உள்ளீடு செய்த தலைப்பில் முன்பே கட்டுரையின் தலைப்பு இருந்தால் நகர்த்தல் வெற்றியடையாது என்பதையும் அறிந்து கொள்ள வேண்டுகிறோம்.\n\n\n'''எச்சரிக்கை:''' இந்த நகர்த்தல் தாங்கள் அவசியமென்று கருதும் நிலையில் மட்டும் மேற்கொள்ள வேண்டுகிறோம். தாங்கள் தேவையில்லாமல் இடையூறு செய்யும் நோக்கத்துடன் தவறான நகர்த்தலை மேற்கொள்ளாதிருக்கவும் வேண்டுகிறோம்.",
        "movepagetext-noredirectfixer": "கீழேயுள்ள படிவத்தை பயன்படுத்துவது பக்கத்தின் பெயரை மாற்றும்,மேலும் அதன் அனைத்து வரலாற்றையும் புதிய பெயருக்கு நகர்த்தும்.\nபழைய தலைப்பு புதிய தலைப்பின் மீள்வழிப்படுத்தும் பக்கமாக மாறிவிடும்.\nஇதை உறுதியாக சரிபார்க்க [[Special:DoubleRedirects|இரட்டை]] அல்லது [[Special:BrokenRedirects|உடைந்த  மீள்வழிப்படுத்துதல் ]] .\nஇணைப்புகள் தாங்கள் எங்கு செல்லவேண்டுமோ அங்கு செல்கிறதா என்பதை உறுதிப்படுத்துவது தங்களின் பொறுப்பு ஆகும்.\n\nபுதிய  தலைப்பில் ஏற்கனவே ஒரு பக்கம் இருந்தால் அந்த பக்கம் காலியாகவோ அல்லது  மீள்வழிப்படுத்தப்பட்ட பக்கமாகவோ அல்லது பழைய திருத்து வரலாறு எதுவும் இல்லாமலோ இருக்க வேண்டும்.இல்லையெனில் குறித்துக்கொள்ளுங்கள் பக்கம் புதிய தலைப்பிற்கு மாற்றப்படாது.\nஇதன்படி நீங்கள் ஏதேனும் தவறு செய்திருந்தால் அந்த பக்கத்தை பழையபடி பெயர்மாற்றிக்கொள்ளலாம்,மேலும் உங்களால் ஏற்கவே உள்ள ஒரு  பக்கத்தை மேலெழுத இயலாது.\n\n'\"எச்சரிக்கை\"'\nஇது ஒரு பிரபலமான பக்கத்தின் கடுமையான மற்றும் எதிர்பாராத மாற்றமாக இருக்கலாம்.\nதயவுசெய்து இதை செய்வதற்கு முன் இதன் விளைவுகளை புரிந்து கொண்டீர்கள் எனபதில் உறுதியாய் இருங்கள்.",
        "movepagetalktext": "*நீங்கள் பக்கத்தைப் பெயர்வெளிகளிடையே நகர்த்துகிறீர்கள் என்றோ,\n*ஒரு வெறுமையில்லாத பேச்சுப் பக்கம் புதிய பெயரில் ஏற்கெனவேயிருந்தோ, அல்லது\n*நீங்கள் கீழேயுள்ள கட்டத்தில் குறியிடாமல் விடுகிறீர்கள் என்றோ.\n'''இல்லாவிடில்''' சேர்ந்திருக்கும் பேச்சுப் பக்கம், ஏதாவது இருந்தால், தன்னியக்கமாக அதனுடன் நகர்த்தப்படும்.\nஇப்படியான சந்தர்ப்பங்களில், விரும்பினால், நகர்த்தலையோ அல்லது ஒன்றிணைத்தலையோ நீங்கள் கைவினையாகச் செய்யவேண்டியிருக்கும்.",
-       "movearticle": "பக்கத்தை நகர்த்து",
        "moveuserpage-warning": "'''எச்சரிக்கை:''' நீங்கள் ஒரு பயனர் பக்கத்தை நகர்த்த முயல்கிறீர்கள். தயவுகூர்ந்து குறித்துக் கொள்ளுங்கள் பக்கம் மட்டுமே நகர்த்தப்படும் மற்றும் பயனரின் பெயர் மாற்றப்படாது.",
        "movenologintext": "இப் பக்கத்தை நகர்த்துவதற்கு, நீங்கள் ஒரு பதிவு செய்யப்பட்ட பயனராயும் [[Special:UserLogin|புகுபதிகை செய்தும்]] இருக்க வேண்டும்.",
        "movenotallowed": "உங்களுக்கு பக்கங்களை நகர்த்த அனுமதி கிடையாது.",
        "api-error-badaccess-groups": "இந்த விக்கிக்குக் கோப்புகளைப் பதிவேற்றுவதற்கு நீங்கள் அனுமதிக்கப்படவில்லை.",
        "api-error-badtoken": "உள்ளகப் பிழை: தவறான அடையாளம்.",
        "api-error-copyuploaddisabled": "உரலி மூலம் பதிவேற்றுவது இந்த வழங்கியில் செயலிழக்கச் செய்யப்பட்டுள்ளது.",
-       "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
-       "api-error-duplicate-archive": "ஏற்கனவே இத்தளத்தில் இதே உள்ளடக்கத்தைக் கொண்ட {{PLURAL:$1|கோப்பு [$2 இருந்தது]|[$2 கோப்புகள் இருந்தன]}}, ஆனால் {{PLURAL:$1|அது நீக்கப்பட்டுவிட்டது|அவை நீக்கப்பட்டுவிட்டன.}}",
-       "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file|files}} that have already been deleted",
-       "api-error-duplicate-popup-title": "போலி {{PLURAL:$1|கோப்பு|கோப்புகள்}}",
+       "api-error-duplicate": "There {{PLURAL:$1|is another file|are some other files}} already on the site with the same content.",
+       "api-error-duplicate-archive": "ஏற்கனவே இத்தளத்தில் இதே உள்ளடக்கத்தைக் கொண்ட {{PLURAL:$1|கோப்பு இருந்தது|கோப்புகள் இருந்தன}}, ஆனால் {{PLURAL:$1|அது நீக்கப்பட்டுவிட்டது|அவை நீக்கப்பட்டுவிட்டன.}}",
        "api-error-empty-file": "நீங்கள் அளித்த கோப்பு காலியாக உள்ளது.",
        "api-error-emptypage": "புதிய, காலி பக்கங்கள் உருவாக்கல் அனுமதிக்கப்படவில்லை.",
        "api-error-fetchfileerror": "உள்ளகப் பிழை: கோப்பைப் பெறுகையில் ஏதோ தவறு நேர்ந்துவிட்டது.",
index 886f757..c6d54cb 100644 (file)
@@ -22,7 +22,8 @@
                        "రాకేశ్వర",
                        "వైజాసత్య",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "లంకె క్రీగీత:",
        "mergehistory-go": "విలీనం చెయ్యదగ్గ దిద్దుబాట్లను చూపించు",
        "mergehistory-submit": "కూర్పులను విలీనం చెయ్యి",
        "mergehistory-empty": "ఏ కూర్పులనూ విలీనం చెయ్యలేము.",
-       "mergehistory-success": "[[:$1]] యొక్క $3 {{PLURAL:$3|కూర్పుని|కూర్పులను}} [[:$2]] లోనికి జయప్రదంగా విలీనం చేసాం.",
+       "mergehistory-done": "$1 యొక్క $3 {{PLURAL:$3|కూర్పుని|కూర్పులను}} [[:$2]] లోనికి జయప్రదంగా విలీనం చేసాం.",
        "mergehistory-fail": "చరితాన్ని విలీనం చెయ్యలేకపోయాం. పేజీని, సమయాలను సరిచూసుకోండి.",
        "mergehistory-no-source": "మూలం పేజీ, $1 లేదు.",
        "mergehistory-no-destination": "గమ్యం పేజీ, $1 లేదు.",
        "movepagetext": "కింది ఫారం ఉపయోగించి, ఓ పేజీ పేరు మార్చవచ్చు. దాంతో పాటు దాని చరిత్ర అంతా కొత్త పేజీ చరిత్రగా మారుతుంది.\nపాత పేజీ కొత్త దానికి దారిమార్పు పేజీ అవుతుంది.\nపాత పేజీకి ఉన్న దారిమార్పు పేజీలను ఆటోమెటిగ్గా సరిచేయవచ్చు.\nఆలా చేయవద్దనుకుంటే, [[Special:DoubleRedirects|జమిలి]] లేదా [[Special:BrokenRedirects|పనిచేయని దారిమార్పులు]] ఉన్నాయేమో సరిచూసుకోండి.\nలింకులన్నీ అనుకున్నట్లుగా చేరవలసిన చోటికే చేరుతున్నాయని నిర్ధారించుకోవలసిన బాధ్యత మీదే.\n\nఒకవేళ కొత్త పేరుతో ఇప్పటికే ఒక పేజీ ఉండి ఉంటే (అది గత మార్పుల చరిత్ర లేని ఖాళీ పేజీనో లేదా దారిమార్పు పేజీనో కాకపోతే) తరలింపు '''జరగదు'''.\nఅంటే మీరు పొరపాటు చేస్తే కొత్త పేరును మార్చి తిరిగి పాత పేరుకు తీసుకురాగలరు కానీ ఇప్పటికే వున్న పేజీని తుడిచివేయలేరు.\n\n<strong>హెచ్చరిక!</strong>\nఇది జనరంజకమైన పేజీలకు అనుకోని, తీవ్రమైన మార్పు కావచ్చు;\nదాని పరిణామాలను అర్ధం చేసుకుని ముందుకుసాగండి.",
        "movepagetext-noredirectfixer": "కింది ఫారాన్ని వాడి, ఓ పేజీ పేరు మార్చవచ్చు. దాని చరిత్ర పూర్తిగా కొత్త పేరుకు తరలిపోతుంది. \nపాత శీర్షిక కొత్తదానికి దారిమార్పు పేజీగా మారిపోతుంది.\n[[Special:DoubleRedirects|double]] లేదా [[Special:BrokenRedirects|broken redirects]] లను చూడటం మరువకండి.\nలింకులు వెళ్ళాల్సిన చోటికి వెళ్తున్నాయని నిర్ధారించుకోవాల్సిన బాధ్యత మీదే.\nకొత్త పేరుతో ఈసరికే ఏదైనా పేజీ ఉంటే - అది ఖాళీగా ఉన్నా లేక మార్పుచేర్పుల చరిత్ర ఏమీ లేని దారిమార్పు పేజీ అయినా తప్ప- తరలింపు ’’’జరుగదు’’’ అని గమనించండి.\nఅంటే, ఏదైనా పొరపాటు జరిగితే పేరును తిరిగి పాత పేరుకే మార్చగలరు తప్ప, ఈపాటికే ఉన్న పేజీపై ఓవరరైటు చెయ్యలేరు.\n\n'''హెచ్చరిక!'''\nబహుళ వ్యాప్తి పొందిన ఓ పేజీలో ఈ మార్పు చాలా తీవ్రమైనది, ఊహించనిదీ అవుతుంది.\nదాని పర్యవసానాలు అర్థం చేసుకున్నాకే ముందుకు వెళ్ళండి.",
        "movepagetalktext": "దానితో పాటు సంబంధిత చర్చా పేజీ కూడా ఆటోమాటిక్‌‌గా తరలించబడుతుంది, '''కింది సందర్భాలలో తప్ప:'''\n*ఒక నేంస్పేసు నుండి ఇంకోదానికి తరలించేటపుడు,\n*కొత్త పేరుతో ఇప్పటికే ఒక చర్చా పేజీ ఉంటే,\n*కింది చెక్‌బాక్సులో టిక్కు పెట్టకపోతే.\n\nఆ సందర్భాలలో, మీరు చర్చా పేజీని కూడా పనిగట్టుకుని తరలించవలసి ఉంటుంది, లేదా ఏకీకృత పరచవలసి ఉంటుంది.",
-       "movearticle": "పేజీని తరలించు",
        "moveuserpage-warning": "'''హెచ్చరిక:''' మీరు ఒక వాడుకరి పేజీని తరలించబోతున్నారు. పేజీ మాత్రమే తరలించబడుతుందనీ, వాడుకరి పేరుమార్పు జరగదనీ గమనించండి.",
        "movenologintext": "పేజీని తరలించడానికి మీరు [[Special:UserLogin|లాగిన్‌]] అయిఉండాలి.",
        "movenotallowed": "పేజీలను తరలించడానికి మీకు అనుమతి లేదు.",
        "api-error-badaccess-groups": "ఈ వికీ లోనికి దస్త్రాలను ఎక్కించే అనుమతి మీకు లేదు.",
        "api-error-badtoken": "అంతర్గత లోపం: చెడు టోకెన్.",
        "api-error-copyuploaddisabled": "URL ద్వారా ఎక్కించడం ఈ సర్వరులో అశక్తం చెయ్యబడింది.",
-       "api-error-duplicate": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|[$2 మరో ఫైలు] ఉంది|[$2 ఇతర ఫైళ్ళు] ఉన్నాయి}}.",
-       "api-error-duplicate-archive": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|[$2 మరో ఫైలు] ఉండేది|[$2 ఇతర ఫైళ్ళు] ఉండేవి}}. అయితే {{PLURAL:$1|అది తొలగించబడింది|అవి తొలగించబడ్డాయి}}.",
-       "api-error-duplicate-archive-popup-title": "నకిలీ {{PLURAL:$1|దస్త్రాన్ని|దస్త్రాలను}} ఇప్పటికే తొలగించారు.",
-       "api-error-duplicate-popup-title": "నకిలీ {{PLURAL:$1|దస్త్రం|దస్త్రాలు}}.",
+       "api-error-duplicate": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|మరో ఫైలు ఉంది|ఇతర ఫైళ్ళు ఉన్నాయి}}.",
+       "api-error-duplicate-archive": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|మరో ఫైలు ఉండేది|ఇతర ఫైళ్ళు ఉండేవి}}. అయితే {{PLURAL:$1|అది తొలగించబడింది|అవి తొలగించబడ్డాయి}}.",
        "api-error-empty-file": "మీరు దాఖలుచేసిన ఫైల్ ఖాళీది.",
        "api-error-emptypage": "కొత్త మరియు ఖాళీ పేజీలను సృష్టించడానికి అనుమతి లేదు.",
        "api-error-fetchfileerror": "అంతర్గత లోపం: ఈ ఫైలును తేవడంలో ఏదో తప్పు జరిగింది.",
index 5fa4535..88b73fd 100644 (file)
        "mergehistory-go": "Намоиши вироишҳои қобили идғом",
        "mergehistory-submit": "Идғом нусхаҳо",
        "mergehistory-empty": "Ҳеҷ як нусхаҳо қобили идғом нестанд.",
-       "mergehistory-success": "$3 {{PLURAL:$3|нусха|нусхаҳо}} аз [[:$1]] бо муваффақият ба [[:$2]] идғом шуд.",
+       "mergehistory-done": "$3 {{PLURAL:$3|нусха|нусхаҳо}} аз $1 бо муваффақият ба [[:$2]] идғом шуд.",
        "mergehistory-fail": "Идғоми таърих мумкин нест, лутфан параметрҳои саҳифа ва вақтро бозбинӣ кунед.",
        "mergehistory-no-source": "Саҳифаи манбаъ $1 вуҷуд надорад.",
        "mergehistory-no-destination": "Саҳифаи мақсад $1 вуҷуд надорад.",
        "filerevert-legend": "Вогардонии парванда",
        "filerevert-intro": "Шумо дар ҳоли вогардонии '''[[Media:$1|$1]]''' ба [$4 нусхаи аз $3, $2] ҳастед.",
        "filerevert-comment": "Сабаб:",
-       "filerevert-defaultcomment": "Вогардонӣ ба нусхаи $2, $1",
+       "filerevert-defaultcomment": "Вогардонӣ ба нусхаи $2, $1 ($3)",
        "filerevert-submit": "бирав",
        "filerevert-success": "'''[[Media:$1|$1]]''' вогардонида шуд ба [нусхаи $4 аз таърихи $3, $2].",
        "filerevert-badversion": "Нусхаи кӯҳнатаре аз ин парванда вуҷуд надошт.",
        "move-page-legend": "Кӯчонидани саҳифа",
        "movepagetext": "Бо истифодаи аз формаи зерин номи саҳифа тағйир хоҳад шуд, ва тамоми таърихаш ба номи ҷадид кӯчонида хоҳад шуд.\nУнвони пешина табдил ба як саҳифаи масир ба унвони ҷадид хоҳад шуд.\nПайвандҳо ба унвони пешинаи саҳифа тағйир нахоҳанд кард; ҳатман тағйири масирҳои [[Special:DoubleRedirects|дутоӣ]] ё [[Special:BrokenRedirects|шикастаро]] барраси кунед.\nШумо масъул итминон ҳастед ки ин пайвандҳо ҳанӯз ба ҳамон ҷое ки қарор аст бираванд.\n\nТаваҷҷӯҳ кунед, ки агар саҳифае дар унвони ҷадид вуҷуд дошта бошад саҳифа кӯчонида '''нахоҳад шуд''', магар ин ки саҳифа холӣ ё тағйири масир бошад ва таърихи вироиши надошта бошад.\nИн яъне иштибоҳ агар иштибоҳ кардед метавонед саҳифаро ба ҳамон ҷое ки аз он кӯчонида шуда буд баргардонед, ва ин ки наметавонед рӯи саҳифаҳои мавҷудбуда бинависед.\n\n'''ҲУШДОР!'''\nКӯчонидани саҳифаҳо ба номи ҷадид мумкин аст тағйири асосӣ ва ғайримунтазире барои саҳифаҳои машҳур бошад;\nлутфан мутмаин шавед ки пеш аз кӯчонидани саҳифа, оқибати ин корро дарк мекунед.",
        "movepagetalktext": "Саҳифаи баҳси марбута, агар вуҷуд дошта бошад, ба таври худкорӣ ҳамроҳ бо мақолаи аслӣ кӯчонида хоҳад шуд '''магар инки:'''\n\n*як саҳифаи баҳси ғайрихолӣ таҳти ин номи ҷадид вуҷуд дошта бошад, ё\n*ҷаъбаи зерро тик назада бошед.\n\nДар он ҳолатҳо, саҳифаро бояд ба таври дастӣ кӯчонид ва ё ду саҳифаро бо вироиш як кунед.",
-       "movearticle": "Кӯчонидани саҳифа:",
        "movenologintext": "Барои кӯчонидани саҳифа шумо бояд корбари сабтшуда ва [[Special:UserLogin|ба систем вурудшуда]] бошед.",
        "movenotallowed": "Шумо иҷозати кӯчонидани саҳифаҳоро дар Википедиа надоред.",
        "movenotallowedfile": "Шумо иҷозати интиқоли парвандаҳоро надоред.",
index 3ee9ca5..741a9e7 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Kaganer",
                        "Liangent",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Zerpajvandho xat kaşida şavand:",
        "mergehistory-go": "Namoişi viroişhoi qobili idƣom",
        "mergehistory-submit": "Idƣom nusxaho",
        "mergehistory-empty": "Heç jak nusxaho qobili idƣom nestand.",
-       "mergehistory-success": "$3 {{PLURAL:$3|nusxa|nusxaho}} az [[:$1]] bo muvaffaqijat ba [[:$2]] idƣom şud.",
+       "mergehistory-done": "$3 {{PLURAL:$3|nusxa|nusxaho}} az $1 bo muvaffaqijat ba [[:$2]] idƣom şud.",
        "mergehistory-fail": "Idƣomi ta'rix mumkin nest, lutfan parametrhoi sahifa va vaqtro bozbinī kuned.",
        "mergehistory-no-source": "Sahifai manba' $1 vuçud nadorad.",
        "mergehistory-no-destination": "Sahifai maqsad $1 vuçud nadorad.",
        "filerevert-legend": "Vogardoniji parvanda",
        "filerevert-intro": "Şumo dar holi vogardoniji '''[[Media:$1|$1]]''' ba [$4 nusxai az $3, $2] hasted.",
        "filerevert-comment": "Tavzeh:",
-       "filerevert-defaultcomment": "Vogardonī ba nusxai $2, $1",
+       "filerevert-defaultcomment": "Vogardonī ba nusxai $2, $1 ($3)",
        "filerevert-submit": "birav",
        "filerevert-success": "'''[[Media:$1|$1]]''' vogardonida şud ba [nusxai $4 az ta'rixi $3, $2].",
        "filerevert-badversion": "Nusxai kūhnatare az in parvanda vuçud nadoşt.",
        "mailnologin": "Nişonae az firistanda vuçud nadorad",
        "mailnologintext": "Baroi firistodani poctai elektronī baroi korbaroni digar bojad [[Special:UserLogin|ba sistem vorid şaved]] va nişonai poctai elektroniji mū'tabar dar [[Special:Preferences|tarçihoti]] xud doşta boşed.",
        "emailuser": "Firistodani email ba in korbar",
-       "emailpage": "Poctai elektronī ba korbar",
        "defemailsubject": "Vikipedia e-mail",
        "noemailtitle": "Nişonai poctai elektronī mavçud nest",
        "emailfrom": "Az:",
        "move-page-legend": "Kūconidani sahifa",
        "movepagetext": "Bo istifodai az formai zerin nomi sahifa taƣjir xohad şud, va tamomi ta'rixaş ba nomi çadid kūconida xohad şud.\nUnvoni peşina tabdil ba jak sahifai masir ba unvoni çadid xohad şud.\nPajvandho ba unvoni peşinai sahifa taƣjir naxohand kard; hatman taƣjiri masirhoi [[Special:DoubleRedirects|dutoī]] jo [[Special:BrokenRedirects|şikastaro]] barrasi kuned.\nŞumo mas'ul itminon hasted ki in pajvandho hanūz ba hamon çoe ki qaror ast biravand.\n\nTavaççūh kuned, ki agar sahifae dar unvoni çadid vuçud doşta boşad sahifa kūconida '''naxohad şud''', magar in ki sahifa xolī jo taƣjiri masir boşad va ta'rixi viroişi nadoşta boşad.\nIn ja'ne iştiboh agar iştiboh karded metavoned sahifaro ba hamon çoe ki az on kūconida şuda bud bargardoned, va in ki nametavoned rūi sahifahoi mavçudbuda binavised.\n\n'''HUŞDOR!'''\nKūconidani sahifaho ba nomi çadid mumkin ast taƣjiri asosī va ƣajrimuntazire baroi sahifahoi maşhur boşad;\nlutfan mutmain şaved ki peş az kūconidani sahifa, oqibati in korro dark mekuned.",
        "movepagetalktext": "Sahifai bahsi marbuta, agar vuçud doşta boşad, ba tavri xudkorī hamroh bo maqolai aslī kūconida xohad şud '''magar inki:'''\n\n*jak sahifai bahsi ƣajrixolī tahti in nomi çadid vuçud doşta boşad, jo\n*ça'bai zerro tik nazada boşed.\n\nDar on holatho, sahifaro bojad ba tavri dastī kūconid va jo du sahifaro bo viroiş jak kuned.",
-       "movearticle": "Kūconidani sahifa:",
        "movenologintext": "Baroi kūconidani sahifa şumo bojad korbari sabtşuda va [[Special:UserLogin|ba sistem vurudşuda]] boşed.",
        "movenotallowedfile": "Şumo içozati intiqoli parvandahoro nadored.",
        "cant-move-user-page": "Şumo içozat nadored sahifahoi korbariji sarşoxaro intiqol dihed.",
index b0ce154..ae3eeb6 100644 (file)
        "nstab-template": "แม่แบบ",
        "nstab-help": "หน้าวิธีใช้",
        "nstab-category": "หมวดหมู่",
+       "mainpage-nstab": "หน้าหลัก",
        "nosuchaction": "ไม่มีปฏิบัติการดังกล่าว",
        "nosuchactiontext": "การกระทำที่กำหนดผ่านยูอาร์แอลดังกล่าวไม่สามารถใช้ได้\nคุณอาจกรอกยูอาร์แอลผิด หรือมาตามลิงก์ที่ไม่ถูกต้อง\nหรืออาจเกิดจากข้อผิดพลาดในซอฟต์แวร์ซึ่ง {{SITENAME}} ใช้อยู่",
        "nosuchspecialpage": "ไม่มีหน้าพิเศษดังกล่าว",
        "actionthrottled": "ปฏิบัติการถูกจำกัด",
        "actionthrottledtext": "เพื่อเป็นมาตรการป้องกันสแปม คุณจึงถูกจำกัดมิให้กระทำสิ่งนี้ไม่ให้ติดต่อกันหลายครั้งเกินไปในช่วงระยะเวลาสั้น ๆ ซึ่งขณะนี้คุณเลยขีดจำกัดนี้แล้ว \nกรุณารอสักครู่แล้วลองอีกครั้ง",
        "protectedpagetext": "หน้านี้ถูกล็อกเพื่อป้องกันการแก้ไขหรือปฏิบัติการอื่น",
-       "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้:",
+       "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้",
        "viewyourtext": "คุณสามารถดูและคัดลอกต้นฉบับ<strong>การแก้ไขของคุณ</strong>มาหน้านี้ได้",
        "protectedinterface": "หน้านี้เป็นข้อความส่วนต่อประสานสำหรับซอฟต์แวร์บนวิกินี้ และถูกล็อกเพื่อป้องกันการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
        "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
        "createacct-captcha": "ตรวจสอบความปลอดภัย",
        "createacct-imgcaptcha-ph": "กรอกข้อความที่คุณเห็นด้านบน",
        "createacct-submit": "สร้างบัญชีของคุณ",
-       "createacct-another-submit": "สรà¹\89าà¸\87อีà¸\81à¸\9aัà¸\8dà¸\8aี",
+       "createacct-another-submit": "สร้างบัญชี",
        "createacct-benefit-heading": "{{SITENAME}}สร้างจากคนเช่นคุณ",
        "createacct-benefit-body1": "$1 การแก้ไข",
        "createacct-benefit-body2": "$1 หน้า",
        "passwordreset-emailsent": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว",
        "passwordreset-emailsent-capture": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง",
        "passwordreset-emailerror-capture": "อีเมลตั้งรหัสผ่านใหม่ถูกสร้างขึ้นแล้ว ซึ่งแสดงด้านล่าง แต่ไม่สามารถส่งไปยัง{{GENDER:$2|ผู้ใช้}}: $1",
-       "changeemail": "เปลี่ยนที่อยู่อีเมล",
-       "changeemail-text": "กรอกแบบนี้เพื่อเปลี่ยนที่อยู่อีเมลของคุณ คุณต้องกรอกรหัสผ่านเพื่อยืนยันการเปลี่ยนแปลงนี้",
+       "changeemail": "à¹\80à¸\9bลีà¹\88ยà¸\99หรือลà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มล",
+       "changeemail-text": "กรอกแบบนี้เพื่อเปลี่ยนที่อยู่อีเมลของคุณ คุณต้องกรอกรหัสผ่านเพื่อยืนยันการเปลี่ยนแปลงนี้ หากคุณต้องการลบความสัมพันธ์กับที่อยู่อีเมลใด ๆ จากบัญชีของคุณ ให้เว้นว่างที่อยู่อีเมลใหม่เมื่อส่งแบบ",
        "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": "ไม่มีโทเค็นให้ตั้งใหม่",
        "permissionserrorstext-withaction": "คุณไม่มีสิทธิ$2 ด้วย{{PLURAL:$1|เหตุ|เหตุ}}ต่อไปนี้:",
        "recreate-moveddeleted-warn": "<strong>คำเตือน: คุณกำลังสร้างหน้าซึ่งได้ถูกลบไปก่อนหน้านี้แล้วอีกครั้ง</strong>\n\nคุณควรพิจารณาว่าการแก้ไขหน้านี้ต่อไปเหมาะสมหรือไม่\nปูมการลบและเปลี่ยนชื่อหน้านี้จัดไว้ด้านล่างเพื่อความสะดวก:",
        "moveddeleted-notice": "หน้านี้ถูกลบแล้ว\nปูมการลบและเปลี่ยนชื่อของหน้านี้แสดงไว้ด้านล่างเพื่ออ้างอิง",
+       "moveddeleted-notice-recent": "ขออภัย หน้านี้เพิ่งถูกลบ (ใน 24 ชั่วโมงล่าสุด)\nปูมการลบและย้ายสำหรับหน้านี้อยู่ด้านล่างเพื่อการอ้างอิง",
        "log-fulllog": "ดูปูมแบบเต็ม",
        "edit-hook-aborted": "การแก้ไขถูกฮุกยกเลิก\nไม่ได้ให้คำอธิบาย",
        "edit-gone-missing": "ไม่สามารถปรับหน้าดังกล่าวได้\nดูเหมือนถูกลบแล้ว",
        "mergehistory-go": "แสดงการแก้ไขที่รวมได้",
        "mergehistory-submit": "รวมรุ่นปรับปรุง",
        "mergehistory-empty": "ไม่มีรุ่นปรับปรุงที่รวมได้",
-       "mergehistory-success": "รวม $3 รุ่นปรับปรุงของ [[:$1]] เข้ากับ [[:$2]] แล้ว",
+       "mergehistory-done": "รวม $3 รุ่นปรับปรุงของ $1 เข้ากับ [[:$2]] แล้ว",
        "mergehistory-fail": "ไม่สามารถรวมประวัติได้ โปรดตรวจสอบตัวแปรเสริมหน้าและเวลาอีกครั้ง",
        "mergehistory-no-source": "ไม่มีหน้าต้นทาง $1",
        "mergehistory-no-destination": "ไม่มีหน้าปลายทาง $1",
        "prefs-watchlist-token": "โทเค็นรายการเฝ้าดู:",
        "prefs-misc": "เบ็ดเตล็ด",
        "prefs-resetpass": "เปลี่ยนรหัสผ่าน",
-       "prefs-changeemail": "เปลี่ยนที่อยู่อีเมล",
+       "prefs-changeemail": "à¹\80à¸\9bลีà¹\88ยà¸\99หรือลà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มล",
        "prefs-setemail": "ตั้งที่อยู่อีเมล",
        "prefs-email": "ตัวเลือกอีเมล",
        "prefs-rendering": "รูปลักษณ์",
        "recentchangeslinked-summary": "นี่คือรายการเปลี่ยนแปลงล่าสุดของหน้าที่ถูกลิงก์จากหน้าเฉพาะ (หรือไปสมาชิกของหมวดหมู่เฉพาะ)\nหน้าใน[[Special:Watchlist|รายการเฝ้าดูของคุณ]]แสดงเป็น<strong>ตัวหนา</strong>",
        "recentchangeslinked-page": "ชื่อหน้า:",
        "recentchangeslinked-to": "แสดงการเปลี่ยนแปลงไปหน้าซึ่งโยงไปหน้าที่ระบุแทน",
+       "recentchanges-page-added-to-category": "[[:$1]] ถูกเพิ่มเข้าหมวดหมู่",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] และ $2 หน้าถูกเพิ่มเข้าหมวดหมู่",
+       "recentchanges-page-removed-from-category": "[[:$1]] ถูกลบจากหมวดหมู่",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] และ $2 หน้าถูกลบจากหมวดหมู่",
+       "autochange-username": "การเปลี่ยนแปลงอัตโนมัติมีเดียวิกิ",
        "upload": "อัปโหลดไฟล์",
        "uploadbtn": "อัปโหลดไฟล์",
        "reuploaddesc": "ยกเลิกการอัปโหลดและกลับไปยังแบบอัปโหลด",
        "upload-http-error": "เกิดข้อผิดพลาดเอชทีทีพี: $1",
        "upload-copy-upload-invalid-domain": "ไม่สามารถคัดลอกการอัปโหลดจากโดเมนนี้",
        "upload-dialog-title": "อัปโหลดไฟล์",
-       "upload-dialog-error": "เกิดข้อผิดพลาด",
-       "upload-dialog-warning": "เกิดคำเตือน",
        "upload-dialog-button-cancel": "ยกเลิก",
        "upload-dialog-button-done": "เสร็จสิ้น",
        "upload-dialog-button-save": "บันทึก",
        "upload-dialog-button-upload": "อัปโหลด",
-       "upload-dialog-label-select-file": "เลือกไฟล์",
-       "upload-dialog-label-infoform-title": "รายละเอียด",
-       "upload-dialog-label-infoform-name": "ชื่อ",
-       "upload-dialog-label-infoform-description": "คำอธิบาย",
-       "upload-dialog-label-usage-title": "การใช้",
-       "upload-dialog-label-usage-filename": "ชื่อไฟล์",
+       "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": "ชื่อไฟล์",
        "backend-fail-backup": "ไม่สามารถสำรองไฟล์ \"$1\"",
        "backend-fail-notexists": "ไม่มีไฟล์ $1",
        "backend-fail-delete": "ไม่สามารถลบไฟล์ \"$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": "ไม่มีรุ่นท้องถิ่นก่อนหน้าของไฟล์นี้ซึ่งมีตราเวลาที่กำหนด",
        "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โปรดทราบว่าหน้าดังกล่าวจะ'''ไม่'''ถูกย้าย ถ้ามีหน้าที่ใช้ชื่อเรื่องใหม่อยู่แล้ว เว้นแต่เป็นหน้าว่างหรือหน้าเปลี่ยนทาง และไม่มีประวัติการแก้ไขในอดีต\nซึ่งหมายความว่า คุณสามารถเปลี่ยนชื่อหน้ากลับเป็นชื่อเดิมได้หากคุณทำผิดพลาด และคุณไม่สามารถเขียนทับหน้าที่มีอยู่แล้วได้\n\n'''คำเตือน!'''\nสิ่งนี้อาจเป็นการเปลี่ยนแปลงที่รุนแรงและไม่คาดคิดสำหรับหน้าที่เป็นที่นิยม\nโปรดแน่ใจว่าคุณเข้าใจถึงผลลัพธ์นี้ก่อนที่จะดำเนินการต่อไป",
        "movepagetalktext": "หน้าพูดคุยของหน้านี้จะถูกเปลี่ยนชื่อตามไปโดยอัตโนมัติ<strong>เว้นแต่:</strong>\n*มีหน้าพูดคุยซึ่งไม่ว่างภายใต้ชื่อใหม่แล้ว หรือ\n*คุณไม่เลือกกล่องด้านล่าง\n\nในกรณีเหล่านี้ คุณจะต้องย้ายหรือรวมหน้าเองหากต้องการ",
-       "movearticle": "เปลี่ยนชื่อ",
        "moveuserpage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าผู้ใช้ โปรดทราบว่าหน้าผู้ใช้เท่านั้นที่จะถูกเปลี่ยนชื่อ แต่ผู้ใช้จะ<em>ไม่</em>ถูกเปลี่ยนชื่อ",
        "movecategorypage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าหมวดหมู่ โปรดทราบว่า จะย้ายเฉพาะหน้าและทุกหน้าในหมวดหมู่เก่าจะ<em>ไม่</em>ถูกจัดเข้าหมวดหมู่ใหม่",
        "movenologintext": "ถ้าต้องการเปลี่ยนชื่อหน้านี้ ต้องเป็นผู้ใช้ลงทะเบียนและ[[Special:UserLogin|ล็อกอิน]]",
        "cant-move-to-user-page": "คุณไม่มีสิทธิย้ายหน้าใด ๆ ไปเป็นหน้าผู้ใช้ (ยกเว้นหน้าย่อยของผู้ใช้)",
        "cant-move-category-page": "คุณไม่มีสิทธิย้ายหน้าหมวดหมู่",
        "cant-move-to-category-page": "คุณไม่มีสิทธิย้ายหน้าไปหน้าหมวดหมู่",
-       "newtitle": "à¹\84à¸\9bà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88:",
+       "newtitle": "ชื่อเรื่องใหม่:",
        "move-watch": "เฝ้าดูหน้าต้นทางและหน้าปลายทาง",
        "movepagebtn": "เปลี่ยนชื่อ",
        "pagemovedsub": "เปลี่ยนชื่อสำเร็จ",
        "logentry-newusers-create2": "บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1",
        "logentry-newusers-byemail": "บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1 และส่งรหัสผ่านไปทางอีเมลแล้ว",
        "logentry-newusers-autocreate": "บัญชีผู้ใช้ $1 ถูกสร้างขึ้นอัตโนมัติ",
+       "logentry-protect-move_prot": "$1 ย้ายการตั้งค่าการล็อกจาก $4 ไป $3",
+       "logentry-protect-unprotect": "$1 ลบการล็อกจาก $3",
+       "logentry-protect-protect": "$1 ล็อก $3 $4",
+       "logentry-protect-protect-cascade": "$1 ล็อก $3 $4 [ต่อเรียง]",
+       "logentry-protect-modify": "$1 เปลี่ยนระดับการตั้งค่าสำหรับ $3 $4",
+       "logentry-protect-modify-cascade": "$1 เปลี่ยนระดับการตั้งค่าสำหรับ $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 อัตโนมัติ",
index 305e972..5c9dc5b 100644 (file)
        "mergehistory-go": "Birleşdirip bolýan özgerdişleri görkez",
        "mergehistory-submit": "Wersiýalary birleşdir",
        "mergehistory-empty": "Hiç bir wersiýany birleşdirip bolmaýar.",
-       "mergehistory-success": "[[:$1]] sahypasynyň $3 {{PLURAL:$3|wersiýasy|wersiýasy}} şowlulyk bilen [[:$2]] sahypasyna birleşdirildi.",
+       "mergehistory-done": "$1 sahypasynyň $3 {{PLURAL:$3|wersiýasy|wersiýasy}} şowlulyk bilen [[:$2]] sahypasyna birleşdirildi.",
        "mergehistory-fail": "Geçmişi birleşdirmekligi amala aşyryp bolmaýar, sahypa we wagt parametrlerini gaýtadan barlamagyňyzy haýyş edýäris.",
        "mergehistory-no-source": "Çeşme sahypa $1 ýok.",
        "mergehistory-no-destination": "Niýetlenilýän sahypa $1 ýok.",
        "move-page-legend": "Adyny üýtget",
        "movepagetext": "Aşakdaky form ulanylyp, sahypanyň ady üýtgedilýär. Onuň ýany bilen tutuş geçmişi hem täze ada geçirilýär. Köne at täze adyň gönükdirmesine öwrülýär. Köne ada gönükdirmeleri awtomatik usulda täzeläp bilersiňiz. Bu amaly awtomatik usulda ýerine ýetirmek islemeseňiz, onda ähli [[Special:DoubleRedirects|jübüt]] ýa-da [[Special:BrokenRedirects|üzlem-saplam]] gönükdirmeleri özüňiz düzetmeli bolýarsyňyz.\nEtjek bu üýtgeşmäňiz boýunça ähli çykgytlaryň bolmalysy ýaly işlemegine siziň özüňiziň jogapkärçilik çekýändigiňizi ýatdan çykarmaň.\n\nEger-de täze atda ozaldan bir makala bar bolsa, onda '''at üýtgedilmeli däldir'''. Şeýle hem, ady üýtgedeniňize ökünseňiz, üýtgeşmäni yzyna gaýtaryp bilersiňiz we başga hiç bir sahypa degmedigiňiz bolar.\n\n'''DUÝDURYŞ!'''\nBu üýtgeşiklik giňden tanalýan bir sahypa üçin garaşylmaýan netijelere getirip biler; Ady heniz üýtgetmänkäňiz bolup biläýjek ähtimallyklary göz öňünde tutmagyňyzy haýyş edýäris.",
        "movepagetalktext": "Gapdalyndaky çekişme sahypasy hem (eger bar bolsa) awtomatik usulda täze ada geçirilýär. Emma şu ýagdaýlarda '''geçirilmeýär''':\n\n*Täze atda bir çekişme sahypasy öňdenem bar bolsa,\n*Aşakdaki gutujygy saýlamadyk bolsaňyz.\n\nŞeýle ýagdaýda sahypany özüňiz ell bilen geçirmeli bolýarsyňyz.",
-       "movearticle": "Köne at",
        "moveuserpage-warning": "'''Üns beriň:''' Bir ulanyjy sahypasyny geçirjek bolup dursuňyz. Diňe sahypanyň geçiriljekdigine, emma ulanyjynyň ''adynyň üýtgedilmejekdigine'' üns beriň.",
        "movenologintext": "Sahypanyň adyny üýtgetmek üçin hasap açan bolmagyňyz hem-de [[Special:UserLogin|sessiýaňyzyň açyk]] bolmagy zerurdyr.",
        "movenotallowed": "Sahypalaryň adyny üýtgetmäge rugsadyňyz ýok.",
index f3cb696..5807063 100644 (file)
@@ -14,7 +14,9 @@
                        "לערי ריינהארט",
                        "아라",
                        "Ianlopez1115",
-                       "Leeheonjin"
+                       "Leeheonjin",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Pagsasalungguhit ng link:",
        "mergehistory-go": "Ipakita ang mga pagbabagong mapagsasanib",
        "mergehistory-submit": "Pagsanibin ang mga pagbabago",
        "mergehistory-empty": "Walang mga pagbabagong mapagsasanib.",
-       "mergehistory-success": "$3 {{PLURAL:$3|pagbabago|pagbabago}} ng [[:$1]] ay matagumpay na naisanib sa [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|pagbabago|pagbabago}} ng $1 ay matagumpay na naisanib sa [[:$2]].",
        "mergehistory-fail": "Hindi magawa ang pagsasanib ng kasaysayan, pakisuri ang parametro ng pahina at oras.",
        "mergehistory-no-source": "Hindi umiiral ang pagmumulang pahinang $1.",
        "mergehistory-no-destination": "Hindi umiiral ang patutunguhang pahinang $1.",
        "filerevert-legend": "Ibalik ang talaksan",
        "filerevert-intro": "<span class=\"plainlinks\">Ibinabalik mo sa dati ang '''[[Media:$1|$1]]''' patungo sa [$4 bersyon noong $3, $2].</span>",
        "filerevert-comment": "Dahilan:",
-       "filerevert-defaultcomment": "Ibinalik sa dating bersyon mula pa noong $2, $1",
+       "filerevert-defaultcomment": "Ibinalik sa dating bersyon mula pa noong $2, $1 ($3)",
        "filerevert-submit": "Ibalik",
        "filerevert-success": "<span class=\"plainlinks\">Ibinalik sa dati ang '''[[Media:$1|$1]]''' patungo sa [$4 bersyon noong $3, $2].</span>",
        "filerevert-badversion": "Walang nakaraang lokal/katutubong bersyon para sa talaksang ito na may kasamang ibinigay na <i>tatak ng oras</i>.",
        "movepagetext": "Mapapalitan ang pangalan ng isang pahina kapag ginamit mo ang pormularyong nasa ibaba, malilipat ang lahat ng kasaysayan nito patungo sa bagong pangalan.\nMagiging isang pahina ng panuto/panturo patungo sa bagong pamagat ang dati/lumang pangalan.\nMaaari mong isapanahon ang mga panutong tumuturo sa orihinal na pamagat sa pamamagitan ng kusang pamamaraan (paraang awtomatiko).\nKung pipiliin mong huwag gawin ito, dapat mong tiyakin kung may [[Special:DoubleRedirects|dalawahan o doble]] o [[Special:BrokenRedirects|bali o putol na mga panturo]].\nTungkulin mong tiyakin kung magpapatuloy sa pagturo ang mga kawing patungo sa dapat nilang puntahan.\n\nTandaan '''hindi''' ililipat ang pahina kapag mayroon nang isang pahina sa bagong pamagat, maliban na lamang kung wala itong laman o isang panuto/panturo at walang nakaraang kasaysayan ng pagbabago.\nNangangahulugan ito na maaari mong muling pangalanan ang isang pahina pabalik sa kung saan ito  muling pinangalanan/pinalitan ng pangalan kung sakaling magkamali ka, at hindi mo maaaring patungan/pangibabawan ang isang umiiral na pahina.\n\n'''BABALA!'''\nMaaaring itong maging isang marahas at hindi inaaasang pagbabago para sa isang bantog na pahina;\npakitiyak na nauunawaan mo ang mga kahihinatnan nito bago magpatuloy.",
        "movepagetext-noredirectfixer": "Ang paggamit ng pormularyo sa ibaba ay muling magpapangalan ng isang pahina, na maglilipat sa lahat ng kasaysayan nito papunta sa bagong pangalan.\nAng lumang pamagat ay magiging isang pahina binago ang pupuntahan papunta sa bagong pamagat.\nTiyaking suriin ang [[Special:DoubleRedirects|nagkadalawa]] o [[Special:BrokenRedirects|putol na mga pagpapapunta]].\nIkaw ang may pananagutan sa pagtitiyak na ang mga kawin ay patuloy na nakaturo kung saan sila dapat pumunta.\n\nTandaan na ang pahina ay '''hindi''' ililipat kung mayroon nang isang pahina sa bagong pamagat, maliban na lang kung wala itong laman o isang pagpapapunta sa ibang lugar at walang nakaraang kasaysayan ng pagbago.\nNangangahulugan ito na maaari mong muling pangalanan ang isang pahina pabalik sa kung saan ito nagsimulang muling pinangalanan kung nagkamali ka, at hindi mo mapangibabawan ang isang umiiral na pahina.\n\n'''Babala!'''\nMaaari itong maging isang marahas at hindi inaasahang pagbabago para sa isang tanyag na pahina;\nmangyaring tiyakin na nauunawaan mo ang mga kahihinatnan nito bago magpatuloy.",
        "movepagetalktext": "Kusa/awtomatikong ililipat din ang mga kasama/kakabit na mga kaugnay na mga pahina '''maliban na lamang kung''':\n*Mayroon nang isang pahina ng usapang may laman na at umiiral na sa ilalim ng isang bagong pangalan, o\n*Hindi mo nilagyan ng tsek ang kahong nasa ibaba.\n\nSa mga kasong ganoon, kailangan mong ilipat o pagsamahin/pagsanibin ang pahina sa manwal o kinakamay na paraan kung nanaisin.",
-       "movearticle": "Ilipat ang pahina:",
        "moveuserpage-warning": "'''Babala:''' Ililipat mo ang isang pahina ng tagagamit. Pakitandaan na tanging ang pahina lamang ang malilipat at ''hindi'' babaguhin ang pangalan ng tagagamit.",
        "movenologintext": "Dapat na isa kang nagpatalang tagagamit at [[Special:UserLogin|nakalagdang papasok]] upang makapaglipat ng isang pahina.",
        "movenotallowed": "Wala kang permisong maglipat ng pahina.",
        "api-error-badaccess-groups": "Hindi ka pinapayagang makapagkarga ng mga talaksan papunta sa wiking ito.",
        "api-error-badtoken": "Panloob na kamalian: masamang kahalip.",
        "api-error-copyuploaddisabled": "Ang pagkakarga ng URL ay hindi pinagagana sa tagapaghaing ito.",
-       "api-error-duplicate": "May {{PLURAL:$1|[$2 ibang talaksan]g|[$2 ibang ilang mga talaksan]g}} nasa wiki na na may katulad na nilalaman",
-       "api-error-duplicate-archive": "Nagkaroon {{PLURAL:$1|dati ng [$2 iba pang talaksan]|dati ng mga [$2 ilang iba pang mga talaksan]}} na umiiral na sa sityo na may katulad na nilalaman, ngunit {{PLURAL:$1|ito ay|ito ay mga}} nabura na.",
-       "api-error-duplicate-archive-popup-title": "Nabura nang kakambal na {{PLURAL:$1|talaksan|mga talaksan}}",
-       "api-error-duplicate-popup-title": "Kagayang {{PLURAL:$1|talaksan|mga talaksan}}",
+       "api-error-duplicate": "May {{PLURAL:$1|ibang talaksang|ibang ilang mga talaksang}} nasa wiki na na may katulad na nilalaman",
+       "api-error-duplicate-archive": "Nagkaroon {{PLURAL:$1|dati ng iba pang talaksan|dati ng mga ilang iba pang mga talaksan}} na umiiral na sa sityo na may katulad na nilalaman, ngunit {{PLURAL:$1|ito ay|ito ay mga}} nabura na.",
        "api-error-empty-file": "Walang laman ang ipinasa mong talaksan.",
        "api-error-emptypage": "Lumilikha ng bago, hindi pinapayagan ang mga pahinang walang laman.",
        "api-error-fetchfileerror": "Panloob na kamalian: may naganap na pagkakamali habang kinukuha ang talaksan.",
index f8f2986..8342f9c 100644 (file)
@@ -4,7 +4,8 @@
                        "Cbrown1023",
                        "Tauʻolunga",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Ngaahi fehokotaki ʻoku laineʻi ʻi lalo:",
        "filerevert-legend": "Toe foki ʻa e faile ki hono tuʻunga muʻa",
        "filerevert-intro": "ʻOku ke toe foki ʻa e '''[[Media:$1|$1]]''' ki hono tuʻunga muʻa, paaki $4 ʻo e $2 $3.",
        "filerevert-comment": "Fakamatala:",
-       "filerevert-defaultcomment": "Kuo toe foki $1 ki hono tuʻunga muʻa ʻo e $2",
+       "filerevert-defaultcomment": "Kuo toe foki $1 ki hono tuʻunga muʻa ʻo e $2 ($3)",
        "filerevert-submit": "Toe foki ki hono tuʻunga muʻa",
        "filerevert-success": "Kuo toe foki ʻa e '''[[Media:$1|$1]]''' ki hono tuʻunga muʻa, paaki $4 ʻo e $2 $3.",
        "mimesearch": "Kumi fakaMIME",
        "listusers-submit": "ʻAsi mai",
        "mailnologin": "ʻOku ʻikai ha tuʻasila ke tohila ki ai",
        "emailuser": "Tohila ki he ʻetitá ni",
-       "emailpage": "Ko e ʻetita ʻene tohila",
        "emailpagetext": "Kapau kuo ʻoatu ʻe he ʻetita koʻeni haʻane tuʻasila tohila moʻoni ʻi heʻene faʻiteliha, ʻe ʻave ʻe he foomu ʻi lalo ha tala ʻe taha. Ko hoʻo tuʻasila tohila, naʻa ke ʻoatu ʻi hoʻo faʻiteliha, ʻe asi ia ʻi he feituʻu \"mei he\" ʻi he tohila ē, e fakamafeia kia te ia haʻane tali.",
        "defemailsubject": "Ko e tohila ʻo e {{SITENAME}}",
        "noemailtitle": "Hala ha tuʻasila tohila",
        "reverted": "Kuo foki ki he paaki mui",
        "deletecomment": "ʻUhinga",
        "rollback": "Ngaahi fatu he teka hifo",
-       "rollback_short": "Teka hifo",
        "rollbacklink": "teka hifo",
        "rollbackfailed": "Halaʻi teka hifo",
        "cantrollback": "Naʻe ʻikai lava fakafoki ʻa e fatu; ko e ʻetita fakamuimui ko e ʻetita ʻe taha pē ʻo e pēsí ni.",
        "move-page-legend": "Peesi ʻunu",
        "movepagetext": "Ngāueʻaki ʻa e foomu ʻi lalo, ʻe toe fakahingoaʻi ʻa e pēsí mo hono hisitōliá.\nʻE hoko ʻa e hingoa motuʻa ki he peesi leʻei ki he hingoa foʻou.\nʻE ʻikai liliu ʻa e ngaahi fehokotaki ki he hingoa motuʻa, e taau te ke sivi ʻa e leʻeleʻei mo e leʻei maumau. Ko ho fatongia ʻe tuhu ai pē ngaahi fehokotaki ki ʻenau peesi totonu.\n\nʻE ʻikai ʻunuʻi ʻa e peesi kapau ʻoku toe ʻi ai ha peesi mo e hingoa foʻou tatau, ngata pē ʻoka ʻi ai ha peesi taʻetohitohiʻi pe leʻei mo e ʻikai ha hisitōlia. Ko ia ai: ʻe lava te ke toe fakahingoa ʻa e peesi mei he hingoa motuʻa, kapu te ke hala, mo: ʻe ʻikai te ke lava tohi ke maumau ʻa e peesi ʻoku tuʻu.\n\n'''TOKANGA!''' Mahalo pē ʻe ʻi ai ha liliu mālohi kapau ʻoku manakoa ʻa e pēsí ni. ʻIlo ko e hā te ke fie fai. Kapau ʻikai pau, ʻoku sai ange ʻe ʻikai te ke fakaʻunu.",
        "movepagetalktext": "Ko e peesi alea ʻoku kau ki he pēsí ni, ʻe ʻunu ia mo e hono hoa, '''ngata pē ʻoka:'''\n*ha peesi ʻikai maha ʻoku toka tuʻu mo e hingoa tatau, pe\n*te ke tiki ʻa e puha ʻi lalo.\nʻI he meʻa ko ia, ʻe ʻunuʻi pe fakatahaʻi ʻa e peesi alea faiʻaki ʻa e nima.",
-       "movearticle": "ʻUnu ʻa e kupu",
        "movenologintext": "Kuo pau ko e ʻetita lēsisita koe pea [[Special:UserLogin|kau-ki-ai]] kapau te ke fieʻunu ha peesi.",
        "newtitle": "Ki he hingoa foʻou",
        "move-watch": "Leʻo he pēsí ni",
        "importinterwiki": "Hū mai ʻo e fakalava ''wiki''",
        "import-interwiki-history": "Hiki ko e paaki hisitōlia kotoa maʻa e pēsí ni",
        "import-interwiki-submit": "Hū mai",
-       "import-interwiki-namespace": "ʻAve ngaahi peesi ki he vā hingoa:",
        "import-comment": "Fakamatala:",
        "importtext": "Kātaki ʻe hū atu ʻa e faile mei he ''wiki'' tupunga ngāueʻaki ''Special:Export'', pea haofakiʻi ʻi hoʻo tisi, pea hū mai ia mei hē.",
        "importstart": "Hū mai ngaahi peesi...",
index 02d4ada..9b93108 100644 (file)
@@ -78,7 +78,9 @@
                        "Uğurkent",
                        "Kincki",
                        "McAang",
-                       "Captantrips"
+                       "Captantrips",
+                       "Diyapazon",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
@@ -92,7 +94,7 @@
        "tog-editondblclick": "Çift tıklayarak sayfaları düzenle",
        "tog-editsectiononrightclick": "Bölüm başlığına sağ tıklayarak bölüm düzenleyebilmeyi etkinleştir",
        "tog-watchcreations": "Oluşturduğum sayfaları ve yüklediğim dosyaları izleme listeme ekle",
-       "tog-watchdefault": "Düzenleme yaptığım sayfaları ve dosyaları izleme listeme ekle",
+       "tog-watchdefault": "Değişiklik yaptığım sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchmoves": "Taşıdığım sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchdeletion": "Sildiğim sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchrollback": "Geridönüş yaptığım sayfaları izleme listeme ekle",
        "newarticletext": "Henüz varolmayan bir sayfaya konulmuş bir bağlantıya tıkladınız.\nSayfayı oluşturmak için aşağıdaki metin kutusunu kullanın. ([$1 yardım sayfasına] bakınız).\nBuraya yanlışlıkla geldiyseniz tarayıcınızın  <strong>geri </strong> tuşuna tıklayın.",
        "anontalkpagetext": "----''Bu sayfa henüz bir kullanıcı hesabı oluşturmamış veya hesabını kullanmayan bir anonim kullanıcının mesaj sayfasıdır. Bu nedenle bu kişiyi belirtmek için rakamsal IP adresini kullanmak zorundayız. Bu gibi IP adresleri birçok kullanıcı tarafından paylaşılabilir. Eğer siz de bir anonim kullanıcıysanız ve size sizin ilginiz olmayan iletiler geliyorsa, lütfen diğer anonim kullanıcılarla olabilecek olan karmaşayı önlemek için [[Special:UserLogin/signup|bir hesap edinin]] veya [[Special:UserLogin|oturum açın]].''",
        "noarticletext": "Bu sayfa şu anda boştur.\nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları arayabilir],\nya da bu sayfayı [{{fullurl:{{FULLPAGENAME}}|action=edit}} değiştirebilirsiniz]</span>.",
-       "noarticletext-nopermission": "Bu sayfa şu anda boştur. \nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]] ya da <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz]</span>, fakat sayfayı yaratma yetkiniz bulunmamaktadır.",
+       "noarticletext-nopermission": "Bu sayfa şu anda boştur. \nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]] ya da <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz]</span>, fakat sayfayı oluşturma yetkiniz bulunmamaktadır.",
        "missing-revision": "\"{{FULLPAGENAME}}\" sayfasının #$1 sürümü yok.\n\nBu duruma genellikle silinmiş bir sayfaya eski tarihli bir bağlantının takip edilmesi neden olur.\n\nDaha fazla detaylı bilgi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sayfasında bulunabilir].",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" kullanıcı hesabı kayıtlı değil. Bu sayfayı oluşturmak/değiştirmek istiyorsanız lütfen kontrol edin.",
        "userpage-userdoesnotexist-view": "\"$1\" kullanıcı hesabı kayıtlı değil.",
        "mergehistory-go": "Birleştirilebilir değişikilikleri göster",
        "mergehistory-submit": "Revizyonları birleştir",
        "mergehistory-empty": "Hiçbir sürüm birleştirilemez.",
-       "mergehistory-success": "[[:$1]] sayfasının $3 {{PLURAL:$3|revizyonu|revizyonu}} başarıyla [[:$2]] içine birleştirildi.",
+       "mergehistory-done": "$1 sayfasının $3 {{PLURAL:$3|revizyonu|revizyonu}} başarıyla [[:$2]] içine birleştirildi.",
        "mergehistory-fail": "Geçmiş birleştirmesi gerçekleştirlemiyor, lütfen sayfa ve zaman parametrelerini yeniden kontrol edin.",
        "mergehistory-fail-toobig": "Limit olarak belirlenen $1 {{PLURAL:$1|sürümden|sürümden}} daha fazlasını taşımak gerekeceği için geçmiş birleştirme gerçekleştirilemiyor.",
        "mergehistory-no-source": "Kaynak sayfa $1 bulunmamaktadır.",
        "recentchangeslinked-summary": "Aşağıdaki liste, belirtilen sayfaya (ya da belirtilen kategorinin üyelerine) bağlantı veren sayfalarda yapılan son değişikliklerin listesidir.\n[[Special:Watchlist|İzleme listenizdeki]] sayfalar '''kalın''' olarak belirtilmiştir.",
        "recentchangeslinked-page": "Sayfa adı:",
        "recentchangeslinked-to": "Belirtilen sayfadan verilenler yerine, sayfaya verilen bağlantıları göster.",
+       "recentchanges-page-added-to-category": "[[:$1]] kategoriye eklendi",
        "upload": "Dosya yükle",
        "uploadbtn": "Dosya yükle",
        "reuploaddesc": "Yükleme formuna geri dön.",
        "upload-dialog-button-cancel": "İptal",
        "upload-dialog-button-save": "Kaydet",
        "upload-dialog-button-upload": "Yükle",
-       "upload-dialog-label-select-file": "Dosya seç",
-       "upload-dialog-label-infoform-title": "Ayrıntılar",
-       "upload-dialog-label-infoform-name": "Ad",
-       "upload-dialog-label-infoform-description": "Açıklama",
-       "upload-dialog-label-usage-title": "Kullanımı",
-       "upload-dialog-label-usage-filename": "Dosya adı",
+       "upload-form-label-select-file": "Dosya seç",
+       "upload-form-label-infoform-title": "Ayrıntılar",
+       "upload-form-label-infoform-name": "Ad",
+       "upload-form-label-infoform-description": "Açıklama",
+       "upload-form-label-usage-title": "Kullanımı",
+       "upload-form-label-usage-filename": "Dosya adı",
        "backend-fail-stream": "$1 dosyası okunamadı.",
        "backend-fail-backup": "\"$1\" dosyası yedeklenemedi.",
        "backend-fail-notexists": "$1 dosyası mevcut değil.",
        "movepagetext": "Aşağıdaki formu kullanmak sayfanın adını değiştirir, tüm geçmiş kayıtlarını da yeni isme aktarır.\nEski başlık yeni başlığa yönlendirme hâline dönüşür. Otomatik olarak eski başlığa yönlendirmeleri güncelleyebilirsiniz.\nEğer istemezseniz, tüm [[Special:DoubleRedirects|çift]] veya [[Special:BrokenRedirects|geçersiz]] yönlendirmeleri kontrol ettiğinizden emin olun.\nTüm bağlantıların olması gerektiği gibi çalıştığından sizin sorumlu olduğunuzu unutmayınız.\n\nEğer yeni isimde bir madde zaten varsa isim değişikliği '''yapılmayacaktır''', sonraki bir yönlendirme olup geçmiş değişiklik geçmişi olmadığı müddetçe.\nBu şu anlama gelir ki, eğer bir hata yaparsanız sayfayı değiştirildiği isme geri isimlendirebilirsiniz, ve mevcut bir sayfanın üstüne yazmazsınız.\n\n'''UYARI!'''\nBu değişim popüler bir sayfa için etkili ve beklenmeyen sonuçlar doğurabilir; lütfen devam etmeden önce olabilecekleri anladığınızdan emin olun.",
        "movepagetext-noredirectfixer": "Aşağıdaki formu doldurmak bir sayfayı yeniden adlandırır, tüm geçmişini yeni ada taşır.\nEski başlık yeni başlığa bir yönlendirme sayfası olur.\n[[Special:DoubleRedirects|Çift]] ya da [[Special:BrokenRedirects|bozuk yönlendirmeler]] sayfalarını kontrol edin.\nBağlantıların gitmeleri gereken yerlere gittiklerinden emin olmak sizin sorumluluğunuzdadır.\n\nYeni başlıkta mevcut bir sayfa varsa, boş yada bir yönlendirme olmadıkça ve değişiklik geçmişi bulunmadıkça, sayfa '''taşınmayacaktır'''.\nBu şu anlama gelir, bir sayfayı yanlışlık yaparsanız sayfayı eski adıyla yeniden adlandırabilirsiniz, bu mevcut sayfanın üzerine yazmaz.\n\n'''Uyarı!'''\nBu popüler bir sayfa için etkili ve beklenmedik bir değişiklik olabilir;\nLütfen onaylamadan önce bunun sonuçlarını anladığınızdan emin olun.",
        "movepagetalktext": "İlişikteki tartışma sayfası da (eğer varsa) otomatik olarak yeni isme taşınacaktır. Ama şu durumlarda '''taşınmaz''':\n\n*Alanlar arası bir taşıma ise, (örnek: \"Project:\" --> \"Help:\")\n*Yeni isimde bir tartışma sayfası zaten var ise,\n*Alttaki kutucuğu seçmediyseniz.\n\nBu durumlarda sayfayı kendiniz aktarmalısınız.",
-       "movearticle": "Eski isim",
        "moveuserpage-warning": "'''Uyarı:''' Bir kullanıcı sayfasını taşımak üzeresiniz. Lütfen sadece sayfanın taşınacağına, ancak kullanıcının yeniden ''adlandırılmayacağına'' dikkat edin.",
        "movecategorypage-warning": "<strong>Uyarı:</strong> Bir kategori sayfasını taşımak üzeresiniz. Lütfen yalnızca sayfanın taşınacağını ve eski kategoride yer alan sayfaların yeniden kategorize <em>edilmeyeceğini</em> unutmayın.",
        "movenologintext": "Sayfanın adını değiştirebilmek için kayıtlı ve [[Special:UserLogin|sisteme]] giriş yapmış olmanız gerekmektedir.",
        "api-error-badaccess-groups": "Bu wiki için dosya yüklemenize izin verilmiyor.",
        "api-error-badtoken": "İç hata: Bozuk anahtar.",
        "api-error-copyuploaddisabled": "URL ile yükleme bu sunucuda devre dışı bırakılmıştır.",
-       "api-error-duplicate": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir [$2 dosya]|[$2 dosyalar]}} var.",
-       "api-error-duplicate-archive": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir [$2 dosya]|[$2 dosyalar]}} vardı, ama {{PLURAL:$1|silindi|silindiler}}.",
-       "api-error-duplicate-archive-popup-title": "Zaten silinmiş çift {{PLURAL:$1|sayfa|sayfalar}}.",
-       "api-error-duplicate-popup-title": "Çift {{PLURAL:$1|dosya|dosya}}",
+       "api-error-duplicate": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} var.",
+       "api-error-duplicate-archive": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} vardı, ama {{PLURAL:$1|silindi|silindiler}}.",
        "api-error-empty-file": "Gönderdiğiniz dosya boş.",
        "api-error-emptypage": "Yeni, boş bir sayfa oluşturmaya izin verilmez.",
        "api-error-fetchfileerror": "İç hata: Dosya alınırken bir hata oluştu.",
index b12e304..e87ef3b 100644 (file)
@@ -24,7 +24,8 @@
                        "Derslek",
                        "Macofe",
                        "Selimcan",
-                       "Исмаил Садуев"
+                       "Исмаил Садуев",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Сылтамаларның астына сызу:",
        "move-page-legend": "Битне күчерү",
        "movepagetext": "Астагы форманы куллану битнең исемен алыштырып, аның барлык тарихын яңа исемле биткә күчерер.\nИске исемле бит яңа исемле биткә юнәлтү булып калыр.\nСез иске исемгә юнәлтүләрне автоматик рәвештә яңа исемгә күчерә аласыз.\nӘгәр моны эшләмәсәгез, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өзелгән юнәлтүләрне]] тикшерегез.\nСез барлык сылтамаларның кирәкле җиргә сылтавына җаваплы.\n\nКүздә тотыгыз: әгәр яңа исем урынында бит булса инде, һәм ул буш яки юнәлтү түгел исә, бит '''күчерелмәячәк'''.\nБу шуны аңлата: сез ялгышып күчерсәгез, битне кайтара аласыз, әмма инде булган битне бетерә алмыйсыз.\n\n'''Игътибар!'''\nПопуляр битләрне күчерү зур һәм көтелмәгән нәтиҗәләргә китерә ала.\nДәвам иткәнче, барлык нәтиҗәләрне аңлавыгызны тагын бер кат уйлагыз.",
        "movepagetalktext": "Бу битнең бәхәс бите дә күчереләчәк, '''бу очраклардан тыш''':\n*Андый исемле буш булмаган бәхәс бите бар инде, яисә\n*Сез астагы флажокны куймагансыз.\n\nБу очракларда сезгә битләрне үз кулыгыз белән күчерергә яки кушарга туры килер.",
-       "movearticle": "Битне күчерү:",
        "movenotallowed": "Сездә мәкаләләрне күчерү хокуклары юк.",
        "newtitle": "Яңа башлам:",
        "move-watch": "Бу битне күзәтү",
        "api-error-badaccess-groups": "Сезгә бу викигә файллар өстәү рөхсәт ителмәгән",
        "api-error-badtoken": "Эчке хата: дөрес булмаган токен.",
        "api-error-copyuploaddisabled": "URL-адрес буенча йөкләү бу серверда сүндерелгән.",
-       "api-error-duplicate": "Мондый эчтәлекле {{PLURAL:$1|[$2 башка файл]}} да бар.",
-       "api-error-duplicate-archive": "Элек сайтта мондый эчтәлекле {{PLURAL:$1|[$2 башка файл]}} бар иде инде, ләкин {{PLURAL:$1|1=аны бетерделәр|аларны бетерделәр}}.",
-       "api-error-duplicate-archive-popup-title": "Кайчандыр бетерелгән {{PLURAL:$1|1=файлның|файлларның}} дубликатлары.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|файлның}} дубликаты",
+       "api-error-duplicate": "Мондый эчтәлекле {{PLURAL:$1|башка файл}} да бар.",
+       "api-error-duplicate-archive": "Элек сайтта мондый эчтәлекле {{PLURAL:$1|башка файл}} бар иде инде, ләкин {{PLURAL:$1|1=аны бетерделәр|аларны бетерделәр}}.",
        "api-error-empty-file": "Сезнең тарафтан җибәрелгән файл буш.",
        "api-error-emptypage": "Яңа буш сәхифәләр төзү рөхсәт ителми",
        "api-error-unknown-code": "Билгесез хата: \"$1\"",
index 0342666..e10c91e 100644 (file)
@@ -10,7 +10,8 @@
                        "Tel'et",
                        "بىلگە",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "ئۇلانما ئاستى سىزىقى:",
        "mergehistory-go": "بىرلەشتۈرگىلى بولىدىغان تەھرىر كۆرسەت",
        "mergehistory-submit": "تۈزىتىلگەن نەشرىنى بىرلەشتۈر",
        "mergehistory-empty": "بىرلەشتۈرگىلى بولىدىغان تۈزىتىلگەن نەشرى يوق.",
-       "mergehistory-success": "[[:$1]] نىڭ {{PLURAL:$3|قېتىملىق|قېتىملىق}}  تۈزىتىلگەن نەشرى مۇۋەپپەقىيەتلىك ھالدا [[:$2]] غا بىرلەشتۈرۈلدى.",
+       "mergehistory-done": "$1 نىڭ {{PLURAL:$3|قېتىملىق|قېتىملىق}}  تۈزىتىلگەن نەشرى مۇۋەپپەقىيەتلىك ھالدا [[:$2]] غا بىرلەشتۈرۈلدى.",
        "mergehistory-fail": "تارىخنى بىرلەشتۈرگىلى بولمايدۇ، بۇ بەت ۋە ۋاقىت پارامېتىرىنى قايتا تەكشۈرۈڭ.",
        "mergehistory-no-source": "مەنبە بەت $1 مەۋجۇد ئەمەس.",
        "mergehistory-no-destination": "نىشان بەت $1 مەۋجۇد ئەمەس.",
        "movepagetext": "تۆۋەندىكى جەدۋەلنى ئىشلىتىپ بىر بەتنىڭ ئاتىنى ئۆزگەرتىپ، شۇنىڭ بىلەن بىللە تۈزىتىش نەشر تارىخىنى يېڭى بەتكە يۆتكەڭ.\nكونا بەت يېڭى بەتنىڭ قايتا نىشان بەلگىلەنگەن بېتى بولىدۇ.\nسىز بەلگىلەنگەن ئەسلىدىكى ماۋزۇنىڭ قايتا نىشان بەلگىلىشىنى يېڭىلىيالايسىز.\nئەگەر تاللىمىسىڭىز، [[Special:DoubleRedirects|قوش]] ياكى [[Special:BrokenRedirects|بۇزۇلغان قايتا نىشان بەلگىلەش]]نى تەكشۈرۈڭ.\nسىز بارلىق ئۇلانمىلارنىڭ يەنىلا بەلگىلەنگەن بەتكە ئۇلىنىشىغا كاپالەتلىك قىلىشقا مەسئۇل بولۇشىڭىز لازىم.\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'''ئاگاھلاندۇرۇش!'''\nدائىم زىيارەت قىلىنىدىغان توربەتكە نىسبەتەن بۇ زور ياكى  ئويلانمايلا ئېلىپ بېرىلغان ئۆزگەرتىش\nمەشغۇلات قىلىشتىن ئىلگىرى ئېلىپ كېلىدىغان ئاقىۋىتىنى چۈشىنىڭ.",
        "movepagetalktext": "مۇناسىۋەتلىك مۇنازىرە بېتى مۇشۇ بەت بىلەن بىللە ئۆزلۈكىدىن يۆتكىلىدۇ، ئۇنداق '''بولمىغاندا:'''\n*يېڭى بەتنىڭ مەزمۇنى بار مۇنازىرە بېتى مەۋجۇد ياكى\n*تۆۋەندىكى كۆپ تاللاش رامكىسىنى تاللىمىدىڭىز.\n\nبۇ خىل ئەھۋاللاردا، زۆرۈر تېپىلغاندا ئۆزىڭىز بەتنى يۆتكىشىڭىز ياكى بىرلەشتۈرۈشىڭىز لازىم.",
-       "movearticle": "بەت يۆتكە:",
        "moveuserpage-warning": "'''ئاگاھلاندۇرۇش:''' سىز ئىشلەتكۈچى بېتىنى يۆتكىمەكچى. بۇ بەت يۆتكەلگەندىن كېيىن شۇ ئىشلەتكۈچىنىڭ ئاتى ئۆزگەرمەيدىغانلىقىغا دىققەت قىلىڭ.",
        "movenologintext": "سىز چوقۇم تىزىمغا كىرگەن ئىشلەتكۈچى ھەمدە [[Special:UserLogin|تىزىمغا كىر]]گەندىن كېيىن ئاندىن بەتنى يۆتكىيەلەيسىز.",
        "movenotallowed": "سىزنىڭ بەت يۆتكەش ھوقۇقىڭىز يوق.",
        "api-error-badaccess-groups": "ھۆججەتنى بۇ ۋىكىغا يۈكلەش ھوقۇقىڭىز يوق.",
        "api-error-badtoken": "ئىچكى خاتالىق: سۆزلىشىش ئىناۋەتسىز.",
        "api-error-copyuploaddisabled": "URL ئارقىلىق يوللايدىغان ئىقتىدارنى بۇ مۇلازىمېتىر چەكلىگەن.",
-       "api-error-duplicate": "تورتۇرادا ئوخشاش مەزمۇندىكى {{PLURAL:$1|is [$2 باشقا ھۆججەت]|[$2 بەزى باشقا ھۆججەتلەر]}} مەۋجۇت.",
-       "api-error-duplicate-archive": "تورتۇرادا ئىلگىرى ئوخشاش مەزمۇن بار {{PLURAL:$1|was [$2 باشقا بىر ھۆججەت]|were [$2 باشقا ھۆججەتلەر]}} مەۋجۇت ئەمما ئۆچۈرۈلگەن.",
-       "api-error-duplicate-archive-popup-title": "تەكرار {{PLURAL:$1|ھۆججەت}} ئۆچۈرۈلدى.",
-       "api-error-duplicate-popup-title": "تەكرار {{PLURAL:$1|ھۆججەت}}.",
+       "api-error-duplicate": "تورتۇرادا ئوخشاش مەزمۇندىكى {{PLURAL:$1|is باشقا ھۆججەت|بەزى باشقا ھۆججەتلەر}} مەۋجۇت.",
+       "api-error-duplicate-archive": "تورتۇرادا ئىلگىرى ئوخشاش مەزمۇن بار {{PLURAL:$1|was باشقا بىر ھۆججەت|were باشقا ھۆججەتلەر}} مەۋجۇت ئەمما ئۆچۈرۈلگەن.",
        "api-error-empty-file": "يوللىغان ھۆججىتىڭىز بوش.",
        "api-error-emptypage": "يېڭىدىن قۇرۇش، قۇرۇق بەت يول قۇيۇلمايدۇ.",
        "api-error-fetchfileerror": "ئىچكى خاتالىق: ھۆججەتكە ئېرىشىۋاتقاندا خاتالىق كۆرۈلدى.",
index 20f84ea..e142167 100644 (file)
        "nstab-template": "Шаблон",
        "nstab-help": "Сторінка довідки",
        "nstab-category": "Категорія",
+       "mainpage-nstab": "Головна сторінка",
        "nosuchaction": "Такої дії нема",
        "nosuchactiontext": "Дія, зазначена в URL, неправильна.\nВи могли неправильно набрати URL або перейти за некоректним посиланням.\nЦе також може означати помилку в програмному забезпеченні {{GRAMMAR:genitive|{{SITENAME}}}}.",
        "nosuchspecialpage": "Такої спеціальної сторінки нема",
        "viewsource": "Перегляд",
        "viewsource-title": "Перегляд вихідного коду сторінки $1",
        "actionthrottled": "Обмеження за швидкістю",
-       "actionthrottledtext": "Для боротьби зі спамом встановлено обмеження на повторне застосування цієї дії за короткий час. Ви перевищили це обмеження. Можете спробувати знов за кілька хвилин.",
+       "actionthrottledtext": "Для боротьби із зловживаннями встановлено обмеження на повторне застосування цієї дії за короткий час. Ви перевищили це обмеження. Можете спробувати знов за кілька хвилин.",
        "protectedpagetext": "Ця сторінка захищена від редагування та інших дій.",
        "viewsourcetext": "Ви можете переглянути та скопіювати вихідний текст цієї сторінки:",
        "viewyourtext": "Ви можете переглянути та скопіювати вихідний текст <strong>Ваших редагувань</strong> на цю сторінку.",
        "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|сторінка|сторінки|сторінок}}",
        "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": "Ð\95лекÑ\82Ñ\80онний Ð»Ð¸Ñ\81Ñ\82 Ð´Ð»Ñ\8f Ð²Ñ\96дновленнÑ\8f Ð¿Ð°Ñ\80олÑ\8f Ð½Ð°Ð´Ñ\96Ñ\81ланий.",
+       "passwordreset-emailsent": "ЯкÑ\89о Ñ\86е Ð·Ð°Ñ\80еÑ\94Ñ\81Ñ\82Ñ\80ована Ð°Ð´Ñ\80еÑ\81а ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð¿Ð¾Ñ\88Ñ\82и Ð´Ð»Ñ\8f Ð²Ð°Ñ\88ого Ð¾Ð±Ð»Ñ\96кового Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83, Ñ\82о Ð±Ñ\83де Ð½Ð°Ð´Ñ\96Ñ\81ланий Ð»Ð¸Ñ\81Ñ\82 Ð´Ð»Ñ\8f Ð²Ñ\96дновленнÑ\8f Ð¿Ð°Ñ\80олÑ\8f.",
        "passwordreset-emailsent-capture": "Електронний лист скидання пароля було надіслано, як показано нижче.",
        "passwordreset-emailerror-capture": "Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.",
-       "changeemail": "Змінити адресу електронної пошти",
-       "changeemail-text": "Заповніть цю форму, щоб змінити адресу електронної пошти. Вам потрібно буде ввести пароль, щоб підтвердити ці зміни.",
+       "changeemail": "Ð\97мÑ\96ниÑ\82и Ð°Ð±Ð¾ Ð²Ð¸Ð»Ñ\83Ñ\87иÑ\82и Ð°Ð´Ñ\80еÑ\81Ñ\83 ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð¿Ð¾Ñ\88Ñ\82и",
+       "changeemail-text": "Заповніть цю форму, щоб змінити адресу електронної пошти. Вам потрібно буде ввести пароль, щоб підтвердити ці зміни. Якщо ви хочете прибрати зв'язок вашого облікового запису з адресою електронної пошти, залиште поле нової адреси електронної пошти порожнім.",
        "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": "Немає жетонів до скидання.",
        "permissionserrorstext-withaction": "У вас нема дозволу на $2 з {{PLURAL:$1|1=такої причини|таких причин}}:",
        "recreate-moveddeleted-warn": "'''Попередження: ви намагаєтеся створити сторінку, яка раніше вже була вилучена.'''\n\nПеревірте, чи справді вам справді потрібно створювати цю сторінку.\nНижче, для зручності, наведений журнал вилучень і перейменувань:",
        "moveddeleted-notice": "Ця сторінка була вилучена.\nДля довідки нижче наведені відповідні записи з журналів вилучень і перейменувань.",
+       "moveddeleted-notice-recent": "На жаль, ця сторінка нещодавно була вилучена (протягом останніх 24 годин). Для довідки нижче наведені відповідні записи з журналів вилучень і перейменувань.",
        "log-fulllog": "Переглянути весь журнал",
        "edit-hook-aborted": "Редагування скасоване процедурою-перехоплювачем.\nДодаткові пояснення не наведені.",
        "edit-gone-missing": "Неможливо оновити сторінку.\nІмовірно, вона була вилучена.",
        "mergehistory-go": "Показати редагування, що об'єднуються",
        "mergehistory-submit": "Об'єднати версії",
        "mergehistory-empty": "Не знайдено версій для об'єднання.",
-       "mergehistory-success": "$3 {{PLURAL:$3|редагування|редагування|редагувань}} з [[:$1]] успішно перенесені до [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|редагування|редагування|редагувань}} з $1 успішно {{PLURAL:$3|перенесене|перенесені}} до [[:$2]].",
        "mergehistory-fail": "Не вдалося здійснити об'єднання історій сторінок, будь ласка, перевірте параметри сторінки й часу.",
        "mergehistory-fail-toobig": "Не вдалося виконати злиття історії оскільки буде перейменовано більше, ніж ліміт у $1 {{PLURAL:$1|версію|версії|версій}}.",
        "mergehistory-no-source": "Вихідна сторінка «$1» не існує.",
        "prefs-watchlist-token": "Мітка списку спостереження:",
        "prefs-misc": "Інші налаштування",
        "prefs-resetpass": "Змінити пароль",
-       "prefs-changeemail": "Змінити адресу електронної пошти",
+       "prefs-changeemail": "Ð\97мÑ\96ниÑ\82и Ð°Ð±Ð¾ Ð²Ð¸Ð»Ñ\83Ñ\87иÑ\82и Ð°Ð´Ñ\80еÑ\81Ñ\83 ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð¿Ð¾Ñ\88Ñ\82и",
        "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|день|дні|днів}})",
        "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 сторінку|$2 сторінки|$2 сторінок|1=одну сторінку}} було додано до категорії",
+       "recentchanges-page-removed-from-category": "[[:$1]] було вилучено з категорії",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] та ще {{PLURAL:$2|$2 сторінку|$2 сторінки|$2 сторінок|1=одну сторінку}} було вилучено з категорії",
+       "autochange-username": "Автоматичні редагування MediaWiki",
        "upload": "Завантажити файл",
        "uploadbtn": "Завантажити файл",
        "reuploaddesc": "Повернутися до форми завантаження",
        "upload-options": "Параметри завантаження",
        "watchthisupload": "Спостерігати за цим файлом",
        "filewasdeleted": "Файл з такою назвою вже існував, але був вилучений.\nВам слід перевірити $1 перед повторним завантаженням.",
+       "filename-thumb-name": "Це виглядає як назва ескізу. Будь ласка, не завантажуйте ескізи назад на ту саму вікі. В іншому випадку, будь ласка, виправте назву файла, щоб вона виглядало  більш значущою, й не мала префіксу слайда.",
        "filename-bad-prefix": "Назва завантажуваного файлу починається на '''«$1»''' і, можливо, є шаблонною назвою, яку цифрова фотокамера дає знімкам. Будь ласка, виберіть назву, яка краще описуватиме вміст файлу.",
        "filename-prefix-blacklist": " #<!-- не змінюйте цей рядок --> <pre>\n# Синтаксис такий:\n#   * Все, що починається з символу «#» вважається коментарем (до кінця рядка)\n#   * Кожен непорожній рядок — префікс стандартної назви файлу, яку зазвичай дає цифрова камера\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # деякі мобільні телефони\nIMG # загальне\nJD # Jenoptik\nMGP # Pentax\nPICT # різні\n #</pre> <!-- не змінюйте цей рядок -->",
        "upload-success-subj": "Завантаження успішно завершено",
        "upload-http-error": "Відбулася помилка HTTP: $1",
        "upload-copy-upload-invalid-domain": "З цього домену завантаження неможливе.",
        "upload-dialog-title": "Завантажити файл",
-       "upload-dialog-error": "Сталася помилка",
-       "upload-dialog-warning": "З'явилось попередження",
        "upload-dialog-button-cancel": "Скасувати",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Зберегти",
        "upload-dialog-button-upload": "Завантажити",
-       "upload-dialog-label-select-file": "Обрати файл",
-       "upload-dialog-label-infoform-title": "Деталі",
-       "upload-dialog-label-infoform-name": "Назва",
-       "upload-dialog-label-infoform-description": "Опис",
-       "upload-dialog-label-usage-title": "Використання",
-       "upload-dialog-label-usage-filename": "Назва файлу",
+       "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": "Дата",
+       "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:locative|{{SITENAME}}}}]], якщо цей файл може бути завантажений згідно з їх правилами.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Я підтверджую, що я є власником авторських прав на цей файл та погоджуюся беззастережно поширити його у Вікісховищі на умовах ліцензії [https://creativecommons.org/licenses/by-sa/4.0/deed.uk Creative CommonsAttribution-ShareAlike 4.0], і я згоден з [https://wikimediafoundation.org/wiki/Terms_of_Use умовами використання].",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Якщо ви не є власником авторських прав на цей файл або ви хочете розповсюджувати його на умовах іншої ліцензії, рекомендуємо використати [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстер завантажень на Вікісховищі].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Ви також можете спробувати використати [[Special:Upload|сторінку завантаження на {{GRAMMAR:locative|{{SITENAME}}}}]], якщо цей файл може бути завантажений на цей сайт згідно з його правилами.",
        "backend-fail-stream": "Не вдалося транслювати файл $1.",
        "backend-fail-backup": "Не вдалося створити резервну копію файлу $1.",
        "backend-fail-notexists": "Файл $1 не існує.",
        "filerevert-legend": "Повернути версію файлу",
        "filerevert-intro": "Ви повертаєте '''[[Media:$1|$1]]''' до [$4 версії від $3, $2].",
        "filerevert-comment": "Причина:",
-       "filerevert-defaultcomment": "Повернення до версії від $2, $1",
+       "filerevert-defaultcomment": "Повернення до версії від $2, $1 ($3)",
        "filerevert-submit": "Повернути",
        "filerevert-success": "'''[[Media:$1|$1]]''' був повернутий до [$4 версії від $3, $2].",
        "filerevert-badversion": "Немає локальної версії цього файлу з вказаною поміткою дати і часу.",
        "booksources-text": "На цій сторінці наведено список посилань на сайти, де ви, можливо, знайдете додаткову інформацію про книгу. Це інтернет-магазини й системи пошуку в бібліотечних каталогах.",
        "booksources-invalid-isbn": "Вказаний номер ISBN, судячи з усього, містить помилку. Будь ласка, перевірте, що при перенесенні номера з першоджерела не виникло спотворень.",
        "specialloguserlabel": "Виконавець:",
-       "speciallogtitlelabel": "Ціль (назва або користувач):",
+       "speciallogtitlelabel": "Ціль (назва або {{ns:user}}:ім'я для користувача):",
        "log": "Журнали",
        "all-logs-page": "Усі публічні журнали",
        "alllogstext": "Комбінований показ журналів {{grammar:genitive|{{SITENAME}}}}.\nВи можете відфільтрувати результати за типом журналу, іменем користувача (враховується регістр) або зазначеною сторінкою (також враховується регістр).",
        "emailccsubject": "Копія вашого повідомлення до $1: $2",
        "emailsent": "Електронне повідомлення надіслано",
        "emailsenttext": "Ваше електронне повідомлення надіслано.",
-       "emailuserfooter": "Цей лист був надісланий користувачеві $2 від користувача $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}.",
+       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}.",
        "usermessage-summary": "Залишити системне повідомлення.",
        "usermessage-editor": "Системний вісник",
        "usermessage-template": "MediaWiki:UserMessage",
        "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": "Вилучення",
        "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": "Приєднана сторінка обговорення також буде автоматично перейменована, '''окрім таких випадків:'''\n* Непорожня сторінка обговорення з такою назвою вже існує або\n* Ви не поставили галочку в полі нижче.\n\nУ цих випадках ви будете змушені перейменувати чи об'єднати сторінки вручну в разі необхідності",
-       "movearticle": "Перейменувати сторінку",
+       "movepagetalktext": "Якщо ви встановите тут прапорець, приєднана сторінка обговорення також буде автоматично перейменована, окрім випадку, коли непорожня сторінка обговорення з такою назвою вже існує.\n\nУ цьому разі ви будете змушені перейменувати чи об'єднати сторінки вручну в разі необхідності.",
        "moveuserpage-warning": "'''Увага:''' Ви збираєтеся перейменувати сторінку користувача. Будь ласка, зверніть увагу, що  буде перейменовано тільки сторінку, але користувача '''не''' буде перейменовано.",
        "movecategorypage-warning": "<strong>Увага:</strong> Ви збираєтесь перейменувати сторінку категорії. Будь ласка, зауважте, що це перейменує лише цю сторінку, <em>не</em> перемістивши сторінки, що входять до категорії до категорії з новою назвою.",
        "movenologintext": "Ви повинні [[Special:UserLogin|ввійти до системи]], щоб перейменувати сторінку.",
        "logentry-newusers-byemail": "Обліковий запис $3 {{GENDER:$2|користувача|користувачки}} створений {{GENDER:$4|користувачем|користувачкою}} $1 і пароль було надіслано електронною поштою",
        "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:$2|змінив|змінила}} членство в групах для $3 із $4 на $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|змінив|змінила}} членство в групах для $3",
        "logentry-rights-autopromote": "$1 було автоматично переведено із $4 в $5",
        "api-error-badaccess-groups": "Вам не дозволено завантажувати файли до цього вікіпроекту.",
        "api-error-badtoken": "Внутрішня помилка: некоректний токен.",
        "api-error-copyuploaddisabled": "На цьому сервері вимкнене завантаження за URL-адресою.",
-       "api-error-duplicate": "Вже {{PLURAL:$1|1=існує  [$2 інший файл]|існують [$2 інші файли]}} з таким самим вмістом.",
-       "api-error-duplicate-archive": "Раніше на сайті вже {{PLURAL:$1|1=був [$2 файл]|були [$2 файли]}} з ідентичним вмістом, але {{PLURAL:$1|1=його|їх}} вилучили.",
-       "api-error-duplicate-archive-popup-title": "Дублікати {{PLURAL:$1|1=файла|файлів}}, які вже були вилучені",
-       "api-error-duplicate-popup-title": "Дублікат {{PLURAL:$1|1=файлу|файлів}}",
+       "api-error-duplicate": "Уже {{PLURAL:$1|1=існує інший файл|існують інші файли}} з таким самим вмістом.",
+       "api-error-duplicate-archive": "Раніше на сайті вже {{PLURAL:$1|1=був файл|були файли}} з ідентичним вмістом, але {{PLURAL:$1|1=його|їх}} вилучили.",
        "api-error-empty-file": "Файл, який ви надіслали, порожній.",
        "api-error-emptypage": "Створення нової порожньої сторінки неприпустиме.",
        "api-error-fetchfileerror": "Внутрішня помилка: щось пішло не так під час отримання файлу.",
index 482b472..23126ae 100644 (file)
@@ -18,7 +18,8 @@
                        "Vajotwo",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Sotołinea i cołegamenti:",
        "nstab-template": "Modèl",
        "nstab-help": "Ajuto",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pagina prinsipale",
        "nosuchaction": "Operasion no riconossua",
        "nosuchactiontext": "L'asion spesifegà ne l'URL no a xè vałida.\nXè posibiłe che l'URL sia sta dizità en modo erato o che sia sta seguio on cołegamento no vałido.\nCiò podaria anca indicare on bug en {{SITENAME}}.",
        "nosuchspecialpage": "Pajina prinsipałe no disponibiłe",
        "mergehistory-go": "Mostra le modifiche che pol èssar unìe",
        "mergehistory-submit": "Unissi le revision",
        "mergehistory-empty": "Nissuna revision da unir.",
-       "mergehistory-success": "{{PLURAL:$3|Una revision de [[:$1]] la xe stà unìa|$3 revision de [[:$1]] le xe stà unìe}} a la cronologia de [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Una revision de $1 la xe stà unìa|$3 revision de $1 le xe stà unìe}} a la cronologia de [[:$2]].",
        "mergehistory-fail": "Inpossibile unir le cronologie. Verifica la pagina e i parametri tenporali.",
        "mergehistory-no-source": "La pagina de origine $1 no la esiste.",
        "mergehistory-no-destination": "La pagina de destinazion $1 no la esiste.",
        "upload-dialog-button-done": "Fato",
        "upload-dialog-button-save": "Salva",
        "upload-dialog-button-upload": "Carga",
-       "upload-dialog-label-select-file": "Siegli el file",
-       "upload-dialog-label-infoform-name": "Nome",
-       "upload-dialog-label-infoform-description": "Descrision",
-       "upload-dialog-label-usage-title": "Uso",
-       "upload-dialog-label-usage-filename": "Nome del file",
+       "upload-form-label-select-file": "Siegli el file",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrision",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nome del file",
        "backend-fail-stream": "Inposibiłe traxmetare el file $1.",
        "backend-fail-backup": "Inposibiłe fare el backup del file $1.",
        "backend-fail-notexists": "El file $1 no existe.",
        "filerevert-legend": "Ripristina file",
        "filerevert-intro": "Te stè par ripristinar el file '''[[Media:$1|$1]]''' a la [versione $4 del $2, $3].",
        "filerevert-comment": "Motivassion:",
-       "filerevert-defaultcomment": "Xe stà ripristinà la version del $1, $2",
+       "filerevert-defaultcomment": "Xe stà ripristinà la version del $1, $2 ($3)",
        "filerevert-submit": "Ripristina",
        "filerevert-success": "'''El file [[Media:$1|$1]]''' el xe stà ripristinà a la [$4 version del $2, $3].",
        "filerevert-badversion": "No esiste mìa version locali precedenti del file col timestamp richiesto.",
        "movepagetext": "Có 'l moduło cuà soto te podi rinominar na pàjina, spostando anca tuta ła so storia al titoło novo.\nEl vecio titoło el devegnarà automategamente un rimando (redirect) che ponta al titoło novo.\nTe podi axornar automategamente i rimandi che ponta al vecio titoło.\nSe te siełi de nó farlo, tiente inamente de controłar ben che nó se cree [[Special:DoubleRedirects|dopi rimandi]] o [[Special:BrokenRedirects|rimandi interoti]].\nResta inte ła to responsabiłità de controłar che i ligamenti i continue a pontar 'ndove che i deve.\n\nOcio: ła pàjina '''nó''' ła sarà spostà se ghe fuse xà na pàjina có 'l titoło novo, a meno che nó ła sia un rimando, e senpre che nó ła gabia na storia.\nCuesto signifega che, se te fè un eror, te podi da novo rinominar na pàjina có 'l vecio titoło, ma nó te podi sovrascrìvar na pàjina xà existente.\n\n'''OCIO!'''\nSto canbiamento drastico el podarìa dar problemi che nó se se speta, spesalmente se se trata de na pàjina molto vixità.\nStà ben tento a łe conseguense del spostamento, prima de farlo.",
        "movepagetext-noredirectfixer": "Col modulo qua soto te podi rinominar na pagina, spostando anca tuta la so storia al titolo novo.\nEl vecio titolo el deventarà automaticamente un rimando (redirect) che punta al titolo novo.\nTiente in mente de controlar ben che no se crea [[Special:DoubleRedirects|dopi redirect]] o [[Special:BrokenRedirects|redirect interoti]].\nResta ne la to responsabilità de controlar che i colegamenti i continua a puntar dove che i deve.\n\nOcio: la pagina '''no''' la sarà spostà se ghe fusse zà na pagina col titolo novo, a meno che no la sia na pagina voda o un rimando, e senpre che no la gabia na storia.\nQuesto significa che, se te fè un eror, te podi da novo rinominar na pagina col vecio titolo, ma no te podi sovrascrìvar na pagina zà esistente.\n\n'''OCIO!'''\nSto canbiamento drastico el podarìa dar problemi che no se se speta, specialmente se se trata de na pagina molto visità.\nStà ben tento a le conseguense del spostamento, prima de farlo.",
        "movepagetalktext": "La corispondente pagina de discussion la sarà spostà automaticamente insieme a la pagina prinsipale, '''trane che nei seguenti casi:'''\n* El spostamento de la pagina el xe tra namespace diversi\n* In corispondenza del titolo novo ghe xe xà na pagina de discussion (mìa voda)\n* La casèla qua soto la xe stà deselezionà.",
-       "movearticle": "Sposta la pagina:",
        "moveuserpage-warning": "'''Ocio:''' Te sì drio spostar na pagina utente. Par piaser tien conto che vegnarà spostà solo la pagina e l'utente no'l vegnarà ''mia'' rinominà.",
        "movenologintext": "Te ghè da èssar un utente registrà ed aver efetuà el [[Special:UserLogin|login]] par poder spostar na pàxena.",
        "movenotallowed": "No te ghè i parmessi necessari al spostamento de le pagine.",
        "api-error-badaccess-groups": "Nó te si autorixà a cargar documenti so sta wiki.",
        "api-error-badtoken": "Eror interno: token fałà.",
        "api-error-copyuploaddisabled": "El cargamento tramite URL el xe dixabiłità so sto server.",
-       "api-error-duplicate": "So'l sito {{PLURAL:$1|ghe xe xà [$2 'n altro documento]|ghe xe xà [$2 altri documenti]}} có 'l steso contegnuo.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Ghe xera [$2 'n altro file]|Ghe xera [$2 altri file]}} xà inte'l sito có 'l steso contegnuo, ma {{PLURAL:$1|el xe sta scansełà|i xe stai scansełai}}.",
-       "api-error-duplicate-archive-popup-title": "File duplic{{PLURAL:$1|à che xe xà sta scansełà|ai che i xe xà stai scansełai}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|documento duplicà|documenti duplicai}}",
+       "api-error-duplicate": "So'l sito {{PLURAL:$1|ghe xe xà 'n altro documento|ghe xe xà altri documenti}} có 'l steso contegnuo.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Ghe xera 'n altro file|Ghe xera altri file}} xà inte'l sito có 'l steso contegnuo, ma {{PLURAL:$1|el xe sta scansełà|i xe stai scansełai}}.",
        "api-error-empty-file": "El file sełesionà el gera vodo.",
        "api-error-emptypage": "Ła creasion de nove pàjine vode nó ła xe consentia.",
        "api-error-fetchfileerror": "Eror interno: ghe xe sta un problema durante el recupero del documento.",
index 687433a..c48232f 100644 (file)
@@ -7,7 +7,8 @@
                        "Sura",
                        "Triple-ADHD-AS",
                        "Игорь Бродский",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Jonoštada kosketused:",
        "mergehistory-go": "Ozutada toižetusid, kudambid ühtenzoittas",
        "mergehistory-submit": "Ühtenzoitta redakcijad",
        "mergehistory-empty": "Ei voi löuta redakcijoid ühtenzoitandan täht.",
-       "mergehistory-success": "$3 {{PLURAL:$3|redakcii om|redakcijad oma}} sirtud satusekahas [[:$2]]-lahtpolele. Ühthine redakcijoiden lugu om [[:$1]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|redakcii om|redakcijad oma}} sirtud satusekahas [[:$2]]-lahtpolele. Ühthine redakcijoiden lugu om $1.",
        "mergehistory-fail": "Ei voi ühtenzoitta lehtpoliden istorijoid, olgat hüväd, kodvgat lehtpolen da aigan parametrad.",
        "mergehistory-no-source": "$1-augotižlehtpol't ei ole.",
        "mergehistory-no-destination": "$1-metlehtpol't ei ole.",
        "filerevert-legend": "Endištada failan versii",
        "filerevert-intro": "Tö takait endištada '''[[Media:$1|$1]]'''-fail [$4-versijahasai, kudamb oli tehtud datal $3, $2].",
        "filerevert-comment": "Homaičend:",
-       "filerevert-defaultcomment": "Om endištadud versijahasai, kudamban dat om $2, $1",
+       "filerevert-defaultcomment": "Om endištadud versijahasai, kudamban dat om $2, $1 ($3)",
        "filerevert-submit": "Endištada",
        "filerevert-success": "'''[[Media:$1|$1]]''' om endištadud [$4 versijannoks datal $3, $2].",
        "filedelete": "Čuta $1",
        "move-page-legend": "Udesnimitada lehtpol'",
        "movepagetext": "Alemba anttud formad kävutaden sab nimitada lehtpolen udes; siloi kaclendnimikirjuteses se mugažo linneb uden nimenke.\nVanhemb nimi linneb kosketuseks udembale nimele.\nSab udištada avtomatižešti kosketusid vanhembale nimele.\nKu tö et tahtoigoi tehta necidä, olgat hüväd, kodvgat, ei-k ole lehtpolil [[Special:DoubleRedirects|kaksitadud]] vai [[Special:BrokenRedirects|rebitadud]] kosketusid.\nTö pidat vastust siš, miše kaik kosketused ozutaižiba sinnä, kuna tarbiž.\n\nOtkat sil'mnägubale, miše lehtpol' ei nimitagoi udes, ku om jo lehtpol' mugoižen nimenke, siš statjoiš päiči, konz se om pall'az, sil ei ole toižetuzistorijad, vai se om oigendamižlehtpol'.\nNece znamoičeb, miše tö voit pörtta lehtpolen vanhemb nimi, ku tö olet petnus, no et voigoi čuta statjaližikš tarbhašt lehtpol't.\n\n'''HOMAIKAT!'''\nUdesnimituz voib toda masštabižid da varastamatomid toižetusid ''populärižile'' lehtpolile.\nOlgat hüväd, vahvištoitkatoiš, miše tö el'gendat kaik jäl'gused.",
        "movepagetalktext": "Sidotud lodulehtpol' udesnimitadas avtomatižikš, '''päiči niiš statjoiš, konz:'''\n*Om jo täuttud lodulehtpol' mugoižen nimenke;\n*Tö ei olgoi pannuded \"lindušt\" pöudho alemba.\n\nNenil statjoil tegese sirta vai ühtenzoitta lehtpoled ičeksaz.",
-       "movearticle": "Udesnimitada lehtpol':",
        "movenologintext": "Teile pidab olda [[Special:UserLogin|registriruidud kävutajan]], miše udesnimitada lehtpol'.",
        "movenotallowed": "Teile ei sa udesnimitada lehtpolid.",
        "movenotallowedfile": "Teile ei sa udesnimitada failoid.",
index bbe7617..9c559e4 100644 (file)
@@ -31,7 +31,8 @@
                        "Macofe",
                        "KhangND",
                        "Darcy Le",
-                       "Quenhitran"
+                       "Quenhitran",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "nstab-template": "Bản mẫu",
        "nstab-help": "Trợ giúp",
        "nstab-category": "Thể loại",
+       "mainpage-nstab": "Trang chính",
        "nosuchaction": "Không có tác vụ này",
        "nosuchactiontext": "Wiki không hiểu được tác vụ được yêu cầu trong địa chỉ URL.\nCó thể bạn đã gõ nhầm địa chỉ URL, hoặc nhấn vào một liên kết sai.\nNó cũng có thể là dấu hiệu của một lỗi trong phần mềm mà {{SITENAME}} sử dụng.",
        "nosuchspecialpage": "Không có trang đặc biệt nào có tên này",
        "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ở thêm 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.",
        "createacct-benefit-body1": "{{PLURAL:$1}}lần sửa đổi",
        "createacct-benefit-body2": "{{PLURAL:$1}}trang nội dung",
        "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": "Đã gửi thư điện tử để tái tạo mật khẩu.",
+       "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-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 địa chỉ thư điện tử",
-       "changeemail-text": "Điền biểu mẫu này để đổi địa chỉ thư điện tử. Bạn sẽ cần phải nhập mật khẩu để xác nhận thay đổi này.",
+       "changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
+       "changeemail-text": "Điền biểu mẫu này để đổi địa chỉ thư điện tử. Bạn sẽ cần phải nhập mật khẩu để xác nhận thay đổi này. 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ử và lưu biểu mẫu.",
        "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:",
+       "changeemail-newemail-help": "Để trống hộp này để gỡ địa chỉ thư điện tử của bạn. Nếu gỡ địa chỉ thư điện tử, bạn sẽ không có thể đặt lại một mật khẩu bị quên và sẽ không nhận các thư từ wiki này.",
        "changeemail-none": "(không có)",
        "changeemail-password": "Mật khẩu của bạn tại {{SITENAME}}:",
        "changeemail-submit": "Đổi địa chỉ",
        "changeemail-throttled": "Bạn đã thử đăng nhập nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.",
+       "changeemail-nochange": "Xin hãy nhập một địa chỉ thư điện tử mới khác.",
        "resettokens": "Đặt lại dấu hiệu",
        "resettokens-text": "Bạn có thể đặt lại các dấu hiệu cho phép truy cập những dữ liệu cá nhân của tài khoản của bạn tại đây.\n\nBạn nên sử dụng chức năng này nếu bạn đã vô tình chia sẻ các dấu hiệu với người khác hoặc tài khoản của bạn đã bị xâm phạm.",
        "resettokens-no-tokens": "Không có dấu hiệu để đặt lại.",
        "permissionserrorstext-withaction": "Bạn không quyền $2, với {{PLURAL:$1|lý do|lý do}} sau:",
        "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.",
        "log-fulllog": "Xem nhật trình đầy đủ",
        "edit-hook-aborted": "Một phần bổ trợ phần mềm đã bỏ qua sửa đổi này.\nKhông có lý do nào được đưa ra.",
        "edit-gone-missing": "Không thể cập nhật trang.\nDường như trang này đã 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-success": "$3 {{PLURAL:$3|sửa đổi|sửa đổi}} của [[:$1]] đã được trộn vào [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|sửa đổi|sửa đổi}} 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.",
        "prefs-watchlist-token": "Số thẻ Danh sách theo dõi:",
        "prefs-misc": "Linh tinh",
        "prefs-resetpass": "Thay đổi mật khẩu",
-       "prefs-changeemail": "Đổi địa chỉ thư điện tử",
+       "prefs-changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
        "prefs-setemail": "Đặt địa chỉ thư điện tử",
        "prefs-email": "Tùy chọn thư điện tử",
        "prefs-rendering": "Giao diện",
        "group-bot": "Bot",
        "group-sysop": "Bảo quản viên",
        "group-bureaucrat": "Hành chính viên",
-       "group-suppress": "Giám sát viên",
+       "group-suppress": "Người xóa hẳn",
        "group-all": "(tất cả)",
        "group-user-member": "{{GENDER:$1}}thành viên",
        "group-autoconfirmed-member": "{{GENDER:$1}}thành viên tự động xác nhận",
        "group-bot-member": "{{GENDER:$1}}bot",
        "group-sysop-member": "{{GENDER:$1}}bảo quản viên",
        "group-bureaucrat-member": "{{GENDER:$1}}hành chính viên",
-       "group-suppress-member": "{{GENDER:$1}}giám sát viên",
+       "group-suppress-member": "{{GENDER:$1}}người xóa hẳn",
        "grouppage-user": "{{ns:project}}:Thành viên",
        "grouppage-autoconfirmed": "{{ns:project}}:Thành viên tự xác nhận",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Bảo quản viên",
        "grouppage-bureaucrat": "{{ns:project}}:Hành chính viên",
-       "grouppage-suppress": "{{ns:project}}:Giám sát viên",
+       "grouppage-suppress": "{{ns:project}}:Đàn áp viên",
        "right-read": "Đọc trang",
        "right-edit": "Sửa trang",
        "right-createpage": "Tạo trang (không phải trang thảo luận)",
        "recentchangeslinked-summary": "Đây là danh sách các thay đổi được thực hiện gần đây tại những trang được liên kết đến từ một trang nào đó (hoặc tại các trang thuộc một thể loại nào đó).\nCác trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tô đậm'''.",
        "recentchangeslinked-page": "Tên trang:",
        "recentchangeslinked-to": "Hiện thay đổi tại những trang có liên kết đến trang này thay thế",
+       "recentchanges-page-added-to-category": "[[:$1]] được xếp vào thể loại",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] và {{PLURAL:$2|một trang|$2 trang}} nữa được xếp vào thể loại",
+       "recentchanges-page-removed-from-category": "[[:$1]] được gỡ khỏi thể loại",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] và {{PLURAL:$2|một trang|$2 trang}} nữa được gỡ khỏi thể loại",
+       "autochange-username": "MediaWiki thay đổi tự động",
        "upload": "Tải tập tin lên",
        "uploadbtn": "Tải tập tin lên",
        "reuploaddesc": "Hủy tác vụ tải và quay lại mẫu tải tập tin lên",
        "fileexists-shared-forbidden": "Một tập tin với tên này đã tồn tại ở kho tập tin dùng chung.\nNếu bạn vẫn muốn tải tập tin của bạn lên, xin hãy quay lại và dùng một tên khác. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Tập tin này có vẻ là bản sao của {{PLURAL:$1|tập tin|các  tập tin}} sau:",
        "file-deleted-duplicate": "Một tập tin giống hệt như tập tin này ([[:$1]]) đã từng bị xóa trước đây. Bạn nên xem lại lịch sử xóa tập tin trước khi tiếp tục tải nó lên lại.",
-       "file-deleted-duplicate-notitle": "Một tập tin giống hệt như tập tin này đã từng bị xóa và tên bị đàn áp trước đây.\nBạn nên xin một người có quyền xem dữ liệu tập tin bị đàn áp xem lại trường hợp này trước khi tiếp tục tải nó lên lại.",
+       "file-deleted-duplicate-notitle": "Một tập tin giống hệt như tập tin này đã từng bị xóa và tên bị xóa hẳn trước đây.\nBạn nên xin một người có quyền xem dữ liệu tập tin bị xóa hẳn xem lại trường hợp này trước khi tiếp tục tải nó lên lại.",
        "uploadwarning": "Cảnh báo!",
        "uploadwarning-text": "Xin hãy chỉnh sửa miêu tả tập tin ở dưới và thử lại.",
        "savefile": "Lưu tập tin",
        "upload-http-error": "Xảy ra lỗi HTTP: $1",
        "upload-copy-upload-invalid-domain": "Không có sẵn các bản sao tải lên tại tên miền này.",
        "upload-dialog-title": "Tải tập tin lên",
-       "upload-dialog-error": "Đã xuất hiện lỗi",
-       "upload-dialog-warning": "Đã xuất hiện cảnh báo",
        "upload-dialog-button-cancel": "Hủy bỏ",
        "upload-dialog-button-done": "Xong",
        "upload-dialog-button-save": "Lưu",
        "upload-dialog-button-upload": "Tải lên",
-       "upload-dialog-label-select-file": "Chọn tập tin",
-       "upload-dialog-label-infoform-title": "Chi tiết",
-       "upload-dialog-label-infoform-name": "Tên",
-       "upload-dialog-label-infoform-description": "Miêu tả",
-       "upload-dialog-label-usage-title": "Sử dụng",
-       "upload-dialog-label-usage-filename": "Tên tập tin",
+       "upload-process-error": "Đã xuất hiện lỗi",
+       "upload-process-warning": "Đã xuất hiện cảnh báo",
+       "upload-form-label-select-file": "Chọn tập tin",
+       "upload-form-label-infoform-title": "Chi tiết",
+       "upload-form-label-infoform-name": "Tên",
+       "upload-form-label-infoform-description": "Miêu tả",
+       "upload-form-label-usage-title": "Sử dụng",
+       "upload-form-label-usage-filename": "Tên tập tin",
+       "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-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ọ.",
+       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Tôi khẳng định rằng tôi giữ quyền tác giả của tập tin này và đồng ý phát hành, một cách không thể hủy bỏ, tập tin này cho Wikimedia Commons theo giấy phép [https://creativecommons.org/licenses/by-sa/4.0/deed.vi Creative Commons Ghi công–Chia sẻ tương tự 4.0], và tôi chấp nhận các [https://wikimediafoundation.org/wiki/Terms_of_Use/vi?uselang=vi Điều khoản Sử dụng].",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Nếu bạn không giữ quyền tác giả của tập tin hoặc muốn phát hành nó theo một giấy phép khác, xin nghĩ đến việc sử dụng [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=vi Trình thuật sĩ tải lên Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Bạn cũng có thể muốn thử [[Special:Upload|trang tải lên tại {{SITENAME}}]] nếu trang đó cho phép tải lên tập tin này theo các quy định của họ.",
        "backend-fail-stream": "Không thể gửi luồng tập tin $1.",
        "backend-fail-backup": "Không thể sao lưu tập tin $1.",
        "backend-fail-notexists": "Tập tin $1 không tồn tại.",
        "filerevert-legend": "Lùi lại tập tin",
        "filerevert-intro": "Bạn đang lùi '''[[Media:$1|$1]]''' về [$4 phiên bản lúc $3, $2].",
        "filerevert-comment": "Lý do:",
-       "filerevert-defaultcomment": "Đã lùi về phiên bản lúc $2, $1",
+       "filerevert-defaultcomment": "Đã lùi về phiên bản lúc $2 vào $1 ($3)",
        "filerevert-submit": "Lùi lại",
        "filerevert-success": "'''[[Media:$1|$1]]''' đã được lùi về [$4 phiên bản lúc $3, $2].",
        "filerevert-badversion": "Không tồn tại phiên bản trước đó của tập tin tại thời điểm trên.",
        "nopagetext": "Trang đích bạn chỉ định không tồn tại.",
        "pager-newer-n": "{{PLURAL:$1|1|$1}} mới hơn",
        "pager-older-n": "{{PLURAL:$1|1|$1}} cũ hơn",
-       "suppress": "Giám sát viên",
+       "suppress": "Xóa hẳn",
        "querypage-disabled": "Trang đặc biệt này bị tắt vì lý do hiệu suất.",
        "apihelp": "Trợ giúp API",
        "apihelp-no-such-module": "Không tìm thấy mô đun “$1”",
        "emailccsubject": "Bản sao của thư gửi cho $1: $2",
        "emailsent": "Đã gửi",
        "emailsenttext": "Thư của bạn đã được gửi.",
-       "emailuserfooter": "Thư điện tử này được $1 gửi đến $2 thông qua chức năng “Gửi thư cho người này” của {{SITENAME}}.",
+       "emailuserfooter": "Thư điện tử này được $1 gửi đến $2 thông qua chức năng “{{int:emailuser}}” của {{SITENAME}}.",
        "usermessage-summary": "Đang để lại thông điệp hệ thống.",
        "usermessage-editor": "Trình thông điệp hệ thống",
        "watchlist": "Danh sách theo dõi",
        "deletepage": "Xóa trang",
        "confirm": "Xác nhận",
        "excontent": "nội dung cũ: “$1”",
-       "excontentauthor": "nội dung cũ: “$1” (người viết duy nhất “[[Special:Contributions/$2|$2]]”)",
+       "excontentauthor": "nội dung cũ: “$1”; người viết duy nhất: “[[Special:Contributions/$2|$2]]” ([[User talk:$2|thảo luận]])",
        "exbeforeblank": "nội dung trước khi tẩy trống: “$1”",
        "delete-confirm": "Xóa “$1”",
        "delete-legend": "Xóa",
        "sp-contributions-newbies-sub": "Các thành viên mới",
        "sp-contributions-newbies-title": "Đóng góp của các thành viên mới",
        "sp-contributions-blocklog": "nhật trình cấm",
-       "sp-contributions-suppresslog": "đóng góp đã bị đàn áp của thành viên",
+       "sp-contributions-suppresslog": "đóng góp của thành viên đã bị xóa hẳn",
        "sp-contributions-deleted": "đóng góp đã bị xóa của thành viên",
        "sp-contributions-uploads": "tập tin tải lên",
        "sp-contributions-logs": "nhật trình",
        "move-page-legend": "Di chuyển trang",
        "movepagetext": "Dùng mẫu dưới đây để đổi tên một trang, di chuyển tất cả lịch sử của nó sang tên mới.\nTên cũ sẽ trở thành trang đổi hướng sang tên mới.\nBạn có thể cập nhật tự động các trang đổi hướng đến tên cũ.\nNếu bạn chọn không cập nhật, hãy nhớ kiểm tra [[Special:DoubleRedirects|đổi hướng kép]] hoặc [[Special:BrokenRedirects|đổi hướng đến trang không tồn tại]].\nBạn phải chịu trách nhiệm đảm bảo các liên kết đó tiếp tục trỏ đến nơi chúng cần đến.\n\nChú ý rằng trang sẽ '''không''' bị di chuyển nếu đã có một trang tại tên mới, trừ khi trang tại tên mới là trang đổi hướng và không có lịch sử sửa đổi trước đây.\nĐiều này có nghĩa là bạn có thể đổi tên trang lại như cũ nếu bạn có nhầm lẫn, và bạn không thể ghi đè lên một trang đã có sẵn.\n\n'''CẢNH BÁO!'''\nViệc làm này có thể dẫn đến sự thay đổi mạnh mẽ và không lường trước đối với các trang dễ nhìn thấy;\nxin hãy chắc chắn rằng bạn đã nhận thức được những hệ lụy của nó trước khi thực hiện.",
        "movepagetext-noredirectfixer": "Dùng mẫu dưới đây để đổi tên một trang, di chuyển tất cả lịch sử của nó sang tên mới.\nTên cũ sẽ trở thành trang đổi hướng sang tên mới.\nHãy nhớ kiểm tra [[Special:DoubleRedirects|đổi hướng kép]] hoặc [[Special:BrokenRedirects|đổi hướng đến trang không tồn tại]].\nBạn phải chịu trách nhiệm đảm bảo các liên kết đó tiếp tục trỏ đến nơi chúng cần đến.\n\nChú ý rằng trang sẽ '''không''' bị di chuyển nếu đã có một trang tại tên mới, trừ khi nó rỗng hoặc là trang đổi hướng và không có lịch sử sửa đổi trước đây.\nĐiều này có nghĩa là bạn có thể đổi tên trang lại như cũ nếu bạn có nhầm lẫn, và bạn không thể ghi đè lên một trang đã có sẵn.\n\n'''CẢNH BÁO!'''\nViệc làm này có thể dẫn đến sự thay đổi mạnh mẽ và không lường trước đối với các trang dễ nhìn thấy;\nxin hãy chắc chắn rằng bạn đã nhận thức được những hệ lụy của nó trước khi thực hiện.",
-       "movepagetalktext": "Trang thảo luận đi kèm sẽ được tự động di chuyển theo '''trừ khi''':\n*Đã tồn tại một trang thảo luận không trống tại tên mới, hoặc\n*Bạn không đánh vào ô bên dưới.\n\nTrong những trường hợp đó, bạn phải di chuyển hoặc hợp nhất trang theo kiểu thủ công nếu muốn.",
-       "movearticle": "Di chuyển trang:",
+       "movepagetalktext": "Nếu bạn đánh dấu hộp kiểm này, trang thảo luận đi kèm sẽ được tự động di chuyển theo trừ khi đã tồn tại một trang thảo luận không trống tại tên mới.\n\nTrong trường hợp đó, bạn phải di chuyển hoặc hợp nhất trang theo kiểu thủ công nếu muốn.",
        "moveuserpage-warning": "'''Cảnh báo:''' Bạn sắp di chuyển trang cá nhân của người dùng. Xin lưu ý rằng chỉ có trang này sẽ được di chuyển, còn người dùng sẽ ''không'' đổi tên.",
        "movecategorypage-warning": "<strong>Cảnh báo:</strong> Bạn sắp sửa di chuyển một trang thể loại. Lưu ý rằng chỉ trang này sẽ được di chuyển, còn trang nào được xếp vào thể loại cũ sẽ <em>không</em> được xếp vào thể loại mới.",
        "movenologintext": "Bạn phải là thành viên đã mở tài khoản và [[Special:UserLogin|đăng nhập]] mới di chuyển trang được.",
        "cant-move-to-user-page": "Bạn không có quyền di chuyển một trang đến trang cá nhân (ngoại trừ đến trang con của trang cá nhân).",
        "cant-move-category-page": "Bạn không có quyền di chuyển trang thể loại.",
        "cant-move-to-category-page": "Bạn không có quyền di chuyển một trang vào không gian tên Thể loại.",
-       "newtitle": "Tên mới",
+       "newtitle": "Tên mới:",
        "move-watch": "Theo dõi trang này",
        "movepagebtn": "Di chuyển trang",
        "pagemovedsub": "Di chuyển thành công",
        "logentry-newusers-byemail": "$1 {{GENDER:$2}}đã mở tài khoản người dùng $3 và nhận mật khẩu qua thư điện tử",
        "logentry-newusers-autocreate": "Tài khoản $1 {{GENDER:$2}}đã được mở tự động",
        "logentry-protect-move_prot": "$1 {{GENDER:$2}}đã chuyển mức khóa từ $4 thành $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2}}đã mở khóa $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2}}đã khóa $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2}}đã khóa $3 $4 [theo tầng]",
+       "logentry-protect-modify": "$1 {{GENDER:$2}}đã đổi mức khóa $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2}}đã đổi mức khóa $3 $4 [theo tầng]",
        "logentry-rights-rights": "$1 {{GENDER:$2}}đã đổi các nhóm bao gồm $3 từ $4 đến $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2}}$1 đã đổi các nhóm bao gồm $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2}}đã được tự động phong cấp từ $4 đến $5",
        "api-error-badaccess-groups": "Bạn không được phép tải tập tin lên wiki này.",
        "api-error-badtoken": "Lỗi nội bộ: Dấu hiệu bị hỏng.",
        "api-error-copyuploaddisabled": "Chức năng tải lên từ URL đã bị tắt trên máy chủ này.",
-       "api-error-duplicate": "Wiki này đã có [$2 {{PLURAL:$1|tập tin|$1 tập tin}} cùng nội dung] có tên khác",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Một|Các}} [$2 tập tin khác] cùng nội dung đã tồn tại trên website, nhưng {{PLURAL:$1|nó|chúng}} đã bị xóa.",
-       "api-error-duplicate-archive-popup-title": "Mang lại {{PLURAL:$1|tập tin|các tập tin}} đã bị xóa",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Tập tin|Các tập tin}} cùng nội dung",
+       "api-error-duplicate": "Wiki này đã có {{PLURAL:$1|tập tin|$1 tập tin}} cùng nội dung có tên khác.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Một|Các}} tập tin khác cùng nội dung đã tồn tại trên website, nhưng {{PLURAL:$1|nó|chúng}} đã bị xóa.",
        "api-error-empty-file": "Bạn đã gửi tập tin rỗng.",
        "api-error-emptypage": "Không cho phép tạo mới các trang rỗng.",
        "api-error-fetchfileerror": "Lỗi nội bộ: Việc tải tập tin bị thất bại.",
index 949bef4..1f230a5 100644 (file)
@@ -9,7 +9,8 @@
                        "Smeira",
                        "לערי ריינהארט",
                        "아라",
-                       "Rachmat.Wahidi"
+                       "Rachmat.Wahidi",
+                       "Macofe"
                ]
        },
        "tog-underline": "Dislienükön yümis:",
        "mergehistory-go": "Jonön redakamis balovik",
        "mergehistory-submit": "Balön fomamis",
        "mergehistory-empty": "Fomams nonik kanons pabalön.",
-       "mergehistory-success": "{{PLURAL:$3|Fomam 1|Fomams $3}} pada: [[:$1]] {{PLURAL:$3|pebalon|pebalons}} benosekiko ini pad: [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Fomam 1|Fomams $3}} pada: $1 {{PLURAL:$3|pebalon|pebalons}} benosekiko ini pad: [[:$2]].",
        "mergehistory-fail": "No eplöpos ad ledunön balami jenotemas, kontrololös pada- e timaparametis.",
        "mergehistory-no-source": "Fonätapad: $1 no dabinon.",
        "mergehistory-no-destination": "Zeilapad: $1 no dabinon.",
        "filerevert-legend": "Geükön ragivi",
        "filerevert-intro": "Anu geükol padi: '''[[Media:$1|$1]]''' ad [fomam $4: $3, $2].",
        "filerevert-comment": "Kod:",
-       "filerevert-defaultcomment": "Pegeükon ad fomam: $2, $1",
+       "filerevert-defaultcomment": "Pegeükon ad fomam: $2, $1 ($3)",
        "filerevert-submit": "Geükön",
        "filerevert-success": "Pad: '''[[Media:$1|$1]]''' pegeükon ad [fomam $4: $3, $2].",
        "filerevert-badversion": "No dabinon fomam topik büik ragiva at labü timamäk pegevöl",
        "mailnologin": "Ladet nonik ad sedön",
        "mailnologintext": "Mutol [[Special:UserLogin|nunädön oli]] e labön ladeti leäktronik lonöföl pö [[Special:Preferences|buükams olik]] ad dalön sedön poti leäktronik gebanes votik.",
        "emailuser": "Penön gebane at",
-       "emailpage": "Penön gebane",
        "emailpagetext": "Kanol gebön fometi dono ad sedön penedi leäktronik gebane at. Ladet leäktronik in [[Special:Preferences|gebanabüukams olik]] opubon as fonät (el \"De:\") peneda, dat getan okanon gepenön ole.",
        "defemailsubject": "Ladet leäktronik ela {{SITENAME}} de geban: \"$1\"",
        "noemailtitle": "Ladet no dabinon",
        "move-page-legend": "Topätükolöd padi",
        "movepagetext": "Me fomet at kanoy votükön padanemi, ottimo feapladölo jenotemi lölöfik ona disi nem nulik. Tiäd büik ovedon lüodüköm lü tiäd nulik. Yüms lü padatiäd büik no povotükons; kontrolös dabini [[Special:DoubleRedirects|lüodükömas telik]] u [[Special:BrokenRedirects|dädikas]]. Gididol ad garanön, das yüms blebons lüodükön lü pads, lü kels mutons lüodükön.\n\nKüpälolös, das pad '''no''' potopätükon if ya dabinon pad labü tiäd nulik, bisä vagon u binon lüodüköm e no labon jenotemi.\nAtos sinifon, das, if pölol, nog kanol gepladön padi usio, kö äbinon büo, e das no kanol pladön padi nulik sui pad ya dabinöl.\n\n'''Nuned!'''\nVotükam at kanon binön mu staböfik ä no paspetöl pö pad pöpedik;\nsuemolös, begö! gudiko sekis duna at büä ofövol oni.",
        "movepagetalktext": "Bespikapad tefik potopätükön itjäfidiko kobü pad at '''pläsif:'''\n* bespikapad no vägik labü tiäd nulik ya dabinon, u\n* vagükol anu bokili dono.\n\nÖn jenets at, if vilol topätükön bespikapadi u balön oni e padi ya dabinöl, ol it omutol dunön osi.",
-       "movearticle": "Topätükolöd padi",
        "movenologintext": "Mutol binön geban peregistaröl e [[Special:UserLogin|nunädön oli]] ad topätükön padi.",
        "movenotallowed": "No dalol topätükön padis.",
        "movenotallowedfile": "No dalol topätükön ragivis.",
index 5acfa3e..da6494d 100644 (file)
@@ -6,7 +6,8 @@
                        "Urhixidur",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Sorlignî les loyéns:",
        "revdelete-submit": "Apliker {{PLURAL:$1|al modêye tchoezeye|åzès modêyes tchoezeyes}}",
        "revdel-restore": "candjî l' veyåvisté",
        "deletedhist": "Istwere disfacêye",
-       "mergehistory-success": "$3 modêye{{PLURAL:$3||s}} di [[:$1]] {{PLURAL:$3|a stî metowe|ont stî metowes}} avou [[:$2]].",
+       "mergehistory-done": "$3 modêye{{PLURAL:$3||s}} di $1 {{PLURAL:$3|a stî metowe|ont stî metowes}} avou [[:$2]].",
        "mergehistory-fail": "Nén possibe di mete eshonne les istweres. Verifyîz l' pådje et les parametes di date.",
        "mergehistory-no-source": "Li pådje sourdant $1 n' egzistêye nén.",
        "mergehistory-reason": "Råjhon:",
        "mailnologin": "Nole adresse d' evoyeu",
        "mailnologintext": "Po-z evoyî èn emile a èn ôte uzeu i vs fåt esse [[Special:UserLogin|elodjî]] eyet aveur ene adresse emile d' evoyeu ki soeye valide dins vos [[Special:Preferences|preferinces]].",
        "emailuser": "Emiler a l' uzeu",
-       "emailpage": "Emilaedje a èn uzeu",
        "emailpagetext": "Vos ploz eployî l' formulrece chal pa dzo po-z evoyî èn emile a l' uzeu.\nL' adresse emile k' i gn a dins [[Special:Preferences|vos preferinces]] serè-st eployeye\ncome adresse di l' evoyeu (adresse «From:» di l' emile),\npo ki l' riçuveu poye risponde.",
        "defemailsubject": "Emile da l' uzeu «$1» so {{SITENAME}}",
        "noemailtitle": "Pont d' adresse emile",
        "move-page-legend": "Displaecî l' pådje",
        "movepagetext": "Chal vos ploz candjî l' no d' ene pådje, dj' ô bén displaecî l' pådje, eyet si istwere, eviè l' novea no.\nLi vî tite divénrè-st ene pådje di redjiblaedje viè l' novele.\nVos ploz mete otomaticmint a djoû les redjiblaedje k' evoyént sol vî tite.\nSi vos nel vloz nén fé, acertinez vs di verifyî s' i n' a nén des [[Special:DoubleRedirects|dobes]] ou [[Special:BrokenRedirects|crons redjiblaedjes]].\nVos estoz responsåve di fé çou k' i fåt po k' les loyéns continouwexhe di moenner la k' i fåt.\n\nNotez k' el pådje èn serè '''nén''' displaeceye s' i gn a ddja ene pådje avou l' novea tite, a moens k' ele soeye vude, ou ene pådje di redjiblaedje, et k' ele n' åye nole istwere.\nÇoula vout dire ki vos ploz ridisplaecî ene pådje viè l' no k' ele aveut djusse divant, et insi disfé vosse prumî displaeçaedje, å cas ou vos vs rindrîz conte ki vos avoz fwait ene flotche;\ney eto ki vos n' poloz nén spotchî par accidint ene pådje k' egzistêye dedja.\n\n'''ASTEME!'''\nOn displaeçaedje pout esse on consecant et nén atindou candjmint po ene pådje foirt léjhowe;\ns' i vs plait tuzez bén åzès consecwinces divant d' continouwer.",
        "movepagetalktext": "Li pådje di copene associeye serè\ndisplaeceye otomaticmint avou, '''a moens ki:'''\n*Ene pådje di copene nén vude egzistêye dedja dizo l' novea no,\n*Vos disclitchrîz l' boesse a clitchî chal pa dzo.\n\nDins ces cas la, vos dvroz displaecî l' pådje di copene al mwin, ou rcopyî\nsi contnou, si vos l' vloz mete adlé l' novea no\nd' l' årtike.",
-       "movearticle": "Displaecî di",
        "movenologintext": "I vs fåt esse èn uzeu eredjîstré eyet esse [[Special:UserLogin|elodjî]] por vos pleur displaecî ene pådje.",
        "newtitle": "Viè l' novea tite",
        "move-watch": "Shuve cisse pådje cial",
        "searchsuggest-containing": "ki contént...",
        "api-error-badaccess-groups": "Vos n' avoz nén l' droet d' eberweter des fitchîs so ç' wiki cial",
        "api-error-copyuploaddisabled": "Les eberwetaedjes pa URL ni vont nén so ç' sierveu cial.",
-       "api-error-duplicate": "N a ddja {{PLURAL:$1|[$2 èn ôte fitchî]|[$2 des ôtes fitchîs]}} avou l' minme contnou so nosse waibe",
-       "api-error-duplicate-archive": "N aveut ddja {{PLURAL:$1|[$2 èn ôte fitchî]|[$2 des ôtes fitchîs]}} avou l' minme contnou so nosse waibe, mins {{PLURAL:$1|il a stî rsaetchî|il ont stî rsaetchîs}}.",
-       "api-error-duplicate-archive-popup-title": "Ricopyî {{PLURAL:$1|l' fitchî|les fitchîs}} k' {{PLURAL:$1|a stî rsaetchî|k' ont stî rsaetchîs}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|fitchî|fitchîs}} a dobe",
+       "api-error-duplicate": "N a ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe",
+       "api-error-duplicate-archive": "N aveut ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe, mins {{PLURAL:$1|il a stî rsaetchî|il ont stî rsaetchîs}}.",
        "api-error-empty-file": "Vosse fitchî est vude.",
        "api-error-emptypage": "C' est nén permetou d' ahiver ene novele pådje et l' leyî vude.",
        "api-error-fetchfileerror": "Aroke divintrinne : ene sacwè a fwait berwete cwand on-z a volou rawè vosse fitchî",
index 7097a43..7097779 100644 (file)
@@ -9,7 +9,8 @@
                        "לערי ריינהארט",
                        "Kolega2357",
                        "아라",
-                       "MarcoAurelio"
+                       "MarcoAurelio",
+                       "Macofe"
                ]
        },
        "tog-underline": "Bagisa ha ilarom an mga sumpay:",
        "filerevert": "Igbalik $1",
        "filerevert-legend": "Igbalik an paypay",
        "filerevert-comment": "Rason:",
-       "filerevert-defaultcomment": "Ginbalik nga bersyon han $2, $1",
+       "filerevert-defaultcomment": "Ginbalik nga bersyon han $2, $1 ($3)",
        "filerevert-submit": "Igbalik",
        "filedelete": "Igpara $1",
        "filedelete-legend": "Igpara an file",
        "databasenotlocked": "An database in diri nakatrangka.",
        "move-page": "Mabalhin an $1",
        "move-page-legend": "Balhina an pakli:",
-       "movearticle": "Balhina an pakli:",
        "moveuserpage-warning": "'''Pahimatngon:''' Tibalhin ka hin pakli hin gumaramit. Alayon pagtigaman nga an pakli là an mababalhin ngan an gumaramit in ''diri'' mababalyoan hin ngaran.",
        "movenotallowed": "Waray ka pagtugot para makabalhin hin mga pakli.",
        "movenotallowedfile": "Waray ka pagtugot para makabalhin hin mga paypay.",
        "api-error-badaccess-groups": "Diri ka gintutugotan pagkarga paigbaw ha dinhi nga wiki.",
        "api-error-badtoken": "Sayop ha sulod: Maraot nga token.",
        "api-error-copyuploaddisabled": "Pagkarga paigbaw pinaagi han URL in diri mahihimo ha dinhi nga serbidor.",
-       "api-error-duplicate-archive-popup-title": "An nagdodoble {{PLURAL:$1|nga paypay|nga mga paypay}} in napara na.",
-       "api-error-duplicate-popup-title": "Nadoble {{PLURAL:$1|nga paypay|nga mga paypay}}.",
        "api-error-empty-file": "An paypay nga isinumite nimo in waray sulod.",
        "api-error-emptypage": "Naghihimo hin bag-o, diri gintutugotan an waray sulod nga mga pakli.",
        "api-error-filename-tooshort": "An ngaran han paypay in halipot hin duro.",
index ed6581e..e6c4e1b 100644 (file)
        "disclaimers": "Ay aartu",
        "disclaimerpage": "Project:Aartu yu daj",
        "edithelp": "Ndimbal",
-       "mainpage": "Xëtu Njëlbéen",
+       "mainpage": "Xët wu njëkk",
        "mainpage-description": "Xët wu njëkk",
        "policy-url": "Project:àtte",
        "portal": "Buntub askan",
        "nstab-template": "Royuwaay",
        "nstab-help": "Xëtu ndimbal",
        "nstab-category": "Wàll",
+       "mainpage-nstab": "Xët wu njëkk",
        "nosuchaction": "Jëf ji xameesu ko",
        "nosuchactiontext": "Jëf ji nga def ci URL bi xameesu  ko.\nXéj-na dangaa juum ci bind URL bi, walla nga topp lëkkalekaay bu baaxul.\nLii man naa doon it ag njuumte ci tëriin bi ñuy jëfandikoo ci {{SITENAME}}.",
        "nosuchspecialpage": "Xëtu jagleel wu amul",
        "userlogin-yourname-ph": "Duggalal sa turu jëfandikukat",
        "yourpassword": "Sa baatujàll",
        "userlogin-yourpassword": "Baatujàll",
+       "userlogin-yourpassword-ph": "Duggalal sa baatujàll",
        "createacct-yourpassword-ph": "Duggalal ab baatujàll",
        "yourpasswordagain": "Bindaatal sa baatujàll",
        "createacct-yourpasswordagain": "Dëggalal baatujàll bi",
        "createacct-yourpasswordagain-ph": "Duggalaatal baatujàll bi",
        "remembermypassword": "Denc sama yëgley dukkukaay ci bii joowukaay (lu ëpp nag $1 {{PLURAL:$1|day|days}})",
+       "userlogin-remembermypassword": "Wéyal dima jàppe gu dugg",
        "yourdomainname": "Sa barab",
        "externaldberror": "Njuumte judd na ci dàttub njoxe bi, walla day ni rekk amuloo sañ-sañu yeesal sa sàqum biti.",
        "login": "xammeeku",
        "logout": "Génnu",
        "userlogout": "Génnu",
        "notloggedin": "Duggoo de",
+       "userlogin-noaccount": "Amagoo am sàq?",
+       "userlogin-joinproject": "Bindu ci {{SITENAME}}",
        "nologin": "Sosagoo am sàq ? '''$1'''.",
        "nologinlink": "Sos ko leegi",
        "createaccount": "Sos am sàq",
        "gotaccount": "Sos nga am sàq? '''$1'''.",
        "gotaccountlink": "Dugg",
+       "userlogin-resetpassword-link": "Danga fàtte sa baatujàll?",
+       "userlogin-helplink2": "Ndimbal ñeel dugg gi",
+       "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}}",
+       "createacct-benefit-body2": "$1 {{PLURAL:$1|xët}}",
+       "createacct-benefit-body3": "recent {{PLURAL:$1|aji-cëru bi mujj|aji-cëru yi mujj}}",
        "badretype": "Baatujàll yi nga bind yemuñu.",
        "userexists": "Turu jëfandikukat bi nga bind am na boroom ba noppi. Tànnal weneen.",
        "loginerror": "Njuumte ci dugg gi",
        "login-throttled": "Jéem ngaa dugg ay yoon te jàllul.\n\nNgalla néggandikul ab diir door a jéemaat.",
        "loginlanguagelabel": "Làkk : $1",
        "pt-login": "Dugg",
+       "pt-login-button": "Dugg",
        "pt-createaccount": "Sos am sàq",
        "pt-userlogout": "Génn",
        "changepassword": "Coppiteg baatujàll bi",
        "resetpass-submit-loggedin": "Soppi baatujàll bi",
        "resetpass-wrong-oldpass": "Baatujall bu diiru walla bi teew baaxul.\nXèj-na baatujàll bi soppi nga ko ba noppi, walla xéj-na it dangaa laaj beneen baatujàll bu diiru.",
        "resetpass-temp-password": "Baatujàll bu diiru :",
+       "passwordreset": "Neenal baatujàll bi",
        "bold_sample": "Duufal mbind mi",
        "bold_tip": "Duufal mbind mi",
        "italic_sample": "Wengal mbind mi",
        "currentrev": "Sumb bi teew",
        "currentrev-asof": "Sumb bi teew bu $1",
        "revisionasof": "Sumb bu $1",
-       "revision-info": "Sumb bu $1, bu: $2",
+       "revision-info": "Sumbu $1, bu: {{GENDER:$6|$2}}$7",
        "previousrevision": "← Sumb bi jiitu",
        "nextrevision": "Sumb bi toftal →",
        "currentrevisionlink": "Sumb bi teew",
        "mergehistory-go": "Wone coppite yi boolewu",
        "mergehistory-submit": "Boole jagal yi",
        "mergehistory-empty": "Manuloo boole menn sumb.",
-       "mergehistory-success": "$3 {{PLURAL:$3|sumb|sumb}} mu [[:$1]] boole {{PLURAL:$3|nañ ko|nañ leen}} ci jàmm ak [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|sumb|sumb}} mu $1 boole {{PLURAL:$3|nañ ko|nañ leen}} ci jàmm ak [[:$2]].",
        "mergehistory-fail": "Booleb jaar-jaar yi antuwul. Falaatal xët wi ak taariix yi",
        "mergehistory-no-source": "Xëtu gongikuwaay bii $1 amul.",
        "mergehistory-no-destination": "Xëtu jëmuwaay bii $1 amul.",
        "mergelog": "Yéenekaayu boole yi",
        "revertmerge": "Neenal boole yi",
        "mergelogpagetext": "Lii ci suuf ab lim la ci boole yu mujj yu jaar-jaaru aw xët ak weneen .",
-       "history-title": "Jaar-jaaru sumbi « $1 »",
+       "history-title": "Jaar-jaaru sumbi \"$1\"",
+       "difference-title": "$1 wuute gi ci sumb yi",
        "lineno": "Rëdd $1 :",
        "compareselectedversions": "Méngale sumb yi nga fal",
        "editundo": "neenal",
+       "diff-multi-sameuser": "({{PLURAL:$1|Genn coppite gi ci diggante bi bu|$1 coppite yi ci diggante bi yu}} jëfandikukat bi ci-boppam {{PLURAL:$1|wonewuñu ko|wonewuñu leen}} )",
        "searchresults": "Ngértey ceet gi",
        "searchresults-title": "Ngértey ceet gu \"$1\"",
        "titlematches": "Koju xët yi ñoo yam",
        "rcnotefrom": "Yii ñooy coppite yi dalee '''$2''' (ba '''$1''').",
        "rclistfrom": "Wone coppite yi mujj yi dooree $3 $2",
        "rcshowhideminor": "$1 Coppite yu néewal",
+       "rcshowhideminor-show": "Wone",
        "rcshowhideminor-hide": "Nëbb",
        "rcshowhidebots": "$1 bot yi",
        "rcshowhidebots-show": "Wone",
+       "rcshowhidebots-hide": "Nëbb",
        "rcshowhideliu": "$1 jëfandikukat yi bindu",
        "rcshowhideliu-hide": "Nëbb",
        "rcshowhideanons": "$1 jëfandikukat yu binduwul",
+       "rcshowhideanons-show": "Wone",
        "rcshowhideanons-hide": "Nëbb",
        "rcshowhidepatr": "$1 coppite bees fuglu",
        "rcshowhidemine": "$1 samay cëru",
+       "rcshowhidemine-show": "Wone",
        "rcshowhidemine-hide": "Nëbb",
        "rclinks": "Wone $1 coppite yi mujj ci $2  fan yi mujj <br />$3.",
        "diff": "wuute",
        "booksources": "Téereb delluwaay",
        "booksources-search-legend": "Seet ab téereb delluwaay",
        "booksources-isbn": "ISBN :",
+       "booksources-search": "Seet",
        "booksources-text": "Lii ab lima ay lëkkalekaay la yu jëme ciy dal yu biti yuy jaayi téere yu yees ak yu magget, man nga faa ami xibaar ñeel téere yi ngay seet:",
        "booksources-invalid-isbn": "ISBN bi nga joxe mel na ni baaxul; xoolal bu baax ndax defoo ag njuumte ci bi nga koy duppi ca gongikuwaayam.",
        "specialloguserlabel": "Jëfandikukat :",
        "delete-warning-toobig": "Xët wii dafa am jaar-jaar bu bari, bu weesu $1 {{PLURAL:$1|sumb|sumb}}. Seenug farte man naa jur ag jaxasoo ci dáttub njoxeeb {{SITENAME}} ; def ko ak teey.",
        "rollback": "Loppanti coppite yi",
        "rollbacklink": "delloowaat",
+       "rollbacklinkcount": "Delloo $1 {{PLURAL:$1|coppite}}",
        "rollbackfailed": "Loppanti gi antuwul",
        "cantrollback": "Neenal coppite gi manula nekk;\nKi def coppite gi mooy Kenn ki masa cëru ci xët wii.",
        "alreadyrolled": "Loppantig coppite gu mujj gu xët wii di « [[:$1]] » manula nekk, ki ko def di [[User:$2|$2]] ([[User talk:$2|Waxtaan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nam na keneen ku jota soppi walla loppanti xët wi.\n\nKi mujje soppi xët wi mooy [[User:$3|$3]] ([[User talk:$3|Waxtaan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "move-page-legend": "Tuddewaat aw xët",
        "movepagetext": "Bii palanteeru coppite dafay tax a man a tuddewaat aw xët, toppale jaar-jaaram bépp ci tur wu bees wi.\nXët wu yàgg wa dafay jublu wu bees wi.\nMan ngaa def ba xët yi jubluwoon  wu yàgg wa  yeesal seen bopp, jublu koj wu bees wi.\nSoo taamoo bañ koo def, saytul baxam sosul [[Special:DoubleRedirects|ñaari jubluwaat]] walla [[Special:BrokenRedirects|jubluwaat bu baaxul]].\nKiy tuddewaat moo sasoo saytu baxam lëkkalekaay yaa ngi jëme fees njort mu jëme fa.\n\nJàppal ne xët wi '''duñu''' ko man a tuddewaat weneen tur wu am ba noppi, amaana muy wu këmm walla wu jubluwaat te amul benn jaar-jaar bu weesu.\nLii mooy tax nga man a dellu ci koj wu njëkk wu aw xët su tuddewaat gi antuwulee, te maneesul bind-ci-kaw wenn xëtt wu am ba noppi cig njuumte.\n\n'''MOYTUL'''\nJii jëf jees foogeewul man naa juri coppite ciy xët yees di saytu lu bari;\nwóorluwul bu beex ne nand nga njeexiti jëf ji laataa ngay wéy.",
        "movepagetalktext": "Xëtu waxtaanuwaay wi mu àndal di na tuddewaat boppam, lu dul:\n*Aw xët wu këmmul am ci wii tur wu bees, walla\n*boyot bi toftal faladi nees ko.\n\nCi yii anam, faww nga tuddewaat walla yokk wii xëtu waxtaanuwaay ak sa loxo, su la neexee.",
-       "movearticle": "Tuddewaatal jukki bi",
        "movenologintext": "Ngir man a tuddewaat aw xët, da ngaa war a [[Special:UserLogin|dugg]] ni jëfëndikookat bu bindu te saw sàq war naa am yaggaa bi mu laaj.",
        "movenotallowed": "Amoo sañ-sañu tuddewaat xët yi.",
        "movenotallowedfile": "Amoo sañ-sañu tuddewaat dencukaay yi.",
        "svg-long-desc": "Dencukaay SVG, kem bu jaadu  $1 × $2 pixel, dayoo dencukaay bi: $3",
        "show-big-image": "Dencukaay bi mu bàyyikoo",
        "show-big-image-preview": "Dayoob bii wonendi: $1.",
+       "show-big-image-other": "Yeneen {{PLURAL:$2|ñawaay}}: $1.",
        "show-big-image-size": "$1 × $2 pixel",
        "ilsubmit": "Seet",
        "bydate": "ci diir",
        "exif-imagewidth": "Yaatuwaay",
        "exif-imagelength": "Kawewaay",
        "exif-orientation": "Jubluwaay",
+       "exif-xresolution": "Ñawaay gu tëdd",
+       "exif-yresolution": "Ñawaay gu taxaw",
        "exif-datetime": "Taariix ak waxtu coppiteg dencukaay bi",
        "exif-make": "Defarkatu nataalukaay bi",
        "exif-software": "Jëfekaay bees jëfandikoo",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|waxtaan]])",
        "specialpages": "Xëti jagleel",
        "tag-filter": "Seggee ak [[Special:Tags|Tafaan]]:",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tag}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tafaan}}]]: $2)",
        "logentry-delete-delete": "$1 {{GENDER:$2|moo far}} xët wi $3",
        "revdelete-restricted": "doxalub digal ngir yorkat yi",
        "revdelete-unrestricted": "digal ngir yorkat yi deñ na",
+       "logentry-move-move": "$1 {{GENDER:$2|moo toppale}} xët wii di $3 jëmale ko ci $4",
        "logentry-newusers-create": "Sàqum jëfandikukat $1 sos nañu ko",
+       "logentry-upload-upload": "$1 {{GENDER:$2|moo yeb}} $3",
        "rightsnone": "(menn)",
        "revdelete-summary": "soppi tënk gi",
        "searchsuggest-search": "Seet"
index ae6928f..4ec3136 100644 (file)
        "mergehistory-go": "显示可合并个编辑",
        "mergehistory-submit": "合并版本",
        "mergehistory-empty": "呒没修订可以合并",
-       "mergehistory-success": "[[:$1]]个$3趟修订已成功合并到[[:$2]]。",
+       "mergehistory-done": "$1个$3趟修订已成功合并到[[:$2]]。",
        "mergehistory-fail": "弗可以进行历史合并,请重新检查页面以及辰光参数。",
        "mergehistory-no-source": "来源页面$1弗存在。",
        "mergehistory-no-destination": "目的页面$1弗存在。",
        "move-page-legend": "页面捅荡",
        "movepagetext": "用下底個表會轉名字一張頁面,全部歷史都移到新名字裏。\n老個名字會變成戳到新名字個轉戳頁。\n到旧页面个连接弗会改变;注意检查双重定向或者坏脱个重定向。\n倷有实概个责任,即连接原要连到俚笃应该连到个场呵去。\n\n注意,如果新名字归面搭已经有页面个说话,老名字个页面'''弗'''会拨移动,除非归个是只空页面或者是只重定向并且呒拨编辑历史。个也就是讲,假使倷犯错误个说话,倷好拿一只重命名过个页面还原到原来个名字,但倷弗好覆盖一只已经来浪个页面。\n\n<b>警告!</b>\n箇嘸數會有名氣個引起对一只热门页面剧烈个、想弗着个改变。\n来操作前头请倷确定倷已经充分了解个能做法个后果。",
        "movepagetalktext": "相关讨论页将自动搭该页面一淘移动,'''除非''':\n*新页面已经有仔一只非空个讨论页,或者\n*侬弗勾选下头个复选框。\n\n垃拉箇星情况下头,侬必须手工移动或合并页面。",
-       "movearticle": "页面移动:",
        "movenologintext": "倷板定要是已登记用户且勒拉[[Special:UserLogin|登录]]状态下头再好拿页面捅荡。",
        "newtitle": "新标题:",
        "move-watch": "监控来源以及目标页",
index f23dfee..96a34da 100644 (file)
        "tog-hideminor": "Баһ ясвр отхн ясвр седкүләс нуух",
        "tog-hidepatrolled": "Шүүсн ясвр отхн ясвр седкүләс нуух",
        "tog-newpageshidepatrolled": "Шүүсн халхс отхн ясвр седкүләс нуух",
-       "tog-extendwatchlist": "Һанц отхн биш хамг ясврта өргн оврхин седкүл",
+       "tog-extendwatchlist": "Һанц отхн биш хамг ясврта өргн оврлң",
        "tog-usenewrc": "Ясрулсн шидрә сольлһна сеткүл олзлх (JavaScript кергтә)",
        "tog-numberheadings": "Эврәр һарцг тойглх",
        "tog-showtoolbar": "Ясврин зевсг үзүлх",
        "tog-editondblclick": "Давхр шавдлһар халх ясх",
        "tog-editsectiononrightclick": "Һарцг барун шавдсар салвр чиклх",
-       "tog-watchcreations": "Мини бүтәсн халхс болн орулсн боомгуд оврхин седкүлд немх",
-       "tog-watchdefault": "Мини яссн халхс болн боомгуд оврхин седкүлд немх",
-       "tog-watchmoves": "Мини зөөсн халхс болн боомгуд оврхин седкүлд немх",
-       "tog-watchdeletion": "Мини әрлһсн халхс болн боомгуд оврхин седкүлд немх",
+       "tog-watchcreations": "Мини бүтәсн халхс болн орулсн боомгуд оврлңд немх",
+       "tog-watchdefault": "Мини яссн халхс болн боомгуд оврлңд немх",
+       "tog-watchmoves": "Мини зөөсн халхс болн боомгуд оврлңд немх",
+       "tog-watchdeletion": "Мини әрлһсн халхс болн боомгуд оврлңд немх",
        "tog-minordefault": "Хамг ясвр баһ шиг таарсар темдглх",
        "tog-previewontop": "Ясврин хәәрцг өмн хәләвр үзүлх",
        "tog-previewonfirst": "Ясврт одхла, хәләвр үзүлх",
        "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-ccmeonemails": "Мини бус демнәчт йовулсн бичгин дүрлвр нанд йовулх",
        "tog-diffonly": "Йилһәнә дор халхин дотр эс үзүлх",
        "tog-showhiddencats": "Нуусн әәшлүд үзүлх",
        "mainpage": "Нүр халх",
        "mainpage-description": "Нүр халх",
        "policy-url": "Project:Бодлһн",
-       "portal": "Ниицәнә хург",
-       "portal-url": "Project:Ниицәнә хург",
+       "portal": "Ниицәнә күрә",
+       "portal-url": "Project:Ниицәнә күрә",
        "privacy": "Нуултын бодлһн",
        "privacypage": "Project:Нуултын бодлһн",
        "badaccess": "Зөвшәлин эндү",
        "searchprofile-articles": "Зүүлс",
        "searchprofile-images": "Үзгдл-соңсвр",
        "searchprofile-everything": "Хамг",
+       "searchprofile-advanced": "Нәрн",
        "searchprofile-articles-tooltip": "$1 дотр хәәх",
        "searchprofile-images-tooltip": "Боомг хәәх",
        "search-result-size": "$1 ({{PLURAL:$2|$2 үг|$2 үг|$2 үг}})",
        "datedefault": "Көг уга",
        "prefs-personal": "Демнәчна то-диг",
        "prefs-rc": "Отхн ясвр",
-       "prefs-watchlist": "Оврхин седкүл",
+       "prefs-watchlist": "Оврлң",
        "prefs-watchlist-days": "Шинҗллһнә седкүлд үзүлсн ик гисн өдрин то:",
        "prefs-watchlist-days-max": "$1 {{PLURAL:$1|өдрәс|өдрәс}} удан биш",
        "prefs-misc": "Бус",
        "prefixindex": "Цуг халхс эн эклцтә",
        "newpages": "Шин халхс",
        "move": "Көндәх",
-       "movethispage": "Эн халхд шин нер аль шин орм өгх",
+       "movethispage": "Эн халх дәкн нерәдх",
        "pager-newer-n": "$1 нань шин",
        "pager-older-n": "$1 нань хуучн",
        "booksources": "Дегтрин делгүрс",
        "linksearch": "Һазад заалһ хәәвр",
        "listgrouprights-members": "(мөчүдин сеткүл)",
        "emailuser": "Энд E-mail йовулх",
-       "watchlist": "Оврхин седкүл",
-       "mywatchlist": "Оврхин седкүл",
-       "addedwatchtext": "«[[:$1]]» халх тана [[Special:Watchlist|оврхин седкүлд]] немв.\nЭн халхин болн үүнә меткән халхин ирх сольлһн энд бүрктх.",
+       "watchlist": "Оврлң",
+       "mywatchlist": "Оврлң",
+       "addedwatchtext": "«[[:$1]]» халх тана [[Special:Watchlist|оврлңд]] немв.\nЭн халхин болн меткәнь халхин ирх сольлһн энд бүрктх.",
        "removedwatchtext": "«[[:$1]]» халх тана [[Special:Watchlist|шинҗллһнә сеткүләс]] һарһв.",
        "watch": "Шинҗлх",
        "watchthispage": "Эн халхиг шинҗлх",
        "unwatch": "Шинҗлх биш",
-       "watchlist-details": "Тана оврхин седкүлд меткәнә халхас бус $1 халх.",
+       "watchlist-details": "Тана оврлңд меткәнә халхас бус $1 халх.",
        "wlshowlast": "Сүл $1 цагин $2 өдрин туршк үзүлх",
        "watchlist-options": "Шинҗллһнә сеткүлин көгүд",
        "watching": "Шинҗллһнә бүтлклд немлһн...",
        "block-log-flags-nocreate": "бичгдлһиг бүтәҗ болшго",
        "movepagetext": "Та дораһар цаасар, халхин сольлһна тууҗ көндәд, терүнә нериг сольх.\nХуучн нерн шин нерд авч оддг болх.\nТа хуучн нерд эврәр авч одлһн шинрүлҗ чаднат.\nЭн кехлә уга, буйн болтха, [[Special:DoubleRedirects|давхр]] болн [[Special:BrokenRedirects|татасн]] авч одлһн шүүтн.\nТа заалһуд чик үлдг даавртә бәәнәт.\n\nШинҗлтн: тер нертә халх бәәдг (авч оддг, хоосн, тууҗта уга йовдлас биш) бәәхлә, халх '''көндх уга'''.\nТер учрар, эндүһәр көндлһн кехлә, та халхиг хәрү көндҗ чаднат, болв бәәдг халхиг зүлгхшт.\n\n'''УРДАСНЬ ЗӘҢГ!'''\nКөндллһн «ачта» халхин ик-генткн хүврлһиг кеҗ чадна. Цаараньдн кехәр, тадна үүлдин ашуд медтн.",
        "movepagetalktext": "Терүнә ухалвр халх әврәр көндәх. '''Эс гиҗ:'''\n\n*Тер нертә хоосн уга ухалвр халх бәәнә.\n*Та дораһар ховдиг сунһв уга.\n\nТер учрар, седхлә, та эврә һарар көндәтн аль нер сольтн.",
-       "movearticle": "Халхиг йовулх:",
        "newtitle": "Шин нернь:",
        "move-watch": "Эн халхиг шинҗлх",
        "movepagebtn": "Халхиг йовулх",
        "tooltip-watch": "Эн халхиг тана шинҗллһнә сеткүлд немх",
        "tooltip-rollback": "Шидрә демнчна сольлһн нег дарцар уга кех",
        "tooltip-undo": "Эн хүврлһиг уга келһн, хәләвртә болн  учрта.",
+       "pageinfo-toolboxlink": "Халхин медәл",
        "previousdiff": "← Урдк сольлһн",
        "nextdiff": "Дарук сольлһн →",
        "file-info": "боомгин кемҗә: $1, MIME төрл: $2",
index 0a79897..c2a6910 100644 (file)
        "mergehistory-go": "აჩვენეთ გაერთიანებული ცვლილებები",
        "mergehistory-submit": "ცვლილებების შერწყმა",
        "mergehistory-empty": "რაიმე ცვლილების შერწყმა შეუძლებელია.",
-       "mergehistory-success": "$3 {{PLURAL:$3|შესწორება|შესწორებები|შესწორებების}}  [[:$1]]-დან წარმატებით {{PLURAL:$3|გადაიტანა|გადაიტანნენ|გადატანილი იქნენ}}  [[:$2]]-ში.",
+       "mergehistory-done": "$3 {{PLURAL:$3|შესწორება|შესწორებები|შესწორებების}}  $1-დან წარმატებით {{PLURAL:$3|გადაიტანა|გადაიტანნენ|გადატანილი იქნენ}}  [[:$2]]-ში.",
        "mergehistory-fail": "ვერ მოხერხდა გვერდების ისტორიის გაერთიანება, გთხოვთ შეამოწმოთ გვერდის პაარამეტრები და დრო.",
        "mergehistory-fail-toobig": "არ ხერხდება ისტორიების შერწყმა, რამეთუ აუცილებელია დაშვებული ლიმიტის მეტი ნაწილის გადატანა $1 ვერსიაში.",
        "mergehistory-no-source": "დანიშნულების გვერდი $1 არ არსებობს.",
        "recentchangeslinked-summary": "თენა რე მეწურაფილი ხასჷლაწკჷმა (ვარა მეწურაფილი კატეგორიაშ მაკათურეფწკჷმა) მერსხუაფილი ხასჷლეფს ეკონია ბორჯის ღოლამირი თირაფეფიშ ერკებული. ხასჷლეფი [[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 ხასჷლა}} ლასირი რე კატეგორიაშე",
        "upload": "ფაილიშ ეხარგუა",
        "uploadbtn": "ფაილიშ გეთება",
        "reuploaddesc": "გააუქმეთ ატვირთვა და დაუბრუნდით ატვირთვის ფორმას",
        "upload-http-error": "მოხდა HTTP შეცდომა: $1",
        "upload-copy-upload-invalid-domain": "ამ დომენში ატვირთვების კოპირება არ არის ხელმისაწვდომი.",
        "upload-dialog-title": "გეხარგე ფაილეფი",
-       "upload-dialog-error": "ჩილათაქ მოხვადჷ",
        "upload-dialog-button-cancel": "გოუქვაფა",
        "upload-dialog-button-done": "ღოლამირჷ რე",
        "upload-dialog-button-save": "ჩუალა",
        "upload-dialog-button-upload": "ეხარგუა",
-       "upload-dialog-label-select-file": "გეგშაგორით ფაილი",
-       "upload-dialog-label-infoform-title": "დეტალეფი",
-       "upload-dialog-label-infoform-name": "ჯოხო",
-       "upload-dialog-label-infoform-description": "ეჭარუა",
-       "upload-dialog-label-usage-title": "გიმორინაფა",
-       "upload-dialog-label-usage-filename": "ფაილიშ ჯოხო",
+       "upload-process-error": "ჩილათაქ მოხვადჷ",
+       "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": "ფაილიშ ჯოხო",
        "backend-fail-stream": "ფაილი $1 ტრანსლირება ვერ მოხერხდა.",
        "backend-fail-backup": "ფაილი $1 სარეზერვო ასლის გაკეთება ვერ მოხერხდა.",
        "backend-fail-notexists": "ფაილი $1 არ არსებობს.",
        "move-page-legend": "გვერდიშ გინოღალა",
        "movepagetext": "გიმენ ფორმაშ გუმორინაფა ხასილას დუთირანს ჯოხოს დო თელ თეშ ისტორიას გეგნიღანს ახალ ჯოხოშა. \nჯვეშ ჯოხო გინირთუ ახალ ჯოხოშა გინმაწურაფალ ხასილათ. \nთქვა შეილებუნა ავტომატურო გაახალათ თი გინოწურაფეფ, ნამუთ ჯვეშ ჯოხოშა ირძენა წურაფასინ. \nთქვა ქისხუნუანთ, ნამდა თენა ვა ღოლათინ, აუცილებერო შეამოწმით [[Special:DoubleRedirects|double]], ვარა [[Special:BrokenRedirects|broken redirects]].\nთქვა რეთ თიშ გამამინჯე, ნამუდა რცხუეფ იწურუაფუდან თი ხასილეფშა, სოდგა თინეფ წესით ოკო იწურუანინ.\n\n\nგეთოლისწორით, ნამუდა ხასილა '''ვა''' გინურს უკვე ქო არსებენს ხასილა ახალ ჯოხოთი-და დო თე ხასილა ვა რე ჩოლიერ-და, ვარა გინმაწურაფალ-და დო ვა უღუ რედაქტირეფეფიშ ისტორია-და. \n\nთენა თის ნიშნენს, ნამუდა ჩილათაქ მოირთეს–და, თქვა შეილებუნა ხასილას დურთინუათუ ჯვეში ჯოხო, მარა ვა შეილებუნა რსებულ ხასილას გინაჭარათინ. \n\n'''გათხილება!'''\nთენაქ შილება იყ’უას პოპულარულ ხასილაშა მიშაღალირ მოულოდნელ დო არსებით თირაფაქ; ქორთხინთ, ათე ქიმინჯიშ მოღალუეფ გეთოლისწორათ სოიშახ მიაყ’უნუდათ თეშ ღოლამასინ.",
        "movepagetalktext": "ასოცირებულ სხუნუაშ ხასილა ავტომატურო იყ'ი გინოღალირ თეწკუმა ართო, '''გეყ'ვენჯ შემთხვევეფიშ გიშარკებულო:''' \n*ჩოლიერ ვარენ ეფერ სხუნუაშ ხასილა უკვე რსებენს ახალ ჯოხოთ, ვარდა\n*თქვა თუდო მოჩამილ ოჭკორიეს მონწყუნთ მიკიწონებაშ ღანკის–და.\n\nათე შემთხვევეფს, თენა მიკორინეთ–და, თქვა გაყ’ინა ხასილეფ მანუალურო გინაღალარ, ვარდა აკორტყუალარ.",
-       "movearticle": "ხასილაშ გინოღალა",
        "newtitle": "ახალ ჯოხო",
        "move-watch": "წყუ ხასილაშ დო სამიზნე ხასილაშ კონტროლ",
        "movepagebtn": "ხასილაშ გინოღალა",
index 044793e..fb0104a 100644 (file)
@@ -14,7 +14,9 @@
                        "아라",
                        "Har-wradim",
                        "Amire80",
-                       "පසිඳු කාවින්ද"
+                       "පසිඳු කාවින්ද",
+                       "Matma Rex",
+                       "Macofe"
                ]
        },
        "tog-underline": "שטרייכט אונטער לינקען",
        "mergehistory-go": "צייג צוזאמשמעלצונג ענדערונגן",
        "mergehistory-submit": "צונויפֿגיסן רעוויזיעס",
        "mergehistory-empty": "קיין רעוויזיעס קען נישט ווערן צונויפֿגעגאסן.",
-       "mergehistory-success": "{{PLURAL:$3|איין גירסא|$3 גירסאות}} פֿון [[:$1]] צונויפֿגעגאסן אין [[:$2]] מיט דערפֿאלג.",
+       "mergehistory-done": "{{PLURAL:$3|איין גירסא|$3 גירסאות}} פֿון $1 צונויפֿגעגאסן אין [[:$2]] מיט דערפֿאלג.",
        "mergehistory-fail": "נישט מעגלעך אדורכצופֿירן היסטאריע צונויפֿגאס, ביטע זײַט בודק די בלאַט און צײַט פאַראַמעטערס.",
        "mergehistory-fail-toobig": "אוממעגלעך אויסצופירן היסטאריע צונויפמישונג ווײַל מען וואלט געדארפט באוועגן מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}.",
        "mergehistory-no-source": "מקור בלאַט $1 עקזיסטירט נישט.",
        "upload-http-error": "א HTTP גרײַז האט פאַסירט: $1",
        "upload-copy-upload-invalid-domain": "ארויפלאדן טעקעס פון דעם דאמיין נישט מעגלעך.",
        "upload-dialog-title": "אַרױפֿלאָדן טעקע",
-       "upload-dialog-error": "א גרײַז האט פאסירט",
-       "upload-dialog-warning": "א ווארענונג האט פאסירט",
        "upload-dialog-button-cancel": "אַנולירן",
        "upload-dialog-button-done": "ערליידיקט",
        "upload-dialog-button-save": "אויפֿהיטן",
        "upload-dialog-button-upload": "אַרויפֿלאָדן",
-       "upload-dialog-label-select-file": "קלויבן טעקע",
-       "upload-dialog-label-infoform-title": "פרטים",
-       "upload-dialog-label-infoform-name": "נאָמען",
-       "upload-dialog-label-infoform-description": "באַשרײבונג",
-       "upload-dialog-label-usage-title": "באניץ",
-       "upload-dialog-label-usage-filename": "טעקע נאמען",
+       "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": "טעקע נאמען",
        "backend-fail-stream": "קען נישט מאכן שטראמען טעקע $1.",
        "backend-fail-notexists": "נישט פֿאראן די טעקע $1.",
        "backend-fail-notsame": "א נישט־אידענטישע טעקע עקזיסטירט שוין ביי \"$1\".",
        "filerevert-legend": "צוריקדרייען טעקע",
        "filerevert-intro": "איר האַלט בײַ צוריקשטעלן די טעקע '''[[Media:$1|$1]]''' צו דער [$4 ווערסיע פֿון $3, $2].",
        "filerevert-comment": "אורזאַך:",
-       "filerevert-defaultcomment": "צוריקגעשטעלט צו דער ווערסיע פֿון $2, $1",
+       "filerevert-defaultcomment": "צוריקגעשטעלט צו דער ווערסיע פֿון $2, $1 ($3)",
        "filerevert-submit": "צוריקדרייען",
        "filerevert-success": "'''[[Media:$1|$1]]''' צוריקגשטעלט צו דער [$4 ווערסיע פֿון $3, $2].",
        "filerevert-badversion": "נישט פאראן קיין פריערדיקע לאקאלע ווערסיע פון דער טעקע מיטן געזוכטן צייטשטעמפל.",
        "movepagetext": "זיך באניצן מיט דעם פֿארעם וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירונג בלאט צום נייעם קעפל.\n\nאיר קענט דערהיינטיגן ווייטערפֿירונגען צום אלטן נאמען אויטאמאטיש.\n\nטאמער נישט, טוט פֿארזיכערן אז עס איז נישטא קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע ווייטערפֿירונגען]].\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צום געהעריגן ציל.\n\nדער בלאט וועט '''נישט''' ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרייבן אן עקסיסטירנדן בלאט.\n\n'''ווארענונג!'''\n אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט;\nביטע פֿארזיכערט אז איר פֿארשטייט די ווייטגרייכנדע קאנסקווענסן צו דער אקציע בעפֿאר איר פֿירט דאס אויס.",
        "movepagetext-noredirectfixer": "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\n\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירן בלאט צום נײַעם נאמען.\n\nטוט פֿארזיכערן אז עס בלײַבן נישט קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע]] ווייטערפֿירונגען.\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.\n\nאַכטונג: דער בלאַט וועט '''נישט''' ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז ליידיג. אדער ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.\n\n'''ווארענונג:''' אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
        "movepagetalktext": "דער רעדן בלאט וועט ווערן באַוועגט אויטאמאֵטיש מיט אים, '''אחוץ:'''\n* ס'איז שוין דא א נישט-ליידיגער בלאט מיטן נייעם נאמען, אדער.\n* איר נעמט  אראפ דעם צייכן פונעם קעסטל אונטן.\n\nאין די פֿעלער, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
-       "movearticle": "באוועג בלאט:",
        "moveuserpage-warning": "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
        "movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> be ארײַנשטעלן אין דער נייער קאטעגאריע.",
        "movenologintext": "איר דארפֿט זיך אײַנשרײַבן און זײַן  [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.",
        "api-error-badaccess-groups": "איר האט נישט קיין רעכטן אַרויפֿלאָדן טעקעס אויף דער וויקי.",
        "api-error-badtoken": "אינערלעכער גרײַז: סימן טויג נישט.",
        "api-error-copyuploaddisabled": "אַרויפֿלאָדן דורך URL איז אומאַקטיווירט אויף דעם סערווירער.",
-       "api-error-duplicate": "שוין דאָ אין דער וויקי {{PLURAL:$1|[$2 ָאַן אַנדער טעקע]|[$2 אַנדערע טעקעס]}} מיטן זעלבן תוכן.",
-       "api-error-duplicate-archive": "ס'איז שוין געווען {{PLURAL:$1| [$2 אַן אַנדער טעקע] | [$1 עטלעכע אַנדערע טעקעס]}} אויף דעם פּלאַץ מיט דעם זעלביקן תוכן, אָבער {{PLURAL:$1| עס איז | זיי זענען}}  געווארן אויסגעמעקט.",
-       "api-error-duplicate-archive-popup-title": "פֿאַרטאפלטע {{PLURAL:$1| טעקע וואָס איז| טעקעס וואָס זענען}}  שוין געווארן אויסגעמעקט",
-       "api-error-duplicate-popup-title": "פֿאַרטאפלטע {{PLURAL:$1| טעקע | טעקעס}}",
+       "api-error-duplicate": "שוין דאָ אין דער וויקי {{PLURAL:$1|ָאַן אַנדער טעקע|אַנדערע טעקעס}} מיטן זעלבן תוכן.",
+       "api-error-duplicate-archive": "ס'איז שוין געווען {{PLURAL:$1| אַן אַנדער טעקע | [$1 עטלעכע אַנדערע טעקעס]}} אויף דעם פּלאַץ מיט דעם זעלביקן תוכן, אָבער {{PLURAL:$1| עס איז | זיי זענען}}  געווארן אויסגעמעקט.",
        "api-error-empty-file": "די טעקע וואָס איר האט אײַנגעגעבן איז ליידיג.",
        "api-error-emptypage": "שאפן נייע ליידיקע בלעטער איז נישט ערלויבט.",
        "api-error-fetchfileerror": "אינערלעכער גרײַז: עפעס איז קאַליע געווארן בײַם ברענגען די טעקע.",
index 36384e4..8d0c704 100644 (file)
@@ -6,7 +6,8 @@
                        "Meno25",
                        "Urhixidur",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Ìfàlàsábẹ́ àwọn àjápọ̀:",
        "mergehistory-go": "Ìfihàn àwọn àtúnṣe tóṣeédàpọ̀",
        "mergehistory-submit": "Ìdàpọ̀ àwọn àtúnyẹ̀wò",
        "mergehistory-empty": "Àwọn àtúnyẹ̀wó kankan kò ṣeédàpọ̀.",
-       "mergehistory-success": "{{PLURAL:$3|Àtúnyẹ̀wò|Àwọn àtúnyẹ̀wò}} $3 fún [[:$1]] jẹ́ dídàpọ̀ mọ́ [[:$2]] láyọrísírere.",
+       "mergehistory-done": "{{PLURAL:$3|Àtúnyẹ̀wò|Àwọn àtúnyẹ̀wò}} $3 fún $1 jẹ́ dídàpọ̀ mọ́ [[:$2]] láyọrísírere.",
        "mergehistory-fail": "Kò le ṣe ìdàpọ̀ ìtàn, ẹ jọ̀wọ́ ẹ ṣàyẹ̀wò ojúewé náà àti àwọn pàrámità àkókò.",
        "mergehistory-no-source": "Ojúewé orísun $1 kò sí.",
        "mergehistory-no-destination": "Ojúewé ìdópin $1 kò sí.",
        "filerevert-legend": "Dá fáìlì padà",
        "filerevert-intro": "Ẹ ti fẹ́ dá fáìlì '''[[Media:$1|$1]]''' padà sí [$4 àtẹ̀jáde bó ṣe wà ní $3, $2].",
        "filerevert-comment": "Ìdíẹ̀:",
-       "filerevert-defaultcomment": "Jẹ́ dídápadà sí àtẹ̀jáde bó ṣe wà ní $2, $1",
+       "filerevert-defaultcomment": "Jẹ́ dídápadà sí àtẹ̀jáde bó ṣe wà ní $2, $1 ($3)",
        "filerevert-submit": "Dápadà",
        "filerevert-success": "'''[[Media:$1|$1]]''' ti jẹ́ dídápadà sí [$4 àtẹ̀jáde bó ṣe wà ní $3, $2].",
        "filerevert-badversion": "Kò sí àtúnyẹ̀wò abẹ́lé tẹ́lẹ̀ fún fáìlì yìí pẹ̀lú àmì àsìkò tí ẹ pèsè.",
        "movepagetext": "Fọ́ọ̀mù ìsàlẹ̀ yìí ṣàtúnṣọlórúkọ ojúewé, yíò kó gbogbo ìtàn rẹ̀ sí ojúewé tuntun.\nÀkọlé rẹ̀ tẹ́lẹ̀ yíò di ojúewé àtúndarí sí ọ̀dọ̀ àkọlẹ́ tuntun.\nẸ lè ṣọdọ̀tun àwọn àtúndarí tí wọ́n tọ́kasí àkọlé tìbẹ̀rẹ̀ fúnrararẹ̀.\nTí ẹ kò bá fẹ́ ṣèyí, ẹ ríi dájú pé ẹ kíyèsí [[Special:DoubleRedirects|ẹ̀mejì]] tàbí [[Special:BrokenRedirects|àwọn àtúndarí jíjá]].\nOjúṣe yín ni pé àwọn ìjápọ̀ ún tọ́kasí ibi tó yẹ kí wọn ó lọ sí.\n\nẸ kíyèsí pé ojúewé '''kò''' ní yípò tí ojúewé mìíràn bá wà tó ní orúkọ ojúewé tuntun ọ̀hún, àyàfi tó bá jẹ́ òfo tàbí àtúndarí tí kò sì ní ìtàn àtúnṣe ṣẹ́yìn.\nÈyí túmọ́sí wípé ẹ lẹ̀ ṣàtúnṣọlórúkọ ojúewé padà sí ibi tó ti jẹ́ ṣíṣàtúnṣọlórúkọ wá tí ẹ bá ṣe àṣìṣe, àti pé ẹ kò le ṣàkọléṣórí ojúewé tó wà.\n\n'''Ìkìlọ̀!'''\nÈyí le fa ìdàrú sí ojúewé tó gbajúmọ́;\nẹ ríi wípé ohun tí yíò ṣẹlẹ̀ ye yín kí ẹ tó tẹ̀síwájú.",
        "movepagetext-noredirectfixer": "Lílo fọ́ọ̀mù ìsàlẹ̀ yìí yíò ṣe àtúnsọlórúkọ ojúewé, yíò sì kó gbogbo ìtàn rẹ̀ lọ sí orí orúkọ tuntun.\nÀkọlé tó ní tẹ́lẹ̀ yíò di ojúewé àtúnjúwe sí àkọlé tuntun.\nẸ kí yèsi pé kò sí [[Special:DoubleRedirects|àtúnjúwe ẹ̀mejì]] tàbí [[Special:BrokenRedirects|jíjá]].\nOjúṣe yín ni láti rí pé àwọn àjápọ̀ únnawọ́ sí ibi tó yẹ kí wọn ó lọ.\n\nÀkíyèsí pé ojúewé náà '''kò''' ní jẹ́ yíyínípòpadà tí ojúewé míràn bá ti wà ní ibi àkọlé tuntun náà, àyàfi tó bá jẹ́ òfo tàbí àtúnjúwe, tí kò sì ní ìtàn àtúnṣe tẹ́lẹ̀.\nÈyí túmọ̀sí pé ẹ le dá orúkọ ojúewé padà sí orúkọ rẹ̀ tẹ́lẹ̀ tí ẹ bá ṣe àsìṣe, tí ẹ kò sì le ṣàkọlélórí ojúewé tí únbẹ.\n\n'''Ìkìlọ̀!'''\nÈyí le jẹ́ àtúnṣe òjijì fún ojúewé tó gbajúmọ̀; Ẹ ri dájú pé ohun tí yíò ṣẹlẹ̀ yé yín kí ẹ tó tẹ̀ síwájú.",
        "movepagetalktext": "Ojúewé ọ̀rọ̀ tó sopọ̀ mọ náà yíó yípò pọ̀ mọ fún ra rẹ̀ '''àfibí:'''\n*Tí ọ̀rọ̀ ojúewé tí kò jẹ́ òfo wà pẹ̀lú orúkọ tuntun náà, tàbí\n*Ẹ mú àmí kúrò nínú àpótí ìṣàlẹ̀ yìí.\n\nTí ó bá jẹ́ báhun, ẹ gbúdọ̀ ṣe ìyípò rẹ̀ fúnra yín.",
-       "movearticle": "Yípò ojúewé:",
        "moveuserpage-warning": "'''Ìkìlọ̀:''' Ẹ ti fẹ́ yí ipò ojúewé oníṣe kan padà. Ẹ kíyèsi pé ojúewé ọ̀hún nìkan ni yíò jẹ́ yíyípòpadà, oníṣe ọ̀hún ''kò'' ní jẹ́ títúnsọlọ́rúkọ.",
        "movenologintext": "Ẹ gbọ́dọ̀ jẹ́ oníṣe ajẹ́fíforúkọsílẹ̀ kí ẹ sì [[Special:UserLogin|wọlẹ́]] láti yípò ojúewé kan.",
        "movenotallowed": "Ẹ kò ní ìyọ̀nda láti yípò ojúewé.",
        "api-error-badaccess-groups": "Ẹ kò ní àṣẹ láti ru fáìlì wọlé sí orí wiki yìí.",
        "api-error-badtoken": "Àsìṣe inú: Ìdáramọ̀ búburú.",
        "api-error-copyuploaddisabled": "Ìrùsókè pẹ̀lú URL jẹ́ dídálẹ́kun lórí ẹ̀rọ-ìpèsè yìí.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 Fáìlì míràn]|[$2 Àwọn fáìlì míràn]}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 Fáìlì míràn]|[$2 Àwọn fáìlì míràn]}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà, sùgbọ́n {{PLURAL:$1|ó|wọ́n}} ti jẹ́ píparẹ́.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fáìlì àdáwòkọ tó ti|Àwọn fáìlì àdáwòkọ tí wọ́n ti}} jẹ́ píparẹ́.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fáìlì|Àwọn fáìlì}} àdáwòkọ.",
+       "api-error-duplicate": "{{PLURAL:$1|Fáìlì míràn|Àwọn fáìlì míràn}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Fáìlì míràn|Àwọn fáìlì míràn}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà, sùgbọ́n {{PLURAL:$1|ó|wọ́n}} ti jẹ́ píparẹ́.",
        "api-error-empty-file": "Fáílì tí ẹ fisílẹ̀ jẹ́ òfo.",
        "api-error-emptypage": "Ẹ kò ní àyè láti dá ojúewé tuntun tó jẹ́ òfo.",
        "api-error-fetchfileerror": "Àsìṣe inú: Kò le mú fáìlì ná jáde nítorí àsìṣe.",
index d5dc7ad..c187396 100644 (file)
        "nstab-template": "模",
        "nstab-help": "幫助頁",
        "nstab-category": "分類",
+       "mainpage-nstab": "頭版",
        "nosuchaction": "冇呢個動作",
        "nosuchactiontext": "呢個 URL 嘅指定動作 係無效嘅。\n你可能打錯咗個 URL ,或者撳錯咗唔啱嘅連結。\n呢個可能係{{SITENAME}}所用嘅軟件入面嘅臭蟲所引致嘅。",
        "nosuchspecialpage": "冇呢頁特別頁",
        "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": "你入嘅密碼唔一致。",
+       "usernameinprogress": "呢個名嘅戶口已經開緊。\n請等等。",
        "userexists": "你入嘅用戶名已經有人用咗。\n唔該揀過個名啦。",
        "loginerror": "登入錯誤",
        "createacct-error": "開戶口出錯",
        "changeemail-password": "你{{SITENAME}}個密碼:",
        "changeemail-submit": "轉電郵",
        "changeemail-throttled": "你試咗登入太多次,請喺$1後再試過。",
+       "changeemail-nochange": "請輸入個唔同嘅新電郵地址。",
        "resettokens": "重設密匙",
        "resettokens-text": "您可以重設有關你戶口私隱資料嘅密匙。\n\n如果你唔小心洩漏密匙,或者戶口畀人入侵,就要重設密匙。",
        "resettokens-no-tokens": "呢度無密匙可以重設。",
        "permissionserrorstext-withaction": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做$2:",
        "recreate-moveddeleted-warn": "'''警告: 你而家重開一版係先前曾經刪除過嘅。'''\n\n你應該要考慮吓繼續編輯呢一版係唔係適合嘅。\n為咗方便起見,呢一版嘅刪除同搬版記錄已經響下面提供:",
        "moveddeleted-notice": "呢一版已經刪咗。\n呢版嘅刪除同搬版日誌響下面提供咗以便參考。",
+       "moveddeleted-notice-recent": "唔好意思,呢版啱啱刪走咗(最近24個鐘內)。\n呢版刪版同搬版紀錄喺下低做參考。",
        "log-fulllog": "睇成個日誌",
        "edit-hook-aborted": "編輯由鈎取消咗。\n佢無畀到解釋。",
        "edit-gone-missing": "唔能夠更新頁。\n佢可能啱啱刪除咗。",
        "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": "呢個編輯可以取消。請檢查一下個差異去確認呢個係你要去做嘅,跟住儲存下面嘅更改去完成編輯。",
        "undo-failure": "呢個編輯唔能夠取消,由於同途中嘅編輯有衝突。",
        "undo-norev": "呢個編輯唔能夠取消,由於佢唔存在或者刪除咗。",
        "mergehistory-go": "顯示可以合併嘅編輯",
        "mergehistory-submit": "合併修訂",
        "mergehistory-empty": "無修訂可以合併",
-       "mergehistory-success": "[[:$1]]嘅$3次修訂已經成功噉合併到[[:$2]]。",
+       "mergehistory-done": "$1嘅$3次修訂已經成功噉合併到[[:$2]]。",
        "mergehistory-fail": "歷史合併唔到,請重新檢查嗰一版同埋時間參數。",
        "mergehistory-fail-toobig": "唔能夠合併編輯紀錄,因為入面超過咗$1個版本嘅上限。",
        "mergehistory-no-source": "來源頁$1唔存在。",
        "search-category": "(類 $1)",
        "search-file-match": "(夾啱樓案内容)",
        "search-suggest": "你係唔係搵: $1",
+       "search-rewritten": "顯示緊 $1 嘅搵嘢結果,而唔係 $2 嘅。",
        "search-interwiki-caption": "姊妹計劃",
        "search-interwiki-default": "嚟自$1嘅結果:",
        "search-interwiki-more": "(更多)",
        "rows": "行數:",
        "columns": "列數:",
        "searchresultshead": "搵嘢",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">楔位連結</a>格式門檻 (bytes):",
+       "stub-threshold": "楔位連結格式門檻 ($1):",
+       "stub-threshold-sample-link": "樣辦",
        "stub-threshold-disabled": "閂咗",
        "recentchangesdays": "最近更改中嘅顯示日數:",
        "recentchangesdays-max": "最多 $1 日",
        "userrights-notallowed": "你無權限去加減用戶權限。",
        "userrights-changeable-col": "你可以改嘅組",
        "userrights-unchangeable-col": "你唔可以改嘅組",
+       "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。",
        "userrights-removed-self": "移走自身權限成功,但你冇乜可能入到呢頁。",
        "group": "組:",
        "group-user": "用戶",
        "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-unblockself": "解封自己",
        "right-protect": "改保護等級同埋編輯流水保護版",
        "right-editprotected": "用「{{int:protect-level-sysop}}」權限去編輯保護版",
+       "right-editsemiprotected": "改保護等級係「{{int:protect-level-autoconfirmed}}」嘅版面",
+       "right-editcontentmodel": "改版面嘅內容模型",
        "right-editinterface": "編輯用戶界面",
        "right-editusercssjs": "編輯其他用戶嘅CSS同埋JavaScript檔",
        "right-editusercss": "編輯其他用戶嘅CSS檔",
        "upload-http-error": "一個HTTP錯誤發生咗: $1",
        "upload-copy-upload-invalid-domain": "從嗰個域名度冇複製上傳功能",
        "upload-dialog-title": "上載檔案",
-       "upload-dialog-error": "出錯",
-       "upload-dialog-warning": "警告",
        "upload-dialog-button-cancel": "取消",
        "upload-dialog-button-done": "搞掂",
        "upload-dialog-button-save": "儲存",
        "upload-dialog-button-upload": "上載",
-       "upload-dialog-label-select-file": "揀檔案",
-       "upload-dialog-label-infoform-title": "細節",
-       "upload-dialog-label-infoform-name": "名",
-       "upload-dialog-label-infoform-description": "描述",
-       "upload-dialog-label-usage-title": "用法",
-       "upload-dialog-label-usage-filename": "文件名",
+       "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": "文件名",
        "backend-fail-stream": "傳送唔到檔案「$1」。",
        "backend-fail-backup": "檔案 \"$1\" 唔備份得。",
        "backend-fail-notexists": "檔案$1唔存在。",
        "filerevert-legend": "回復檔案",
        "filerevert-intro": "你而家回復緊個檔案'''[[Media:$1|$1]]'''到[$4 響$2 $3嘅版本]。",
        "filerevert-comment": "原因:",
-       "filerevert-defaultcomment": "已經回復到響$1 $2嘅版本",
+       "filerevert-defaultcomment": "已經回復到響$1 $2嘅版本 ($3)",
        "filerevert-submit": "回復",
        "filerevert-success": "'''[[Media:$1|$1]]'''已經回復到[$4 響$2 $3嘅版本]。",
        "filerevert-badversion": "呢個檔案所提供嘅時間截記並無之前嘅本地版本。",
        "booksources-text": "以下嘅連結清單列出其它一啲賣新書同二手書嘅網站,可能可以提供到有關你想搵嘅書嘅更多資料:",
        "booksources-invalid-isbn": "個ISBN無效;請檢查原來源複製落來嘅錯。",
        "specialloguserlabel": "執行人:",
-       "speciallogtitlelabel": "目標(題目或者用戶):",
+       "speciallogtitlelabel": "目標(題目或者用戶 {{ns:user}}:用戶名 ):",
        "log": "日誌",
        "all-logs-page": "全部嘅公共日誌",
        "alllogstext": "響{{SITENAME}}度全部日誌嘅綜合顯示。你可以選擇一個日誌類型、用戶名、或者受影響嘅頁面,嚟縮窄顯示嘅範圍。",
        "emailccsubject": "你畀$1: $2封信嘅副本",
        "emailsent": "電郵已傳送",
        "emailsenttext": "你嘅電郵信息已傳送。",
-       "emailuserfooter": "呢封電郵係由$1寄畀$2經{{SITENAME}}嘅「{{int:emailuser}}」功能發出嘅。",
+       "emailuserfooter": "呢封電郵係由$1{{GENDER:$1|寄}}畀{{GENDER:$2|$2}}經{{SITENAME}}嘅「{{int:emailuser}}」功能發出嘅。",
        "usermessage-summary": "留低系統訊息。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視名單",
        "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喺呢啲情況下,需要嘅話你唯有手動搬同合併個頁。",
-       "movearticle": "搬頁:",
        "moveuserpage-warning": "'''警告:'''你將會搬一個用戶版。請留意嗰版搬咗之後個用戶係''唔會''改名。",
        "movenologintext": "你要係註冊用戶而且要[[Special:UserLogin|登入]]咗先可以搬頁",
        "movenotallowed": "你並無權限去搬版。",
        "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": "睇吓系統信息",
index 285afdf..8b30d44 100644 (file)
        "mergehistory-go": "Saemenvoegbaere bewerkiengen bekieken",
        "mergehistory-submit": "Versies saemenvoehen",
        "mergehistory-empty": "Der zien hin versies die an saemenevoegd kunn'n worn.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] zien succesvol saemenevoegd ni [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 zien succesvol saemenevoegd ni [[:$2]].",
        "mergehistory-fail": "Kan hin heschiedenisse saemenvoehen, controleer opnieuw de pagina- en tiedparameters.",
        "mergehistory-no-source": "Bronpagina $1 besti nie.",
        "mergehistory-no-destination": "Bestemmiengspagina $1 besti nie.",
        "linksearch-line": "$1 ei 'n verwiezienge in $2",
        "listgrouprights-members": "(ledenlieste)",
        "emailuser": "E-mail deêze gebruker",
-       "emailpage": "E-mail gebruker",
        "watchlist": "Volglieste",
        "mywatchlist": "Volglieste",
        "watchlistfor2": "Vò $1 $2",
        "block-log-flags-nocreate": "uutgeslote van anmaeken gebrukersnaemen",
        "block-log-flags-noautoblock": "gin autoblokkaode",
        "move-page-legend": "Verschuuf bladzie",
-       "movearticle": "Verschuuf bladzie",
        "move-watch": "Volg deêze bladzie",
        "movepagebtn": "Verschuuf bladzie",
        "articleexists": "D'r bestaet al 'n bladzie mee dieën naem, of de naem\ndie-a je gekozen is is ongeldeg.\nKiest 'n aore naem.",
index c48a976..0868cae 100644 (file)
        "nstab-template": "模板",
        "nstab-help": "帮助页面",
        "nstab-category": "分类",
+       "mainpage-nstab": "首页",
        "nosuchaction": "无此操作",
        "nosuchactiontext": "URL指定的操作无效。您可能输入了错误的URL地址,或是点击了错误的链接。这也可能表明{{SITENAME}}使用的软件存在漏洞。",
        "nosuchspecialpage": "此特殊页面不存在",
        "viewsource": "查看源代码",
        "viewsource-title": "查看“$1”的源代码",
        "actionthrottled": "操作被限制",
-       "actionthrottledtext": "作为反破坏措施,您被限制在短时间段内执行太多次该操作,并且您已超越此限制。请在数分钟后再试。",
+       "actionthrottledtext": "作为反滥用措施,您被限制在短时间段内执行太多次该操作,并且您已超越此限制。请在数分钟后再试。",
        "protectedpagetext": "该页面已被保护以防止编辑和其他操作。",
        "viewsourcetext": "您可以查看与复制此页面的源代码。",
        "viewyourtext": "您可以查看与复制<strong>您对此页面作出编辑后</strong>的源代码。",
        "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|页面}}",
        "nocookiesfornew": "该用户账户未被创建,我们不能确认它的来源。请确保你已启用Cookie,刷新本页后再试。",
        "noname": "你没有指定有效的用户名。",
        "loginsuccesstitle": "登录成功",
-       "loginsuccess": "'''“$1”,欢迎登录{{SITENAME}}。'''",
+       "loginsuccess": "<strong>您现在已经以\"$1\"的身份登录了{{SITENAME}}。</strong>",
        "nosuchuser": "没有名为“$1”的用户。用户名区分大小写。请检查你的拼写或[[Special:UserLogin/signup|创建新账户]]。",
        "nosuchusershort": "没有名为“$1”的用户。请检查你的拼写。",
        "nouserspecified": "你必须指定用户名。",
        "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": "å¯\86ç \81é\87\8dç½®é\82®ä»¶å·²å\8f\91é\80\81。",
+       "passwordreset-emailsent": "å¦\82æ\9e\9cæ\82¨ç\9a\84è´¦æ\88·æ\9c\89ä¸\80个已注å\86\8cç\9a\84ç\94µå­\90é\82®ä»¶å\9c°å\9d\80ç\9a\84è¯\9dï¼\8cå°\86å\8f\91é\80\81ä¸\80å°\81å¯\86ç \81é\87\8dç½®é\82®ä»¶。",
        "passwordreset-emailsent-capture": "密码重设电子邮件已发送,并在下面显示。",
        "passwordreset-emailerror-capture": "重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1",
-       "changeemail": "更改电子邮件地址",
-       "changeemail-text": "完成该表格以更改你的电子邮件地址。你需要输入你的密码以确认该更改。",
+       "changeemail": "更改或移除电子邮件地址",
+       "changeemail-text": "完成此表格以更改您的电子邮件地址。您需要输入您的密码以确认此更改。如果您希望从您的账户中移除任何关联的电子邮件地址,请在提交表格时将新电子邮件地址留空。",
        "changeemail-no-info": "\n您必须登录以直接访问本页。",
        "changeemail-oldemail": "当前电子邮件地址:",
        "changeemail-newemail": "新的电子邮件地址:",
+       "changeemail-newemail-help": "此字段应留空,如果您希望移除您的电子邮件地址的话。如果电子邮件地址被移除,您将无法重置忘记的密码,并将不会接收来自此wiki的电子邮件。",
        "changeemail-none": "(无)",
        "changeemail-password": "你的{{SITENAME}}密码:",
        "changeemail-submit": "更改电子邮件地址",
        "permissionserrorstext-withaction": "因为以下{{PLURAL:$1|原因}},你没有权限$2:",
        "recreate-moveddeleted-warn": "'''警告:你正在重新创建曾经被删除的页面。'''\n\n你应该考虑继续编辑本页是否合适。这里提供本页的删除和移动日志以供参考:",
        "moveddeleted-notice": "本页面已被删除。下面提供本页的删除和移动日志以供参考。",
+       "moveddeleted-notice-recent": "抱歉,此页面刚刚被删除(在最近24小时内)。\n页面的删除和移动日志在下方提供以供参考。",
        "log-fulllog": "查看完整日志",
        "edit-hook-aborted": "编辑被hook指令取消。\n无解释。",
        "edit-gone-missing": "不能更新页面。\n它可能刚刚被删除。",
        "undo-summary": "撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1",
        "undo-summary-username-hidden": "取消由一匿名用户所作的版本$1",
        "cantcreateaccounttitle": "无法创建账户",
-       "cantcreateaccount-text": "从该IP地址('''$1''')创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是''$2''",
-       "cantcreateaccount-range-text": "从该IP地址段'''$1'''的账户创建已被[[User:$3|$3]]禁止,而这也包括了您的IP地址('''$4''')。\n$3给出的原因是“$2”。",
+       "cantcreateaccount-text": "从该IP地址(<strong>$1</strong>)创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是<em>$2</em>",
+       "cantcreateaccount-range-text": "从该IP地址段'''$1'''的账户创建已被[[User:$3|$3]]禁止,而这也包括了您的IP地址('''$4''')。\n\n$3给出的原因是 $2。",
        "viewpagelogs": "查看该页面的日志",
        "nohistory": "本页面没有编辑历史记录。",
        "currentrev": "最后版本",
        "rev-suppressed-text-view": "该页面版本已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
        "rev-deleted-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-suppressed-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。",
-       "rev-deleted-unhide-diff": "该差异对比其中的一个版本已经被'''删除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看这版本]。",
-       "rev-suppressed-unhide-diff": "该页面的其中一次版本已经被'''监督隐藏'''。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这版本]。",
-       "rev-deleted-diff-view": "差异对比中的一次版本已被'''删除'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
-       "rev-suppressed-diff-view": "差异对比中的一个版本已被'''监督隐藏'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
+       "rev-deleted-unhide-diff": "该差异对比的其中的一个版本已经被<strong>删除</strong>。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看此版本]。",
+       "rev-suppressed-unhide-diff": "该页面的其中一次版本已经被<strong>监督隐藏</strong>。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这版本]。",
+       "rev-deleted-diff-view": "差异对比中的一次版本已被<strong>删除</strong>。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+       "rev-suppressed-diff-view": "差异对比中的一个版本已被<strong>监督隐藏</strong>。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
        "rev-delundel": "显示/隐藏",
        "rev-showdeleted": "显示",
        "revisiondelete": "删除/还原版本",
        "mergehistory-go": "显示可以合并的编辑",
        "mergehistory-submit": "合并版本",
        "mergehistory-empty": "没有可以合并的版本。",
-       "mergehistory-success": "[[:$1]]的$3个版本成功合并至[[:$2]]。",
+       "mergehistory-done": "$1的$3个{{PLURAL:$3|版本}}{{PLURAL:$3|已}}成功合并至[[:$2]]。",
        "mergehistory-fail": "不可以进行历史合并,请重新检查该页面以及时间参数。",
        "mergehistory-fail-toobig": "由于超出$1的限制而无法执行历史合并,$1个版本将被移动。",
        "mergehistory-no-source": "来源页面$1不存在。",
        "prefs-watchlist-token": "监视列表密钥:",
        "prefs-misc": "其他",
        "prefs-resetpass": "更改密码",
-       "prefs-changeemail": "更改电子邮件地址",
+       "prefs-changeemail": "更改或移除电子邮件地址",
        "prefs-setemail": "设置电子邮件地址",
        "prefs-email": "电子邮件",
        "prefs-rendering": "显示",
        "group-bot": "机器人",
        "group-sysop": "管理员",
        "group-bureaucrat": "行政员",
-       "group-suppress": "ç\9b\91ç\9d£å\91\98",
+       "group-suppress": "ç¦\81æ­¢æ\89§è¡\8cè\80\85",
        "group-all": "(所有)",
        "group-user-member": "{{GENDER:$1|用户}}",
        "group-autoconfirmed-member": "自动确认用户",
        "group-bot-member": "机器人",
        "group-sysop-member": "{{GENDER:$1|管理员}}",
        "group-bureaucrat-member": "行政员",
-       "group-suppress-member": "{{GENDER:$1|ç\9b\91ç\9d£å\91\98}}",
+       "group-suppress-member": "{{GENDER:$1|ç¦\81æ­¢æ\89§è¡\8cè\80\85}}",
        "grouppage-user": "{{ns:project}}:用户",
        "grouppage-autoconfirmed": "{{ns:project}}:自动确认用户",
        "grouppage-bot": "{{ns:project}}:机器人",
        "grouppage-sysop": "{{ns:project}}:管理员",
        "grouppage-bureaucrat": "{{ns:project}}:行政员",
-       "grouppage-suppress": "{{ns:project}}:ç\9b\91ç\9d£",
+       "grouppage-suppress": "{{ns:project}}:ç¦\81æ­¢",
        "right-read": "阅读页面",
        "right-edit": "编辑页面",
        "right-createpage": "创建非讨论页面",
        "recentchangeslinked-summary": "这是链接自指定页面(或至指定分类的成员)的页面的最近更改的列表。[[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": "MediaWiki自动化更改",
        "upload": "上传文件",
        "uploadbtn": "上传文件",
        "reuploaddesc": "取消上传,返回上传表格",
        "upload-options": "上传选项",
        "watchthisupload": "监视这个文件",
        "filewasdeleted": "之前已经有一个同名文件被上传后又被删除了。在上传此文件之前您需要检查$1。",
+       "filename-thumb-name": "这看起来像是缩略图标题。请不要将缩略图上传回同一wiki。否则,请修改文件名使其更有意义,并且没有缩略图前缀。",
        "filename-bad-prefix": "您上传的文件名称是以<strong>“$1”</strong>作为开头,通常这种没有含意的文件名称是由数码相机中自动编排。请在您的文件中重新选择一个更加有意义的文件名称。",
        "filename-prefix-blacklist": " #<!-- 请将本行保留为原样 --> <pre>\n# 语法如下:\n#  * 任何以“#”开头到结尾的行为注释\n#  * 任何非空行是根据相机自动分配特定文件名的前缀\nCIMG # 卡西欧\nDSC_ # 尼康\nDSCF # 富士\nDSCN # 尼康\nDUW # 部分手机\nIMG # 一般\nJD # 业纳\nMGP # 宾得\nPICT # 其他\n #</pre> <!-- 请将本行保留为原样 -->",
        "upload-success-subj": "上传成功",
        "upload-http-error": "发生HTTP错误:$1",
        "upload-copy-upload-invalid-domain": "不能从该域名上载文件副本。",
        "upload-dialog-title": "上传文件",
-       "upload-dialog-error": "发生错误",
-       "upload-dialog-warning": "发生一条警告",
        "upload-dialog-button-cancel": "取消",
        "upload-dialog-button-done": "完成",
        "upload-dialog-button-save": "保存",
        "upload-dialog-button-upload": "上传",
-       "upload-dialog-label-select-file": "选择文件",
-       "upload-dialog-label-infoform-title": "详细信息",
-       "upload-dialog-label-infoform-name": "名称",
-       "upload-dialog-label-infoform-description": "说明",
-       "upload-dialog-label-usage-title": "用法",
-       "upload-dialog-label-usage-filename": "文件名",
+       "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": "日期",
+       "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-wikimediacommons": "我证明我拥有此文件的版权,并不可撤销地同意采用[https://creativecommons.org/licenses/by-sa/4.0/ 知识共享 署名-相同方式共享 4.0]许可协议将此文件发布至维基共享资源,并且我同意[https://wikimediafoundation.org/wiki/Terms_of_Use 使用条款]。",
+       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "如果您并不拥有此文件的版权,或者您希望将其以其他许可协议发布,请考虑使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 共享资源的上传向导]。",
+       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "如果网站允许依据他们的方针上传此文件的话,您也可以尝试使用[[Special:Upload|{{SITENAME}}上的上传页面]]。",
        "backend-fail-stream": "无法流传送文件$1。",
        "backend-fail-backup": "无法备份文件$1。",
        "backend-fail-notexists": "条目$1不存在。",
        "shared-repo-from": "来自$1",
        "shared-repo": "一个共享文件库",
        "shared-repo-name-wikimediacommons": "维基共享资源",
-       "filepage.css": "/* 放置于此的CSS会包含在文件描述页上,并包含在其他客户端wiki上 */",
+       "filepage.css": "/* 这里放置的CSS会包含在文件描述页上,并包含在其他客户端wiki上 */",
        "upload-disallowed-here": "您不可以覆盖此文件。",
        "filerevert": "恢复$1",
        "filerevert-legend": "恢复文件",
        "filerevert-intro": "你将要恢复文件'''[[Media:$1|$1]]'''至[$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\91ç\9d£",
+       "suppress": "ç¦\81æ­¢",
        "querypage-disabled": "本特殊页面因性能问题而停用。",
        "apihelp": "API 帮助",
        "apihelp-no-such-module": "找不到模块“$1”。",
        "emailccsubject": "您发送给$1的消息的副本:$2",
        "emailsent": "电子邮件已发送",
        "emailsenttext": "您的电子邮件已经发出。",
-       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“{{int:emailuser}}”功能被$1发送至$2的。",
+       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“{{int:emailuser}}”功能被$1{{GENDER:$1|发送}}至{{GENDER:$2|$2}}的。",
        "usermessage-summary": "留下系统消息。",
        "usermessage-editor": "系统信息编辑器",
        "watchlist": "监视列表",
        "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": "删除",
        "move-page-legend": "移动页面",
        "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将重定向更新到原条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也<strong>不会</strong>被移动,除非新页面无任何编辑历史或是重定向页。这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n<strong>警告!</strong>对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
        "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。\n老的页面将成为新页面的重定向页。\n请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将'''不会'''被移动,\n除非新页面无内容或是重定向页,而且没有版本历史。\n这意味着您再必要时可以在移动到新页面后再移回老的页面,\n同时您也无法覆盖现有页面。\n\n'''警告!'''\n对一个经常被访问的页面而言这可能是一个重大与唐突的更改;\n请在行动前先确定您了解其所可能带来的后果。",
-       "movepagetalktext": "有关的讨论页将被自动与该页面一起移动,'''除非''':\n*新页面已经有一个包含内容的讨论页,或者\n*您不勾选下面的复选框。\n\n在这些情况下,您在必要时必须手工移动或合并页面。",
-       "movearticle": "移动页面:",
+       "movepagetalktext": "如果您勾选此框,相关联的讨论页将被自动移动到新的标题,除非这里已经有了一个非空讨论页。\n\n在这种情况下,如有需要,您将不得不手动移动或合并页面。",
        "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
        "movecategorypage-warning": "<strong>警告:</strong>您将移动分类页面。请注意只有此页面将会移动,旧有分类的任何页面将<em>不会</em>同步移动。",
        "movenologintext": "您必须是一名登记用户并且[[Special:UserLogin|登录]]\n后才可移动一个页面。",
        "tooltip-summary": "请输入简短的摘要",
        "interlanguage-link-title": "$1 – $2",
        "interlanguage-link-title-nonlang": "$1——$2",
-       "common.css": "/* 放置于这里的CSS将应用于所有皮肤 */",
-       "print.css": "/* 放置于这里的CSS将影响打印输出 */",
-       "noscript.css": "/* 放置于这里的CSS将影响停用JavaScript的用户 */",
+       "common.css": "/* 这里放置的CSS将应用于所有皮肤 */",
+       "print.css": "/* 这里放置的CSS将影响打印输出 */",
+       "noscript.css": "/* 这里放置的CSS将影响停用JavaScript的用户 */",
        "group-autoconfirmed.css": "/* 这里放置的CSS将只影响自动确认用户 */",
        "group-user.css": "/* 这里放置的CSS将只影响注册用户 */",
        "group-bot.css": "/* 这里放置的CSS将只影响机器人 */",
        "logentry-newusers-byemail": "$1创建用户$3,并且密码已通过电子邮件发送",
        "logentry-newusers-autocreate": "用户账户$1被自动{{GENDER:$2|创建}}",
        "logentry-protect-move_prot": "$1将保护设置从$4{{GENDER:$2|移动}}到了$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更改$3的用户组",
        "logentry-rights-autopromote": "$1被自动地{{GENDER:$2|提升}}自$4至$5",
        "api-error-badaccess-groups": "您没有将文件上传到此 wiki 的权限。",
        "api-error-badtoken": "内部错误:会话无效。",
        "api-error-copyuploaddisabled": "通过URL上传的功能已被此服务器禁用。",
-       "api-error-duplicate": "在网站上已经具有相同内容的{{PLURAL:$1|[$2 另一个文件]|[$2 另一些文件]}}。",
-       "api-error-duplicate-archive": "在网站上曾经具有相同内容的{{PLURAL:$1|[$2 另一个文件]|[$2 另一些文件]}},但已被删除。",
-       "api-error-duplicate-archive-popup-title": "已被删的除重复{{PLURAL:$1|文件}}。",
-       "api-error-duplicate-popup-title": "重复的 {{PLURAL:$1|文件}}。",
+       "api-error-duplicate": "在网站上已经具有相同内容的{{PLURAL:$1|另一个文件|另一些文件}}。",
+       "api-error-duplicate-archive": "在网站上曾经具有相同内容的{{PLURAL:$1|另一个文件|另一些文件}},但已被删除。",
        "api-error-empty-file": "您提交的文件是空的。",
        "api-error-emptypage": "不能创建没有内容的新页面。",
        "api-error-fetchfileerror": "内部错误:获取文件时发生错误。",
index 738b896..3a2138e 100644 (file)
                        "EagerLin",
                        "Cbliu",
                        "Citizen01",
-                       "Zhxy 519"
+                       "Zhxy 519",
+                       "Macofe",
+                       "578985s",
+                       "Matma Rex",
+                       "范"
                ]
        },
        "tog-underline": "底線標示連結:",
        "nstab-template": "模板",
        "nstab-help": "說明頁面",
        "nstab-category": "分類",
+       "mainpage-nstab": "首頁",
        "nosuchaction": "無此動作",
        "nosuchactiontext": "URL 所指定的動作無效。\n您的 URL 可能輸入錯誤,或點選了錯誤的連結。\n這也可能是 {{SITENAME}} 使用的系統出現問題。",
        "nosuchspecialpage": "無此特殊頁面",
        "nocookiesfornew": "這個使用者的帳號未建立,我們不能確認它的來源。\n請確認您已開啟 Cookie,重新載入後再試。",
        "noname": "您輸入的使用者名稱無效。",
        "loginsuccesstitle": "登入成功",
-       "loginsuccess": "<strong>{{GENDER:|你|妳|你}}正使用 \"$1\" 的身份登入 {{SITENAME}}。</strong>",
+       "loginsuccess": "<strong>{{GENDER:|您|妳|你}}現在已經以 \"$1\" 的身分登入了 {{SITENAME}}。</strong>",
        "nosuchuser": "查無使用者 \"$1\"。\n使用者名稱有大小寫區分,\n請檢查您拼寫是否正確,或者 [[Special:UserLogin/signup|建立新帳號]]。",
        "nosuchusershort": "查無使用者 \"$1\",\n請檢查您拼寫是否正確。",
        "nouserspecified": "您必須指定一個使用者名稱。",
        "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 所作出的修訂 $1",
        "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccounttitle": "無法建立帳號",
-       "cantcreateaccount-text": "來自這個 IP 位址 (<strong>$1</strong>) 建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 <em>$2</em>",
-       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位址 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 ''$2''",
+       "cantcreateaccount-text": "自這個 IP 位址(<strong>$1</strong>)建立帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 <em>$2</em>",
+       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位址 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 ''$2''",
        "viewpagelogs": "檢視此頁面的日誌",
        "nohistory": "此頁沒有任何的修訂記錄。",
        "currentrev": "最新修訂",
        "mergehistory-go": "顯示可以合併的編輯",
        "mergehistory-submit": "合併修訂",
        "mergehistory-empty": "沒有可以合併的修訂",
-       "mergehistory-success": "[[:$1]] 中 $3 次修訂已經成功地合併至 [[:$2]]。",
+       "mergehistory-done": "$1 中 $3 次修訂已經成功地合併至 [[:$2]]。",
        "mergehistory-fail": "無法進行歷史合併,請重新檢查該頁面及時間參數。",
        "mergehistory-fail-toobig": "超過 $1 個修訂移動的上限,無法進行歷史合併。",
        "mergehistory-no-source": "來源頁面 $1 不存在。",
        "rcshowhideliu": "$1 已註冊的使用者",
        "rcshowhideliu-show": "顯示",
        "rcshowhideliu-hide": "隱藏",
-       "rcshowhideanons": "$1 匿名使用者",
+       "rcshowhideanons": "$1 匿名使用者",
        "rcshowhideanons-show": "顯示",
        "rcshowhideanons-hide": "隱藏",
        "rcshowhidepatr": "$1 巡查過的編輯",
        "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|1 頁|$2 頁}}已加入至分類",
+       "recentchanges-page-removed-from-category": "[[:$1]] 已自分類移除",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] 與其他 {{PLURAL:$2|1 頁|$2 頁}}已自分類移除",
        "upload": "上傳檔案",
        "uploadbtn": "上傳檔案",
        "reuploaddesc": "取消上傳並返回上傳表單",
        "upload-http-error": "發生 HTTP 錯誤:$1",
        "upload-copy-upload-invalid-domain": "此網域不允許複製上傳的檔案。",
        "upload-dialog-title": "上傳檔案",
-       "upload-dialog-error": "發生錯誤",
-       "upload-dialog-warning": "發生警告",
        "upload-dialog-button-cancel": "取消",
        "upload-dialog-button-done": "完成",
        "upload-dialog-button-save": "儲存",
        "upload-dialog-button-upload": "上傳",
-       "upload-dialog-label-select-file": "選擇檔案",
-       "upload-dialog-label-infoform-title": "詳細資訊",
-       "upload-dialog-label-infoform-name": "名稱",
-       "upload-dialog-label-infoform-description": "描述",
-       "upload-dialog-label-usage-title": "用法",
-       "upload-dialog-label-usage-filename": "檔案名稱",
+       "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-infoform-categories": "分類",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "backend-fail-backup": "無法備份檔案 \"$1\"。",
        "backend-fail-notexists": "檔案 $1 不存在。",
        "ipb-blocklist": "檢視目前的封鎖",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} 的貢獻",
        "unblockip": "解除封鎖使用者",
-       "unblockiptext": "填寫以下單據以取消先前封鎖的 IP 位址或使用者名稱。",
-       "ipusubmit": "移除這個封鎖",
+       "unblockiptext": "使用以下表單以還原之前被封鎖的 IP 位址或使用者名稱的寫入存取。",
+       "ipusubmit": "移除封鎖",
        "unblocked": "[[User:$1|$1]] 的封鎖已經解除。",
        "unblocked-range": "已解除封鎖 $1。",
        "unblocked-id": "已經移除 $1 的封鎖。",
        "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在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
-       "movearticle": "移動頁面:",
        "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
        "movecategorypage-warning": "<strong>警告:</strong>您正要移動分類頁面。請注意此操作只會移動頁面,在舊分類中的頁面將<em>不會</em>移動到新的分類。",
        "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
        "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的從跨 Wiki 匯入操作都會被記錄在 [[Special:Log/import|匯入日誌]]。",
        "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
-       "import-interwiki-history": "複製此頁的所有歷史修訂",
+       "import-interwiki-history": "複製此頁的所有歷史修訂",
        "import-interwiki-templates": "包含所有模板",
        "import-interwiki-submit": "匯入",
        "import-mapping-default": "匯入至預設位置",
        "javascripttest-pagetext-skins": "選擇執行測試的外觀:",
        "javascripttest-qunit-intro": "請參考 mediawiki.org 的 [$1 測試說明文件]。",
        "tooltip-pt-userpage": "您的使用者頁面",
-       "tooltip-pt-anonuserpage": "您正使用以下身份編輯該 IP 位址的使用者頁面 :",
+       "tooltip-pt-anonuserpage": "您正在作為以下身分編輯此 IP 位址的使用者頁面",
        "tooltip-pt-mytalk": "您的對話頁面",
        "tooltip-pt-anontalk": "有關來自此 IP 位址編輯的討論",
        "tooltip-pt-preferences": "您的偏好設定",
        "tooltip-n-help": "尋求協助的地方",
        "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面",
        "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的近期變更",
-       "tooltip-feed-rss": "訂閱此頁面的 RSS feed",
-       "tooltip-feed-atom": "訂閱此頁面的 Atom feed",
+       "tooltip-feed-rss": "此頁面的 RSS 摘要",
+       "tooltip-feed-atom": "此頁面的 Atom 摘要",
        "tooltip-t-contributions": "此使用者的貢獻清單",
        "tooltip-t-emailuser": "傳送電子郵件聯絡這位使用者",
        "tooltip-t-info": "更多關於此頁面的資訊",
        "tooltip-save": "儲存您的變更",
        "tooltip-preview": "請在儲存前預覽您的變更!",
        "tooltip-diff": "顯示您對內容所做的變更",
-       "tooltip-compareselectedversions": "檢è¦\96æ­¤é \81兩個已選擇的修訂間的差異",
+       "tooltip-compareselectedversions": "æ\9f¥é\96±æ­¤é \81é\9d¢兩個已選擇的修訂間的差異",
        "tooltip-watch": "加入此頁面至您的監視清單",
        "tooltip-watchlistedit-normal-submit": "移除標題",
        "tooltip-watchlistedit-raw-submit": "更新監視清單",
        "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "api-error-badtoken": "內部錯誤:密鑰錯誤。",
        "api-error-copyuploaddisabled": "此伺服器已停用使用 URL 上傳檔案的功能。",
-       "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|[$2 其他檔案]|[$2 其他檔案]}}。",
-       "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$1|[$2 其他檔案]|[$2 其他檔案]}},但已被刪除。",
-       "api-error-duplicate-archive-popup-title": "重複的{{PLURAL:$1|檔案}}已經被刪除。",
-       "api-error-duplicate-popup-title": "重複的{{PLURAL:$1|檔案}}。",
+       "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|其他檔案|其他檔案}}。",
+       "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$1|其他檔案|其他檔案}},但已被刪除。",
        "api-error-empty-file": "您送出的檔案是空的。",
        "api-error-emptypage": "不允許建立空白的頁面。",
        "api-error-fetchfileerror": "內部錯誤:取得檔案時發生錯誤。",
index 4f84bfb..ccf040a 100644 (file)
@@ -33,8 +33,11 @@ $namespaceAliases = array(
        'Espezial' => NS_SPECIAL,
 );
 
-// Remove Spanish gender aliases (bug 37090)
-$namespaceGenderAliases = array();
+// T113890: Setting $namespaceGenderAliases for Aragonese (an)
+$namespaceGenderAliases = array(
+       NS_USER => array( 'male' => 'Usuario', 'female' => 'Usuaria' ),
+       NS_USER_TALK => array( 'male' => 'Descusión_usuario', 'female' => 'Descusión_usuaria' ),
+);
 
 $magicWords = array(
        'redirect'                  => array( '0', '#ENDRECERA', '#REENDRECERA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
index 7f48c9a..506aa3e 100644 (file)
@@ -8,6 +8,8 @@
  *
  */
 
+$fallback = 'es';
+
 $namespaceNames = array(
        NS_MEDIA            => 'Medios',
        NS_SPECIAL          => 'Especial',
@@ -46,6 +48,11 @@ $namespaceAliases = array(
        'Categoría_discusión' => NS_CATEGORY_TALK,
 );
 
+$namespaceGenderAliases = array(
+       NS_USER => array( 'male' => 'Usuariu', 'female' => 'Usuaria' ),
+       NS_USER_TALK => array( 'male' => 'Usuariu_alderique', 'female' => 'Usuaria_alderique' ),
+);
+
 $specialPageAliases = array(
        'Block'                     => array( 'Bloquiar', 'BloquiarIP', 'BloquiarUsuariu' ),
        'Log'                       => array( 'Rexistru', 'Rexistros' ),
index 9169f97..acd6ce0 100644 (file)
@@ -32,6 +32,11 @@ $namespaceAliases = array(
        'Imatge_Discussió' => NS_FILE_TALK,
 );
 
+$namespaceGenderAliases = array(
+       NS_USER => array( 'male' => 'Usuari', 'female' => 'Usuària' ),
+       NS_USER_TALK => array( 'male' => 'Usuari_Discussió', 'female' => 'Usuària_Discussió' ),
+); // T113616
+
 $specialPageAliases = array(
        'Activeusers'               => array( 'Usuaris_actius' ),
        'Allmessages'               => array( 'Missatges', 'MediaWiki' ),
index f90746c..4dedc47 100644 (file)
@@ -8,4 +8,4 @@
  *
  */
 
-$fallback = 'ne';
\ No newline at end of file
+$fallback = 'ne';
index dfd97f5..4e6c067 100644 (file)
@@ -29,13 +29,13 @@ $namespaceNames = array(
 
 $namespaceAliases = array(
        'Imagen' => NS_FILE,
-       'Imagen_Discusión' => NS_FILE_TALK,
+       'Imagen_discusión' => NS_FILE_TALK,
 );
 
 $namespaceGenderAliases = array(
        NS_USER => array( 'male' => 'Usuario', 'female' => 'Usuaria' ),
-       NS_USER_TALK => array( 'male' => 'Usuario_Discusión', 'female' => 'Usuaria_Discusión' ),
-);
+       NS_USER_TALK => array( 'male' => 'Usuario_discusión', 'female' => 'Usuaria_discusión' ),
+); // T113499
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'UsuariosActivos' ),
index 1af959b..1ad53dd 100644 (file)
@@ -8,7 +8,28 @@
  *
  */
 
+$fallback = 'es';
+
 $namespaceNames = array(
+       NS_MEDIA            => 'Mediu',
+       NS_SPECIAL          => 'Especial',
+       NS_TALK             => 'Caraba',
+       NS_USER             => 'Usuario',
+       NS_USER_TALK        => 'Usuario_caraba',
+       NS_PROJECT_TALK     => '$1_caraba',
+       NS_FILE             => 'Archivu',
+       NS_FILE_TALK        => 'Archivu_caraba',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_caraba',
        NS_TEMPLATE         => 'Prantilla',
+       NS_TEMPLATE_TALK    => 'Prantilla_caraba',
+       NS_HELP             => 'Ayua',
+       NS_HELP_TALK        => 'Ayua_caraba',
+       NS_CATEGORY         => 'Categoria',
+       NS_CATEGORY_TALK    => 'Categoria_caraba',
 );
 
+$namespaceGenderAliases = array(
+       NS_USER => array( 'male' => 'Usuario', 'female' => 'Usuaria' ),
+       NS_USER_TALK => array( 'male' => 'Usuario_caraba', 'female' => 'Usuaria_caraba' ),
+);
diff --git a/languages/messages/MessagesOlo.php b/languages/messages/MessagesOlo.php
new file mode 100644 (file)
index 0000000..ba3d364
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+/** Livvi-Karelian (Livvinкarjala)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'ru';
+
+$linkTrail = '/^([a-zčČšŠžŽäÄöÖ]+)(.*)$/sDu';
+
diff --git a/languages/utils/CLDRPluralRuleConverter.php b/languages/utils/CLDRPluralRuleConverter.php
deleted file mode 100644 (file)
index 2eabcab..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper class for converting rules to reverse polish notation (RPN).
- */
-class CLDRPluralRuleConverter {
-       /**
-        * The input string
-        *
-        * @var string
-        */
-       public $rule;
-
-       /**
-        * The current position
-        *
-        * @var int
-        */
-       public $pos;
-
-       /**
-        * The past-the-end position
-        *
-        * @var int
-        */
-       public $end;
-
-       /**
-        * The operator stack
-        *
-        * @var array
-        */
-       public $operators = array();
-
-       /**
-        * The operand stack
-        *
-        * @var array
-        */
-       public $operands = array();
-
-       /**
-        * Precedence levels. Note that there's no need to worry about associativity
-        * for the level 4 operators, since they return boolean and don't accept
-        * boolean inputs.
-        */
-       private static $precedence = array(
-               'or' => 2,
-               'and' => 3,
-               'is' => 4,
-               'is-not' => 4,
-               'in' => 4,
-               'not-in' => 4,
-               'within' => 4,
-               'not-within' => 4,
-               'mod' => 5,
-               ',' => 6,
-               '..' => 7,
-       );
-
-       /**
-        * A character list defining whitespace, for use in strspn() etc.
-        */
-       const WHITESPACE_CLASS = " \t\r\n";
-
-       /**
-        * Same for digits. Note that the grammar given in UTS #35 doesn't allow
-        * negative numbers or decimal separators.
-        */
-       const NUMBER_CLASS = '0123456789';
-
-       /**
-        * A character list of symbolic operands.
-        */
-       const OPERAND_SYMBOLS = 'nivwft';
-
-       /**
-        * An anchored regular expression which matches a word at the current offset.
-        */
-       const WORD_REGEX = '/[a-zA-Z@]+/A';
-
-       /**
-        * Convert a rule to RPN. This is the only public entry point.
-        *
-        * @param string $rule The rule to convert
-        * @return string The RPN representation of the rule
-        */
-       public static function convert( $rule ) {
-               $parser = new self( $rule );
-
-               return $parser->doConvert();
-       }
-
-       /**
-        * Private constructor.
-        * @param string $rule
-        */
-       protected function __construct( $rule ) {
-               $this->rule = $rule;
-               $this->pos = 0;
-               $this->end = strlen( $rule );
-       }
-
-       /**
-        * Do the operation.
-        *
-        * @return string The RPN representation of the rule (e.g. "5 3 mod n is")
-        */
-       protected function doConvert() {
-               $expectOperator = true;
-
-               // Iterate through all tokens, saving the operators and operands to a
-               // stack per Dijkstra's shunting yard algorithm.
-               /** @var CLDRPluralRuleConverterOperator $token */
-               while ( false !== ( $token = $this->nextToken() ) ) {
-                       // In this grammar, there are only binary operators, so every valid
-                       // rule string will alternate between operator and operand tokens.
-                       $expectOperator = !$expectOperator;
-
-                       if ( $token instanceof CLDRPluralRuleConverterExpression ) {
-                               // Operand
-                               if ( $expectOperator ) {
-                                       $token->error( 'unexpected operand' );
-                               }
-                               $this->operands[] = $token;
-                               continue;
-                       } else {
-                               // Operator
-                               if ( !$expectOperator ) {
-                                       $token->error( 'unexpected operator' );
-                               }
-                               // Resolve higher precedence levels
-                               $lastOp = end( $this->operators );
-                               while ( $lastOp && self::$precedence[$token->name] <= self::$precedence[$lastOp->name] ) {
-                                       $this->doOperation( $lastOp, $this->operands );
-                                       array_pop( $this->operators );
-                                       $lastOp = end( $this->operators );
-                               }
-                               $this->operators[] = $token;
-                       }
-               }
-
-               // Finish off the stack
-               while ( $op = array_pop( $this->operators ) ) {
-                       $this->doOperation( $op, $this->operands );
-               }
-
-               // Make sure the result is sane. The first case is possible for an empty
-               // string input, the second should be unreachable.
-               if ( !count( $this->operands ) ) {
-                       $this->error( 'condition expected' );
-               } elseif ( count( $this->operands ) > 1 ) {
-                       $this->error( 'missing operator or too many operands' );
-               }
-
-               $value = $this->operands[0];
-               if ( $value->type !== 'boolean' ) {
-                       $this->error( 'the result must have a boolean type' );
-               }
-
-               return $this->operands[0]->rpn;
-       }
-
-       /**
-        * Fetch the next token from the input string.
-        *
-        * @return CLDRPluralRuleConverterFragment The next token
-        */
-       protected function nextToken() {
-               if ( $this->pos >= $this->end ) {
-                       return false;
-               }
-
-               // Whitespace
-               $length = strspn( $this->rule, self::WHITESPACE_CLASS, $this->pos );
-               $this->pos += $length;
-
-               if ( $this->pos >= $this->end ) {
-                       return false;
-               }
-
-               // Number
-               $length = strspn( $this->rule, self::NUMBER_CLASS, $this->pos );
-               if ( $length !== 0 ) {
-                       $token = $this->newNumber( substr( $this->rule, $this->pos, $length ), $this->pos );
-                       $this->pos += $length;
-
-                       return $token;
-               }
-
-               // Two-character operators
-               $op2 = substr( $this->rule, $this->pos, 2 );
-               if ( $op2 === '..' || $op2 === '!=' ) {
-                       $token = $this->newOperator( $op2, $this->pos, 2 );
-                       $this->pos += 2;
-
-                       return $token;
-               }
-
-               // Single-character operators
-               $op1 = $this->rule[$this->pos];
-               if ( $op1 === ',' || $op1 === '=' || $op1 === '%' ) {
-                       $token = $this->newOperator( $op1, $this->pos, 1 );
-                       $this->pos++;
-
-                       return $token;
-               }
-
-               // Word
-               if ( !preg_match( self::WORD_REGEX, $this->rule, $m, 0, $this->pos ) ) {
-                       $this->error( 'unexpected character "' . $this->rule[$this->pos] . '"' );
-               }
-               $word1 = strtolower( $m[0] );
-               $word2 = '';
-               $nextTokenPos = $this->pos + strlen( $word1 );
-               if ( $word1 === 'not' || $word1 === 'is' ) {
-                       // Look ahead one word
-                       $nextTokenPos += strspn( $this->rule, self::WHITESPACE_CLASS, $nextTokenPos );
-                       if ( $nextTokenPos < $this->end
-                               && preg_match( self::WORD_REGEX, $this->rule, $m, 0, $nextTokenPos )
-                       ) {
-                               $word2 = strtolower( $m[0] );
-                               $nextTokenPos += strlen( $word2 );
-                       }
-               }
-
-               // Two-word operators like "is not" take precedence over single-word operators like "is"
-               if ( $word2 !== '' ) {
-                       $bothWords = "{$word1}-{$word2}";
-                       if ( isset( self::$precedence[$bothWords] ) ) {
-                               $token = $this->newOperator( $bothWords, $this->pos, $nextTokenPos - $this->pos );
-                               $this->pos = $nextTokenPos;
-
-                               return $token;
-                       }
-               }
-
-               // Single-word operators
-               if ( isset( self::$precedence[$word1] ) ) {
-                       $token = $this->newOperator( $word1, $this->pos, strlen( $word1 ) );
-                       $this->pos += strlen( $word1 );
-
-                       return $token;
-               }
-
-               // The single-character operand symbols
-               if ( strpos( self::OPERAND_SYMBOLS, $word1 ) !== false ) {
-                       $token = $this->newNumber( $word1, $this->pos );
-                       $this->pos++;
-
-                       return $token;
-               }
-
-               // Samples
-               if ( $word1 === '@integer' || $word1 === '@decimal' ) {
-                       // Samples are like comments, they have no effect on rule evaluation.
-                       // They run from the first sample indicator to the end of the string.
-                       $this->pos = $this->end;
-
-                       return false;
-               }
-
-               $this->error( 'unrecognised word' );
-       }
-
-       /**
-        * For the binary operator $op, pop its operands off the stack and push
-        * a fragment with rpn and type members describing the result of that
-        * operation.
-        *
-        * @param CLDRPluralRuleConverterOperator $op
-        */
-       protected function doOperation( $op ) {
-               if ( count( $this->operands ) < 2 ) {
-                       $op->error( 'missing operand' );
-               }
-               $right = array_pop( $this->operands );
-               $left = array_pop( $this->operands );
-               $result = $op->operate( $left, $right );
-               $this->operands[] = $result;
-       }
-
-       /**
-        * Create a numerical expression object
-        *
-        * @param string $text
-        * @param int $pos
-        * @return CLDRPluralRuleConverterExpression The numerical expression
-        */
-       protected function newNumber( $text, $pos ) {
-               return new CLDRPluralRuleConverterExpression( $this, 'number', $text, $pos, strlen( $text ) );
-       }
-
-       /**
-        * Create a binary operator
-        *
-        * @param string $type
-        * @param int $pos
-        * @param int $length
-        * @return CLDRPluralRuleConverterOperator The operator
-        */
-       protected function newOperator( $type, $pos, $length ) {
-               return new CLDRPluralRuleConverterOperator( $this, $type, $pos, $length );
-       }
-
-       /**
-        * Throw an error
-        * @param string $message
-        */
-       protected function error( $message ) {
-               throw new CLDRPluralRuleError( $message );
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverterExpression.php b/languages/utils/CLDRPluralRuleConverterExpression.php
deleted file mode 100644 (file)
index 1ee6b4c..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An expression object, representing a region of the input string (for error
- * messages), the RPN notation used to evaluate it, and the result type for
- * validation.
- */
-class CLDRPluralRuleConverterExpression extends CLDRPluralRuleConverterFragment {
-       /** @var string */
-       public $type;
-
-       /** @var string */
-       public $rpn;
-
-       function __construct( $parser, $type, $rpn, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               $this->type = $type;
-               $this->rpn = $rpn;
-       }
-
-       public function isType( $type ) {
-               if ( $type === 'range' && ( $this->type === 'range' || $this->type === 'number' ) ) {
-                       return true;
-               }
-               if ( $type === $this->type ) {
-                       return true;
-               }
-
-               return false;
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverterFragment.php b/languages/utils/CLDRPluralRuleConverterFragment.php
deleted file mode 100644 (file)
index df299cb..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * The base class for operators and expressions, describing a region of the input string.
- */
-class CLDRPluralRuleConverterFragment {
-       public $parser, $pos, $length, $end;
-
-       function __construct( $parser, $pos, $length ) {
-               $this->parser = $parser;
-               $this->pos = $pos;
-               $this->length = $length;
-               $this->end = $pos + $length;
-       }
-
-       public function error( $message ) {
-               $text = $this->getText();
-               throw new CLDRPluralRuleError( "$message at position " . ( $this->pos + 1 ) . ": \"$text\"" );
-       }
-
-       public function getText() {
-               return substr( $this->parser->rule, $this->pos, $this->length );
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverterOperator.php b/languages/utils/CLDRPluralRuleConverterOperator.php
deleted file mode 100644 (file)
index de17f29..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An operator object, representing a region of the input string (for error
- * messages), and the binary operator at that location.
- */
-class CLDRPluralRuleConverterOperator extends CLDRPluralRuleConverterFragment {
-       /** @var string The name */
-       public $name;
-
-       /**
-        * Each op type has three characters: left operand type, right operand type and result type
-        *
-        *   b = boolean
-        *   n = number
-        *   r = range
-        *
-        * A number is a kind of range.
-        *
-        * @var array
-        */
-       private static $opTypes = array(
-               'or' => 'bbb',
-               'and' => 'bbb',
-               'is' => 'nnb',
-               'is-not' => 'nnb',
-               'in' => 'nrb',
-               'not-in' => 'nrb',
-               'within' => 'nrb',
-               'not-within' => 'nrb',
-               'mod' => 'nnn',
-               ',' => 'rrr',
-               '..' => 'nnr',
-       );
-
-       /**
-        * Map converting from the abbrevation to the full form.
-        *
-        * @var array
-        */
-       private static $typeSpecMap = array(
-               'b' => 'boolean',
-               'n' => 'number',
-               'r' => 'range',
-       );
-
-       /**
-        * Map for converting the new operators introduced in Rev 33 to the old forms
-        */
-       private static $aliasMap = array(
-               '%' => 'mod',
-               '!=' => 'not-in',
-               '=' => 'in'
-       );
-
-       /**
-        * Initialize a new instance of a CLDRPluralRuleConverterOperator object
-        *
-        * @param CLDRPluralRuleConverter $parser The parser
-        * @param string $name The operator name
-        * @param int $pos The length
-        * @param int $length
-        */
-       function __construct( $parser, $name, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               if ( isset( self::$aliasMap[$name] ) ) {
-                       $name = self::$aliasMap[$name];
-               }
-               $this->name = $name;
-       }
-
-       /**
-        * Compute the operation
-        *
-        * @param CLDRPluralRuleConverterExpression $left The left part of the expression
-        * @param CLDRPluralRuleConverterExpression $right The right part of the expression
-        * @return CLDRPluralRuleConverterExpression The result of the operation
-        */
-       public function operate( $left, $right ) {
-               $typeSpec = self::$opTypes[$this->name];
-
-               $leftType = self::$typeSpecMap[$typeSpec[0]];
-               $rightType = self::$typeSpecMap[$typeSpec[1]];
-               $resultType = self::$typeSpecMap[$typeSpec[2]];
-
-               $start = min( $this->pos, $left->pos, $right->pos );
-               $end = max( $this->end, $left->end, $right->end );
-               $length = $end - $start;
-
-               $newExpr = new CLDRPluralRuleConverterExpression( $this->parser, $resultType,
-                       "{$left->rpn} {$right->rpn} {$this->name}",
-                       $start, $length );
-
-               if ( !$left->isType( $leftType ) ) {
-                       $newExpr->error( "invalid type for left operand: expected $leftType, got {$left->type}" );
-               }
-
-               if ( !$right->isType( $rightType ) ) {
-                       $newExpr->error( "invalid type for right operand: expected $rightType, got {$right->type}" );
-               }
-
-               return $newExpr;
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleError.php b/languages/utils/CLDRPluralRuleError.php
deleted file mode 100644 (file)
index cc0b5d2..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * The exception class for all the classes in this file. This will be thrown
- * back to the caller if there is any validation error.
- */
-class CLDRPluralRuleError extends MWException {
-       function __construct( $message ) {
-               parent::__construct( 'CLDR plural rule error: ' . $message );
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleEvaluator.php b/languages/utils/CLDRPluralRuleEvaluator.php
deleted file mode 100644 (file)
index 7e7208a..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-
-/**
- * Parse and evaluate a plural rule.
- *
- * UTS #35 Revision 33
- * http://www.unicode.org/reports/tr35/tr35-33/tr35-numbers.html#Language_Plural_Rules
- *
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0
- * or later
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- *
- * @file
- * @since 1.20
- */
-class CLDRPluralRuleEvaluator {
-       /**
-        * Evaluate a number against a set of plural rules. If a rule passes,
-        * return the index of plural rule.
-        *
-        * @param int $number The number to be evaluated against the rules
-        * @param array $rules The associative array of plural rules in pluralform => rule format.
-        * @return int The index of the plural form which passed the evaluation
-        */
-       public static function evaluate( $number, array $rules ) {
-               $rules = self::compile( $rules );
-
-               return self::evaluateCompiled( $number, $rules );
-       }
-
-       /**
-        * Convert a set of rules to a compiled form which is optimised for
-        * fast evaluation. The result will be an array of strings, and may be cached.
-        *
-        * @param array $rules The rules to compile
-        * @return array An array of compile rules.
-        */
-       public static function compile( array $rules ) {
-               // We can't use array_map() for this because it generates a warning if
-               // there is an exception.
-               foreach ( $rules as &$rule ) {
-                       $rule = CLDRPluralRuleConverter::convert( $rule );
-               }
-
-               return $rules;
-       }
-
-       /**
-        * Evaluate a compiled set of rules returned by compile(). Do not allow
-        * the user to edit the compiled form, or else PHP errors may result.
-        *
-        * @param string $number The number to be evaluated against the rules, in English, or it
-        *   may be a type convertible to string.
-        * @param array $rules The associative array of plural rules in pluralform => rule format.
-        * @return int The index of the plural form which passed the evaluation
-        */
-       public static function evaluateCompiled( $number, array $rules ) {
-               // Calculate the values of the operand symbols
-               $number = strval( $number );
-               if ( !preg_match( '/^ -? ( ([0-9]+) (?: \. ([0-9]+) )? )$/x', $number, $m ) ) {
-                       wfDebug( __METHOD__ . ": invalid number input, returning 'other'\n" );
-
-                       return count( $rules );
-               }
-               if ( !isset( $m[3] ) ) {
-                       $operandSymbols = array(
-                               'n' => intval( $m[1] ),
-                               'i' => intval( $m[1] ),
-                               'v' => 0,
-                               'w' => 0,
-                               'f' => 0,
-                               't' => 0
-                       );
-               } else {
-                       $absValStr = $m[1];
-                       $intStr = $m[2];
-                       $fracStr = $m[3];
-                       $operandSymbols = array(
-                               'n' => floatval( $absValStr ),
-                               'i' => intval( $intStr ),
-                               'v' => strlen( $fracStr ),
-                               'w' => strlen( rtrim( $fracStr, '0' ) ),
-                               'f' => intval( $fracStr ),
-                               't' => intval( rtrim( $fracStr, '0' ) ),
-                       );
-               }
-
-               // The compiled form is RPN, with tokens strictly delimited by
-               // spaces, so this is a simple RPN evaluator.
-               foreach ( $rules as $i => $rule ) {
-                       $stack = array();
-                       $zero = ord( '0' );
-                       $nine = ord( '9' );
-                       foreach ( StringUtils::explode( ' ', $rule ) as $token ) {
-                               $ord = ord( $token );
-                               if ( isset( $operandSymbols[$token] ) ) {
-                                       $stack[] = $operandSymbols[$token];
-                               } elseif ( $ord >= $zero && $ord <= $nine ) {
-                                       $stack[] = intval( $token );
-                               } else {
-                                       $right = array_pop( $stack );
-                                       $left = array_pop( $stack );
-                                       $result = self::doOperation( $token, $left, $right );
-                                       $stack[] = $result;
-                               }
-                       }
-                       if ( $stack[0] ) {
-                               return $i;
-                       }
-               }
-               // None of the provided rules match. The number belongs to category
-               // 'other', which comes last.
-               return count( $rules );
-       }
-
-       /**
-        * Do a single operation
-        *
-        * @param string $token The token string
-        * @param mixed $left The left operand. If it is an object, its state may be destroyed.
-        * @param mixed $right The right operand
-        * @throws CLDRPluralRuleError
-        * @return mixed The operation result
-        */
-       private static function doOperation( $token, $left, $right ) {
-               if ( in_array( $token, array( 'in', 'not-in', 'within', 'not-within' ) ) ) {
-                       if ( !( $right instanceof CLDRPluralRuleEvaluatorRange ) ) {
-                               $right = new CLDRPluralRuleEvaluatorRange( $right );
-                       }
-               }
-               switch ( $token ) {
-                       case 'or':
-                               return $left || $right;
-                       case 'and':
-                               return $left && $right;
-                       case 'is':
-                               return $left == $right;
-                       case 'is-not':
-                               return $left != $right;
-                       case 'in':
-                               return $right->isNumberIn( $left );
-                       case 'not-in':
-                               return !$right->isNumberIn( $left );
-                       case 'within':
-                               return $right->isNumberWithin( $left );
-                       case 'not-within':
-                               return !$right->isNumberWithin( $left );
-                       case 'mod':
-                               if ( is_int( $left ) ) {
-                                       return (int)fmod( $left, $right );
-                               }
-
-                               return fmod( $left, $right );
-                       case ',':
-                               if ( $left instanceof CLDRPluralRuleEvaluatorRange ) {
-                                       $range = $left;
-                               } else {
-                                       $range = new CLDRPluralRuleEvaluatorRange( $left );
-                               }
-                               $range->add( $right );
-
-                               return $range;
-                       case '..':
-                               return new CLDRPluralRuleEvaluatorRange( $left, $right );
-                       default:
-                               throw new CLDRPluralRuleError( "Invalid RPN token" );
-               }
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleEvaluatorRange.php b/languages/utils/CLDRPluralRuleEvaluatorRange.php
deleted file mode 100644 (file)
index 996c22e..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Evaluator helper class representing a range list.
- */
-class CLDRPluralRuleEvaluatorRange {
-       /**
-        * The parts
-        *
-        * @var array
-        */
-       public $parts = array();
-
-       /**
-        * Initialize a new instance of CLDRPluralRuleEvaluatorRange
-        *
-        * @param int $start The start of the range
-        * @param int|bool $end The end of the range, or false if the range is not bounded.
-        */
-       function __construct( $start, $end = false ) {
-               if ( $end === false ) {
-                       $this->parts[] = $start;
-               } else {
-                       $this->parts[] = array( $start, $end );
-               }
-       }
-
-       /**
-        * Determine if the given number is inside the range.
-        *
-        * @param int $number The number to check
-        * @param bool $integerConstraint If true, also asserts the number is an integer;
-        *   otherwise, number simply has to be inside the range.
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberIn( $number, $integerConstraint = true ) {
-               foreach ( $this->parts as $part ) {
-                       if ( is_array( $part ) ) {
-                               if ( ( !$integerConstraint || floor( $number ) === (float)$number )
-                                       && $number >= $part[0] && $number <= $part[1]
-                               ) {
-                                       return true;
-                               }
-                       } else {
-                               if ( $number == $part ) {
-                                       return true;
-                               }
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Readable alias for isNumberIn( $number, false ), and the implementation
-        * of the "within" operator.
-        *
-        * @param int $number The number to check
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberWithin( $number ) {
-               return $this->isNumberIn( $number, false );
-       }
-
-       /**
-        * Add another part to this range.
-        *
-        * @param CLDRPluralRuleEvaluatorRange|int $other The part to add, either
-        *   a range object itself or a single number.
-        */
-       function add( $other ) {
-               if ( $other instanceof self ) {
-                       $this->parts = array_merge( $this->parts, $other->parts );
-               } else {
-                       $this->parts[] = $other;
-               }
-       }
-
-       /**
-        * Returns the string representation of the rule evaluator range.
-        * The purpose of this method is to help debugging.
-        *
-        * @return string The string representation of the rule evaluator range
-        */
-       function __toString() {
-               $s = 'Range(';
-               foreach ( $this->parts as $i => $part ) {
-                       if ( $i ) {
-                               $s .= ', ';
-                       }
-                       if ( is_array( $part ) ) {
-                               $s .= $part[0] . '..' . $part[1];
-                       } else {
-                               $s .= $part;
-                       }
-               }
-               $s .= ')';
-
-               return $s;
-       }
-}
index 04aa3a5..8dad5dc 100644 (file)
@@ -460,7 +460,7 @@ abstract class Maintenance {
                }
 
                # Save additional script dependant options to display
-               # them separately in help
+               #  them separately in help
                $this->mDependantParameters = array_diff_key( $this->mParams, $this->mGenericParameters );
        }
 
@@ -1108,7 +1108,15 @@ abstract class Maintenance {
         */
        private function lockSearchindex( $db ) {
                $write = array( 'searchindex' );
-               $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache', 'user', 'page_restrictions' );
+               $read = array(
+                       'page',
+                       'revision',
+                       'text',
+                       'interwiki',
+                       'l10n_cache',
+                       'user',
+                       'page_restrictions'
+               );
                $db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ );
        }
 
index 3b3fdee..f3b9c3c 100644 (file)
@@ -1,3 +1,3 @@
 -- Hopefully temporary index.
--- For https://bugzilla.wikimedia.org/show_bug.cgi?id=21279
+-- For https://phabricator.wikimedia.org/T23279
 CREATE INDEX /*i*/ar_revid ON /*$wgDBprefix*/archive ( ar_rev_id );
\ No newline at end of file
index 22cc587..9a991b8 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-backlinkindexes.sql
 --
--- Per bug 6440 / http://bugzilla.wikimedia.org/show_bug.cgi?id=6440
+-- Per task T8440 / https://phabricator.wikimedia.org/T8440
 --
 -- Improve performance of the "what links here"-type queries
 --
index 24ad84f..e2b2c3a 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-categorylinksindex.sql
 --
--- Per bug 10280 / http://bugzilla.wikimedia.org/show_bug.cgi?id=10280
+-- Per task T12280 / https://phabricator.wikimedia.org/T12280
 --
 -- Improve enum continuation performance of the what pages belong to a category query
 --
index 7bfb734..265800e 100644 (file)
@@ -193,7 +193,7 @@ class BaseDump {
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
                                case XMLReader::TEXT:
-                               //case XMLReader::WHITESPACE:
+                               // case XMLReader::WHITESPACE:
                                case XMLReader::SIGNIFICANT_WHITESPACE:
                                        $buffer .= $this->reader->value;
                                        break;
index 27be5fd..11a0590 100644 (file)
@@ -464,8 +464,9 @@ class TextPassDumper extends BackupDumper {
         * is thrown.
         *
         * @param string $id The revision id to get the text for
-        * @param string|bool|null $model The content model used to determine applicable export transformations.
-        *      If $model is null, it will be determined from the database.
+        * @param string|bool|null $model The content model used to determine
+        *  applicable export transformations.
+        *  If $model is null, it will be determined from the database.
         * @param string|null $format The content format used when applying export transformations.
         *
         * @throws MWException
index 4772071..7a85d64 100644 (file)
@@ -12,7 +12,8 @@ require_once __DIR__ . '/Maintenance.php';
 class CheckComposerLockUpToDate extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = 'Checks whether your composer.lock file is up to date with the current composer.json';
+               $this->mDescription =
+                       'Checks whether your composer.lock file is up to date with the current composer.json';
        }
 
        public function execute() {
@@ -23,7 +24,10 @@ class CheckComposerLockUpToDate extends Maintenance {
                        // Maybe they're using mediawiki/vendor?
                        $lockLocation = "$IP/vendor/composer.lock";
                        if ( !file_exists( $lockLocation ) ) {
-                               $this->error( 'Could not find composer.lock file. Have you run "composer install"?', 1 );
+                               $this->error(
+                                       'Could not find composer.lock file. Have you run "composer install"?',
+                                       1
+                               );
                        }
                }
 
@@ -40,7 +44,9 @@ class CheckComposerLockUpToDate extends Maintenance {
                foreach ( $json->getRequiredDependencies() as $name => $version ) {
                        if ( isset( $installed[$name] ) ) {
                                if ( $installed[$name]['version'] !== $version ) {
-                                       $this->output( "$name: {$installed[$name]['version']} installed, $version required.\n" );
+                                       $this->output(
+                                               "$name: {$installed[$name]['version']} installed, $version required.\n"
+                                       );
                                        $found = true;
                                }
                        } else {
@@ -49,9 +55,14 @@ class CheckComposerLockUpToDate extends Maintenance {
                        }
                }
                if ( $found ) {
-                       $this->error( 'Error: your composer.lock file is not up to date, run "composer update" to install newer dependencies', 1 );
+                       $this->error(
+                               'Error: your composer.lock file is not up to date. ' .
+                                       'Run "composer update" to install newer dependencies',
+                               1
+                       );
                } else {
-                       // The hash is the entire composer.json file, so it can be updated without any of the dependencies changing
+                       // The hash is the entire composer.json file,
+                       // so it can be updated without any of the dependencies changing
                        // We couldn't find any out-of-date dependencies, so assume everything is ok!
                        $this->output( "Your composer.lock file is up to date with current dependencies!\n" );
                }
index 06ae17f..4e19b79 100644 (file)
@@ -19,7 +19,7 @@
  *
  * @file
  * @author TyA <tya.wiki@gmail.com>
- * @see [[bugzilla:30976]]
+ * @see https://phabricator.wikimedia.org/T32976
  * @ingroup Maintenance
  */
 
index 221ebe3..c3ad46a 100644 (file)
@@ -215,7 +215,7 @@ class ConvertLinks extends Maintenance {
                                }
                                $dbw->freeResult( $res );
                                # $this->output( "rowOffset: $rowOffset\ttuplesAdded: "
-                               #       . "$tuplesAdded\tnumBadLinks: $numBadLinks\n" );
+                               #       . "$tuplesAdded\tnumBadLinks: $numBadLinks\n" );
                                if ( $tuplesAdded != 0 ) {
                                        if ( $reportLinksConvProgress ) {
                                                $this->output( "Inserting $tuplesAdded tuples into $links_temp..." );
index dd4f760..983b772 100644 (file)
@@ -32,8 +32,9 @@ require_once __DIR__ . '/Maintenance.php';
 class FetchText extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Fetch the raw revision blob from an old_id.";
-               $this->mDescription .= "\nNOTE: Export transformations are NOT applied. This is left to backupTextPass.php";
+               $this->mDescription = "Fetch the raw revision blob from an old_id.\n" .
+                       "NOTE: Export transformations are NOT applied. " .
+                       "This is left to backupTextPass.php";
        }
 
        /**
index 114366b..0925406 100644 (file)
@@ -190,7 +190,11 @@ class FindHooks extends Maintenance {
 
                $retval = array();
                while ( true ) {
-                       $json = Http::get( wfAppendQuery( 'http://www.mediawiki.org/w/api.php', $params ), array(), __METHOD__ );
+                       $json = Http::get(
+                               wfAppendQuery( 'http://www.mediawiki.org/w/api.php', $params ),
+                               array(),
+                               __METHOD__
+                       );
                        $data = FormatJson::decode( $json, true );
                        foreach ( $data['query']['categorymembers'] as $page ) {
                                if ( preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $m ) ) {
index d142556..ef264c3 100644 (file)
@@ -63,7 +63,7 @@
                                        "mw.Feedback*",
                                        "mw.Upload*",
                                        "mw.ForeignUpload",
-                                       "mw.ForeignStructuredUpload"
+                                       "mw.ForeignStructuredUpload*"
                                ]
                        },
                        {
index 2c42364..5434735 100644 (file)
@@ -34,6 +34,9 @@
                };
        </script>
        <script>
+               // Emulate startup.js
+               var mwPerformance = { mark: function () {} };
+
                function startUp() {
                        mw.config = new mw.Map();
                }
        <script src="modules/src/mediawiki/mediawiki.js"></script>
        <script src="modules/src/mediawiki/mediawiki.errorLogger.js"></script>
        <script src="modules/src/mediawiki/mediawiki.startUp.js"></script>
+       <script src="modules/lib/oojs/oojs.jquery.js"></script>
+       <script src="modules/lib/oojs-ui/oojs-ui.js"></script>
+       <script src="modules/lib/oojs-ui/oojs-ui-mediawiki.js"></script>
        <style>
+               body {
+                       font-size: 0.8em;
+                       font-family: sans-serif;
+               }
+
                .mw-jsduck-log {
                        position: relative;
                        min-height: 3em;
@@ -74,6 +85,8 @@
                        background: #fff;
                }
        </style>
+       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-local.css">
+       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-mediawiki-noimages.css">
 </head>
 <body>
 <script>
                mw.log = log;
        }
 
-       window.onerror = function ( error, filePath, linerNr ) {
-               log( filePath + ':' + linerNr  );
-       };
-
        /**
         * Method called by jsduck to execute the example code.
         */
index 5518a88..86de029 100644 (file)
@@ -25,6 +25,7 @@ U+0514B克|U+0514B克|U+0524B剋|
 U+0515A党|U+09EE8黨|U+0515A党|
 U+051AC冬|U+051AC冬|U+09F15鼕|
 U+051B2冲|U+06C96沖|U+0885D衝|
+U+051C0净|U+06DE8淨|
 U+051C4凄|U+06DD2淒|U+060BD悽|
 U+051C6准|U+051C6准|U+06E96準|
 U+051E0几|U+05E7E幾|U+051E0几|
index 3477c0a..17d2f21 100644 (file)
 校雠
 雠夷
 雠问
+雠正
+施雠
+无言不雠
 甚夥
 吴克羣
 宏碁
index 3a00bd4..7f94ede 100644 (file)
@@ -2585,6 +2585,9 @@ A型肝炎        甲型肝炎
 尖峰時段   高峰时段
 咖哩 咖喱
 東協 东盟
+東協會      东协会
+東協助      东协助
+東協議      东协议
 亚细安      东盟
 大英國協   英联邦
 共和联邦   英联邦
@@ -2651,3 +2654,7 @@ A型肝炎        甲型肝炎
 東南亞國家協會  东南亚国家联盟
 獨立國協   独联体
 獨立國家國協     独立国家联合体
+行人路      人行道
+行人路權   行人路权
+行人路权   行人路权
+塑膠袋      塑料袋
index 525100e..acbce96 100644 (file)
@@ -1,7 +1,6 @@
 裡    裏
 鉤    鈎
 檯    枱
-臥    卧
 醯    酰
 菸    煙
 汙    污
 慌里慌张   慌裏慌張
 怀里 懷裏
 戏里 戲裏
+游戏里      遊戲裏
 房里 房裏
 手里 手裏
 手里剑      手裏劍
 月裡来      月裏來
 分钟里      分鐘裏
 小时里      小時裏
+体里 體裏
+柜里 櫃裏
+电影里      電影裏
 苑裡 苑裡
 霄裡 霄裡
 岸裡 岸裡
 径启 逕啟
 径迎 逕迎
 印表機      打印機
-字节 位元組
-字節 位元組
+0字节        0位元組
+1字节        1位元組
+2字节        2位元組
+3字节        3位元組
+4字节        4位元組
+5字节        5位元組
+6字节        6位元組
+7字节        7位元組
+8字节        8位元組
+9字节        9位元組
 列印 打印
 硬件 硬件
 硬體 硬件
@@ -2938,6 +2949,9 @@ IP地址  IP位址
 尖峰時間   繁忙時間
 尖峰時段   繁忙時段
 東協 東盟
+東協會      東協會
+東協助      東協助
+東協議      東協議
 亚细安      東盟
 大英國協   英聯邦
 共和联邦   英聯邦
@@ -2992,8 +3006,10 @@ IP地址 IP位址
 賈伯斯      喬布斯
 宝莱坞      波里活
 寶萊塢      波里活
-庫德æ\97\8f      åº\93爾德族
-庫德人      åº\93爾德人
+庫德æ\97\8f      åº«爾德族
+庫德人      åº«爾德人
 東南亞國家協會  東南亞國家聯盟
 獨立國協   獨聯體
 獨立國家國協     獨立國家聯合體
+人行道      行人路
+塑料袋      膠袋
index 22456a7..57f9ab5 100644 (file)
 打印 列印
 攻打 攻打 #分詞用
 打印度      打印度
+0字节        0位元組
+1字节        1位元組
+2字节        2位元組
+3字节        3位元組
+4字节        4位元組
+5字节        5位元組
+6字节        6位元組
+7字节        7位元組
+8字节        8位元組
+9字节        9位元組
 硬件 硬體
 二极管      二極體
 二極管      二極體
@@ -758,3 +768,7 @@ IP地址    IP位址
 波里活      寶萊塢
 库尔德族   庫德族
 库尔德人   庫德人
+行人路      人行道
+行人路權   行人路權
+行人路权   行人路權
+塑料袋      塑膠袋
index 13a0b98..b30fdd6 100644 (file)
@@ -4,10 +4,9 @@
 ’    』
 ’s   ’s
 手塚治虫   手塚治虫
-無言不仇   無言不讎
-視如寇仇   視如寇讎
-往日無仇   往日無讎
-近日無仇   近日無讎
+寇仇 寇讎
+往日无仇   往日無讎
+近日无仇   近日無讎
 李連杰      李連杰
 杰倫 杰倫
 杰威爾      杰威爾
 天神之后   天神之后
 豔后 豔后
 后綜 后綜
+葉陽后      葉陽后
 壽天里      壽天里
 貴子里      貴子里
 東湖里      東湖里
 7余   7餘
 8余   8餘
 9余   9餘
+米余 米餘
 带余 帶餘
 余干 餘干
 余江 餘江
 龙岩 龍巖
 扑冬 撲鼕
 冬冬鼓      鼕鼕鼓
+苧麻 苧麻
index c479f35..03c42d9 100644 (file)
@@ -30,6 +30,7 @@ U+03D31㴱|U+06DF1深|
 U+03F1D㼝|U+07897碗|
 U+03F5E㽞|U+07559留|
 U+03FDC㿜|U+0762A瘪|
+U+04039䀹|U+25174𥅴|
 U+04230䈰|U+07B72筲|
 U+04280䊀|U+07CCA糊|
 U+045EC䗬|U+08702蜂|
@@ -456,6 +457,7 @@ U+07D25紥|U+0624E扎|
 U+07D2E紮|U+0624E扎|
 U+07D43絃|U+05F26弦|
 U+07D4F絏|U+07EC1绁|
+U+07D76絶|U+07EDD绝|
 U+07D89綉|U+07EE3绣|
 U+07D91綑|U+06346捆|
 U+07DAB綫|U+07EBF线|
index b97ca6e..8e1e90d 100644 (file)
 開採
 揪採
 樵採
+改採
 採訪
 採辦
 採補
 採運
 採風
 採血
+花不要採
 官地為寀
 寮寀
 蔘綏
 截髮
 解髮佯狂
 淨髮
-秋髮
 噙齒戴髮
 青山一髮
 晞髮
 絲髮
 絲恩髮怨
 蒜髮
-算髮
 有髮頭陀寺
 髮箋
 髮屋
 模范棒棒堂
 模范三軍
 模范七棒
-模范14棒
-模范21棒
 顏範
 儀範
 典範
 田穀
 脫穀機
 年穀
-礱穀
+礱穀
 穀米
 穀旦
 穀圭
 澄澹精致
 呆緻緻
 光緻緻
-工緻
-功緻
 縝緻
 堅緻
 种放
 中庄子
 田庄英雄
 本庄
+庄司
 厂部
 衝量
 衝車
 祝讚
 詩讚
 賞讚
+讚嘆
 讚唄
 點讚
 點個讚
+超讚
 飛紮
 紮裹
 紮腳
 百科裡
 歷史裡
 戲裡
+遊戲裡
 作品裡
 專輯裡
 年代裡
 棺材裡
-假里白
 天里村
 上天里
 天里昂
 月裡來
 分鐘裡
 小時裡
+體裡
+櫃裡
+片裡
+電影裡
+裏白 #植物常用名
+烏蘇里 #分詞用
 首發
 夸脫
 風采
 趙威后
 聖后
 陳有后
+惠文后
+葉陽后
 于冠華
 于雲鶴
 于忠肅集
 涌水塘
 后姓
 計劃
-抑制劑
 党姓
 党家
 种丹妮
 宋王臺
 臺佟
 臺靜農
-改採
 林鵞峰
 沙羡
 最多只
 羅馬歷史
 羅馬歷代
 曆數書
+曆局
 你誇
 誇你
 誇我
 自誇
 誇稱
 誇讚
-讚嘆
 布穀鳥
 黎克特制
 筆桿
 烹製
 醃製
 和製漢
+和製英語
 壓製機
 壓製出
+應制得
+反應製得
+製表鍵
+電子製表
+製毒
+製販
+遏制 #以下分詞用
+管制
+抑制
+控制
+限制
 體徵
 綜合徵
 价川
 呦喂
 水表面
 表面包
+費米面
 松口鎮
 沙瑯
 琺瑯
 風颳
 颳大風
 黃白術
+仁貴 #分詞用
+金聖歎
+天台 #分詞用
index 78587ce..68b97e3 100644 (file)
@@ -72,7 +72,8 @@ class MigrateFileRepoLayout extends Maintenance {
                $batch = array();
                $lastName = '';
                do {
-                       $res = $dbw->select( 'image', array( 'img_name', 'img_sha1' ),
+                       $res = $dbw->select( 'image',
+                               array( 'img_name', 'img_sha1' ),
                                array_merge( array( 'img_name > ' . $dbw->addQuotes( $lastName ) ), $conds ),
                                __METHOD__,
                                array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'img_name' )
@@ -80,12 +81,14 @@ class MigrateFileRepoLayout extends Maintenance {
 
                        foreach ( $res as $row ) {
                                $lastName = $row->img_name;
-                               $sha1 = $row->img_sha1;
+                               /** @var LocalFile $file */
+                               $file = $repo->newFile( $row->img_name );
+                               // Check in case SHA1 rows are not populated for some files
+                               $sha1 = strlen( $row->img_sha1 ) ? $row->img_sha1 : $file->getSha1();
+
                                if ( !strlen( $sha1 ) ) {
-                                       $this->error( "Image SHA-1 not set for {$row->img_name}." );
+                                       $this->error( "Image SHA-1 not known for {$row->img_name}." );
                                } else {
-                                       $file = $repo->newFile( $row->img_name );
-
                                        if ( $oldLayout === 'sha1' ) {
                                                $spath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
                                        } else {
@@ -98,7 +101,8 @@ class MigrateFileRepoLayout extends Maintenance {
                                                $dpath = $file->getPath();
                                        }
 
-                                       $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                                       $status = $be->prepare( array(
+                                               'dir' => dirname( $dpath ), 'bypassReadOnly' => 1 ) );
                                        if ( !$status->isOK() ) {
                                                $this->error( print_r( $status->getErrorsArray(), true ) );
                                        }
@@ -130,7 +134,8 @@ class MigrateFileRepoLayout extends Maintenance {
                                                $dpath = $ofile->getPath();
                                        }
 
-                                       $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                                       $status = $be->prepare( array(
+                                               'dir' => dirname( $dpath ), 'bypassReadOnly' => 1 ) );
                                        if ( !$status->isOK() ) {
                                                $this->error( print_r( $status->getErrorsArray(), true ) );
                                        }
@@ -187,7 +192,8 @@ class MigrateFileRepoLayout extends Maintenance {
                                                '/' . $repo->getDeletedHashPath( $sha1Key ) . $sha1Key;
                                }
 
-                               $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                               $status = $be->prepare( array(
+                                       'dir' => dirname( $dpath ), 'bypassReadOnly' => 1 ) );
                                if ( !$status->isOK() ) {
                                        $this->error( print_r( $status->getErrorsArray(), true ) );
                                }
@@ -219,7 +225,7 @@ class MigrateFileRepoLayout extends Maintenance {
                        $this->output( "\"{$op['img']}\" (dest: {$op['dst']})\n" );
                }
 
-               $status = $be->doOperations( $ops );
+               $status = $be->doOperations( $ops, array( 'bypassReadOnly' => 1 ) );
                if ( !$status->isOK() ) {
                        $this->output( print_r( $status->getErrorsArray(), true ) );
                }
index efecaad..c357eeb 100644 (file)
@@ -40,12 +40,6 @@ class MinifyScript extends Maintenance {
                        "Directory for output. If this is not specified, and neither is --outfile, then the\n" .
                        "output files will be sent to the same directories as the input files.",
                        false, true );
-               $this->addOption( 'js-statements-on-own-line',
-                       "Boolean value for putting statements on their own line when minifying JavaScript.",
-                       false, true );
-               $this->addOption( 'js-max-line-length',
-                       "Maximum line length for JavaScript minification.",
-                       false, true );
                $this->mDescription = "Minify a file or set of files.\n\n" .
                        "If --outfile is not specified, then the output file names will have a .min extension\n" .
                        "added, e.g. jquery.js -> jquery.min.js.";
@@ -108,8 +102,6 @@ class MinifyScript extends Maintenance {
        }
 
        public function minify( $inPath, $outPath ) {
-               global $wgResourceLoaderMinifierStatementsOnOwnLine, $wgResourceLoaderMinifierMaxLineLength;
-
                $extension = $this->getExtension( $inPath );
                $this->output( basename( $inPath ) . ' -> ' . basename( $outPath ) . '...' );
 
@@ -126,10 +118,7 @@ class MinifyScript extends Maintenance {
 
                switch ( $extension ) {
                        case 'js':
-                               $outText = JavaScriptMinifier::minify( $inText,
-                                       $this->getOption( 'js-statements-on-own-line', $wgResourceLoaderMinifierStatementsOnOwnLine ),
-                                       $this->getOption( 'js-max-line-length', $wgResourceLoaderMinifierMaxLineLength )
-                               );
+                               $outText = JavaScriptMinifier::minify( $inText );
                                break;
                        case 'css':
                                $outText = CSSMin::minify( $inText );
index 3f5d6b6..7bca0ec 100644 (file)
@@ -178,7 +178,7 @@ class PopulateContentModel extends Maintenance {
                                        if ( $dbFormat === $defaultFormat ) {
                                                $toSave[$defaultModel][] = $row->{$key};
                                        } else { // non-default format, just update now
-                                               $this->output( "Updating model to match format for $table $id of $title... ");
+                                               $this->output( "Updating model to match format for $table $id of $title... " );
                                                $dbw->update(
                                                        $table,
                                                        array( $model_column => $defaultModel ),
index e1710c1..4d38710 100644 (file)
@@ -212,7 +212,7 @@ class PPFuzzTest {
 
        function getReport() {
                $s = "Title: " . $this->title->getPrefixedDBkey() . "\n" .
-//                     "Output type: {$this->outputType}\n" .
+//                     "Output type: {$this->outputType}\n" .
                        "Entry point: {$this->entryPoint}\n" .
                        "User: " . ( $this->fancySig ? 'fancy' : 'no-fancy' ) .
                        ' ' . var_export( $this->nickname, true ) . "\n" .
index 8e39978..b1bb353 100644 (file)
@@ -48,7 +48,7 @@ class ImageBuilder extends Maintenance {
                parent::__construct();
 
                global $wgUpdateCompatibleMetadata;
-               //make sure to update old, but compatible img_metadata fields.
+               // make sure to update old, but compatible img_metadata fields.
                $wgUpdateCompatibleMetadata = true;
 
                $this->mDescription = 'Script to update image metadata records';
index 3cb4a2b..16c676d 100644 (file)
@@ -189,7 +189,7 @@ class CompressOld extends Maintenance {
                if ( false !== strpos( $row->old_flags, 'gzip' )
                        || false !== strpos( $row->old_flags, 'object' )
                ) {
-                       #print "Already compressed row {$row->old_id}\n";
+                       # print "Already compressed row {$row->old_id}\n";
                        return false;
                }
                $dbw = wfGetDB( DB_MASTER );
@@ -303,8 +303,8 @@ class CompressOld extends Maintenance {
 
                # Don't work with current revisions
                # Don't lock the page table for update either -- TS 2006-04-04
-               #$tables[] = 'page';
-               #$conds[] = 'page_id=rev_page AND rev_id != page_latest';
+               # $tables[] = 'page';
+               # $conds[] = 'page_id=rev_page AND rev_id != page_latest';
 
                for ( $pageId = $startId; $pageId <= $maxPageId; $pageId++ ) {
                        wfWaitForSlaves();
@@ -384,7 +384,7 @@ class CompressOld extends Maintenance {
 
                                        if ( $text === false ) {
                                                $this->error( "\nError, unable to get text in old_id $oldid" );
-                                               #$dbw->delete( 'old', array( 'old_id' => $oldid ) );
+                                               # $dbw->delete( 'old', array( 'old_id' => $oldid ) );
                                        }
 
                                        if ( $extdb == "" && $j == 0 ) {
index b213929..120ccb6 100644 (file)
@@ -365,7 +365,7 @@ class RecompressTracked {
                if ( $current == $end || $this->numBatches >= $this->reportingInterval ) {
                        $this->numBatches = 0;
                        $this->info( "$label: $current / $end" );
-                       $this->waitForSlaves();
+                       wfWaitForSlaves();
                }
        }
 
@@ -463,7 +463,7 @@ class RecompressTracked {
                                case 'quit':
                                        return;
                        }
-                       $this->waitForSlaves();
+                       wfWaitForSlaves();
                }
        }
 
@@ -530,7 +530,7 @@ class RecompressTracked {
                                        $this->debug( "$titleText: committing blob with " . $trx->getSize() . " items" );
                                        $trx->commit();
                                        $trx = new CgzCopyTransaction( $this, $this->pageBlobClass );
-                                       $this->waitForSlaves();
+                                       wfWaitForSlaves();
                                }
                        }
                        $startId = $row->bt_text_id;
@@ -613,7 +613,7 @@ class RecompressTracked {
                        foreach ( $res as $row ) {
                                $this->moveTextRow( $row->bt_text_id, $row->bt_new_url );
                                if ( $row->bt_text_id % 10 == 0 ) {
-                                       $this->waitForSlaves();
+                                       wfWaitForSlaves();
                                }
                        }
                        $startId = $row->bt_text_id;
@@ -681,26 +681,12 @@ class RecompressTracked {
                                $this->debug( "[orphan]: committing blob with " . $trx->getSize() . " rows" );
                                $trx->commit();
                                $trx = new CgzCopyTransaction( $this, $this->orphanBlobClass );
-                               $this->waitForSlaves();
+                               wfWaitForSlaves();
                        }
                }
                $this->debug( "[orphan]: committing blob with " . $trx->getSize() . " rows" );
                $trx->commit();
        }
-
-       /**
-        * Wait for slaves (quietly)
-        */
-       function waitForSlaves() {
-               $lb = wfGetLB();
-               while ( true ) {
-                       list( $host, $maxLag ) = $lb->getMaxLag();
-                       if ( $maxLag < 2 ) {
-                               break;
-                       }
-                       sleep( 5 );
-               }
-       }
 }
 
 /**
index aa0c7ea..4b58b60 100644 (file)
@@ -1524,7 +1524,7 @@ CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_me
 CREATE TABLE /*_*/module_deps (
   -- Module name
   md_module varbinary(255) NOT NULL,
-  -- Skin name
+  -- Module context vary (includes skin and language; called "md_skin" for legacy reasons)
   md_skin varbinary(32) NOT NULL,
   -- JSON blob with file dependencies
   md_deps mediumblob NOT NULL
index d2dc213..fb637f7 100644 (file)
                }
 
                // Set up the help system
-               $( '.mw-help-field-data' )
+               $( '.config-help-field-data' )
                        .hide()
-                       .closest( '.mw-help-field-container' )
-                               .find( '.mw-help-field-hint' )
+                       .closest( '.config-help-field-container' )
+                               .find( '.config-help-field-hint' )
                                        .show()
                                        .click( function () {
                                                $( this )
-                                                       .closest( '.mw-help-field-container' )
-                                                               .find( '.mw-help-field-data' )
+                                                       .closest( '.config-help-field-container' )
+                                                               .find( '.config-help-field-data' )
                                                                        .slideToggle( 'fast' );
                                        } );
 
index c00dbed..d48a5e0 100644 (file)
@@ -1,6 +1,5 @@
 {
-  "name": "mediawiki",
-  "version": "0.0.0",
+  "private": true,
   "scripts": {
     "test": "grunt test",
     "doc": "jsduck",
     "grunt": "0.4.5",
     "grunt-cli": "0.1.13",
     "grunt-banana-checker": "0.3.0",
-    "grunt-contrib-copy": "0.8.0",
+    "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-karma": "0.11.0",
-    "karma": "0.12.36",
-    "karma-chrome-launcher": "0.1.12",
+    "grunt-karma": "0.12.1",
+    "karma": "0.13.10",
+    "karma-chrome-launcher": "0.2.0",
     "karma-firefox-launcher": "0.1.6",
-    "karma-qunit": "0.1.4",
+    "karma-qunit": "0.1.5",
     "qunitjs": "1.18.0"
   }
 }
index 36ad394..16d92be 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -1,12 +1,29 @@
 <?xml version="1.0"?>
 <ruleset name="MediaWiki">
-       <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki"/>
+       <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
+               <!-- Disable failing rules -->
+               <exclude name="Squiz.Classes.ValidClassName.NotCamelCaps"/>
+               <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.EmptyComment"/>
+       </rule>
+       <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
+               <properties>
+                       <property name="ignoreList" type="array" value="bfNormalizeTitleStrReplace,bfNormalizeTitleStrTr,cdbShowHelp,codepointToUtf8,compare_point,cssfilter,escapeSingleString,findAuxFile,findFiles,getEscapedProfileUrl,getFileCommentFromSourceWiki,getFileUserFromSourceWiki,hexSequenceToUtf8,mccGetHelp,mccShowUsage,mimeTypeMatch,moveToExternal,NothingFunction,NothingFunctionData,resolveStub,resolveStubs,showUsage,splitFilename,utf8ToCodepoint,utf8ToHexSequence" />
+               </properties>
+       </rule>
+       <rule ref="MediaWiki.NamingConventions.ValidGlobalName">
+               <properties>
+                       <property name="ignoreList" type="array" value="$IP,$messageMemc,$parserMemc" />
+               </properties>
+       </rule>
        <file>.</file>
        <arg name="encoding" value="utf8"/>
        <arg name="extensions" value="php,php5,inc,sample"/>
        <rule ref="Generic.Files.LineLength">
                <exclude-pattern>*/languages/messages/Messages*.php</exclude-pattern>
        </rule>
+       <rule ref="PSR2.Methods.MethodDeclaration.Underscore">
+               <exclude-pattern>*/includes/StubObject.php</exclude-pattern>
+       </rule>
        <exclude-pattern>node_modules</exclude-pattern>
        <exclude-pattern>vendor</exclude-pattern>
        <exclude-pattern>extensions</exclude-pattern>
index f172cfb..f44ee5a 100644 (file)
@@ -320,7 +320,13 @@ if ( isset( $_REQUEST['sort'] ) && in_array( $_REQUEST['sort'], $sorts ) ) {
        $sort = $_REQUEST['sort'];
 }
 
-$res = $dbr->select( 'profiling', '*', array(), 'profileinfo.php', array( 'ORDER BY' => 'pf_name ASC' ) );
+$res = $dbr->select(
+       'profiling',
+       '*',
+       array(),
+       'profileinfo.php',
+       array( 'ORDER BY' => 'pf_name ASC' )
+);
 
 if ( isset( $_REQUEST['filter'] ) ) {
        $filter = $_REQUEST['filter'];
@@ -333,7 +339,9 @@ if ( isset( $_REQUEST['filter'] ) ) {
        <p>
                <input type="text" name="filter" value="<?php echo htmlspecialchars( $filter ); ?>">
                <input type="hidden" name="sort" value="<?php echo htmlspecialchars( $sort ); ?>">
-               <input type="hidden" name="expand" value="<?php echo htmlspecialchars( implode( ",", array_keys( $expand ) ) ); ?>">
+               <input type="hidden" name="expand" value="<?php
+                       echo htmlspecialchars( implode( ",", array_keys( $expand ) ) );
+               ?>">
                <input type="submit" value="Filter">
        </p>
 </form>
@@ -341,15 +349,33 @@ if ( isset( $_REQUEST['filter'] ) ) {
 <table class="mw-profileinfo-table table table-striped table-hover">
        <thead>
        <tr>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'name' ); ?>">Name</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'time' ); ?>">Time (%)</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'memory' ); ?>">Memory (%)</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'count' ); ?>">Count</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'calls_per_req' ); ?>">Calls/req</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_call' ); ?>">ms/call</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_call' ); ?>">kb/call</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_req' ); ?>">ms/req</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_req' ); ?>">kb/req</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'name' );
+               ?>">Name</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'time' );
+               ?>">Time (%)</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'memory' );
+               ?>">Memory (%)</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'count' );
+               ?>">Count</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'calls_per_req' );
+               ?>">Calls/req</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'time_per_call' );
+               ?>">ms/call</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'memory_per_call' );
+               ?>">kb/call</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'time_per_req' );
+               ?>">ms/req</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'memory_per_req' );
+               ?>">kb/req</a></th>
        </tr>
        </thead>
        <tbody>
index 4e59312..afcd589 100644 (file)
@@ -860,7 +860,7 @@ return array(
                'position' => 'top',
        ),
        'mediawiki.api' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.js',
+               'scripts' => 'resources/src/mediawiki/api.js',
                'dependencies' => array(
                        'mediawiki.util',
                        'user.tokens',
@@ -868,14 +868,14 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.category' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.category.js',
+               'scripts' => 'resources/src/mediawiki/api/category.js',
                'dependencies' => array(
                        'mediawiki.api',
                        'mediawiki.Title',
                ),
        ),
        'mediawiki.api.edit' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.edit.js',
+               'scripts' => 'resources/src/mediawiki/api/edit.js',
                'dependencies' => array(
                        'mediawiki.api',
                        'mediawiki.Title',
@@ -883,21 +883,21 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.login' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.login.js',
+               'scripts' => 'resources/src/mediawiki/api/login.js',
                'dependencies' => 'mediawiki.api',
        ),
        'mediawiki.api.options' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.options.js',
+               'scripts' => 'resources/src/mediawiki/api/options.js',
                'dependencies' => 'mediawiki.api',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.parse' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.parse.js',
+               'scripts' => 'resources/src/mediawiki/api/parse.js',
                'dependencies' => 'mediawiki.api',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.upload' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.upload.js',
+               'scripts' => 'resources/src/mediawiki/api/upload.js',
                'dependencies' => array(
                        'dom-level2-shim',
                        'mediawiki.api',
@@ -906,7 +906,7 @@ return array(
                ),
        ),
        'mediawiki.api.watch' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.watch.js',
+               'scripts' => 'resources/src/mediawiki/api/watch.js',
                'dependencies' => array(
                        'mediawiki.api',
                ),
@@ -993,7 +993,7 @@ return array(
                'dependencies' => 'mediawiki.ForeignApi.core',
        ),
        'mediawiki.ForeignApi.core' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.ForeignApi.js',
+               'scripts' => 'resources/src/mediawiki/ForeignApi.js',
                'dependencies' => array(
                        'mediawiki.api',
                        'oojs',
@@ -1135,6 +1135,54 @@ return array(
                        'dom-level2-shim',
                        'mediawiki.api.upload',
                ),
+               'messages' => array(
+                       'api-error-badaccess-groups',
+                       'api-error-badtoken',
+                       'api-error-copyuploaddisabled',
+                       'api-error-duplicate',
+                       'api-error-duplicate-archive',
+                       'api-error-empty-file',
+                       'api-error-emptypage',
+                       'api-error-fetchfileerror',
+                       'api-error-fileexists-forbidden',
+                       'api-error-fileexists-shared-forbidden',
+                       'api-error-file-too-large',
+                       'api-error-filename-tooshort',
+                       'api-error-filetype-banned',
+                       'api-error-filetype-banned-type',
+                       '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',
+                       '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',
+                       'api-error-unknown-error',
+                       'api-error-unknown-warning',
+                       'api-error-unknownerror',
+                       'api-error-uploaddisabled',
+                       'api-error-verification-error',
+               ),
        ),
        'mediawiki.ForeignUpload' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.ForeignUpload.js',
@@ -1151,25 +1199,65 @@ return array(
                ),
        ),
        'mediawiki.Upload.Dialog' => array(
-               'scripts' => 'resources/src/mediawiki/mediawiki.Upload.Dialog.js',
+               'scripts' => array(
+                       'resources/src/mediawiki/mediawiki.Upload.Dialog.js',
+               ),
                'dependencies' => array(
-                       'oojs-ui',
-                       'mediawiki.Upload',
+                       'mediawiki.Upload.BookletLayout',
                ),
                'messages' => array(
                        'upload-dialog-title',
-                       'upload-dialog-error',
-                       'upload-dialog-warning',
                        'upload-dialog-button-cancel',
                        'upload-dialog-button-done',
                        'upload-dialog-button-save',
                        'upload-dialog-button-upload',
-                       'upload-dialog-label-select-file',
-                       'upload-dialog-label-infoform-title',
-                       'upload-dialog-label-infoform-name',
-                       'upload-dialog-label-infoform-description',
-                       'upload-dialog-label-usage-title',
-                       'upload-dialog-label-usage-filename',
+               ),
+       ),
+       'mediawiki.Upload.BookletLayout' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki/mediawiki.Upload.BookletLayout.js',
+               ),
+               'dependencies' => array(
+                       'oojs-ui',
+                       'mediawiki.Upload',
+                       'mediawiki.jqueryMsg',
+               ),
+               'messages' => array(
+                       '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',
+                       'fileexists',
+                       'filepageexists',
+                       'filename-bad-prefix',
+                       'filename-thumb-name',
+                       'badfilename',
+                       'api-error-duplicate-archive',
+               ),
+       ),
+       'mediawiki.ForeignStructuredUpload.BookletLayout' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js',
+               'dependencies' => array(
+                       'mediawiki.ForeignStructuredUpload',
+                       'mediawiki.Upload.BookletLayout',
+                       'mediawiki.widgets.CategorySelector',
+                       'mediawiki.widgets.DateInputWidget',
+                       'mediawiki.jqueryMsg',
+               ),
+               'messages' => array(
+                       '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-default',
+                       'foreign-structured-upload-form-label-not-own-work-message-default',
+                       'foreign-structured-upload-form-label-not-own-work-local-default',
+                       'foreign-structured-upload-form-label-own-work-message-wikimediacommons',
+                       'foreign-structured-upload-form-label-not-own-work-message-wikimediacommons',
+                       'foreign-structured-upload-form-label-not-own-work-local-wikimediacommons',
                ),
        ),
        'mediawiki.toc' => array(
@@ -1369,7 +1457,8 @@ return array(
        ),
        'mediawiki.action.view.filepage' => array(
                'styles' => array(
-                       'resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css' => array( 'media' => 'print' ),
+                       'resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css' =>
+                               array( 'media' => 'print' ),
                        'resources/src/mediawiki.action/mediawiki.action.view.filepage.css',
                ),
                'position' => 'top',
@@ -1466,7 +1555,7 @@ return array(
        /* MediaWiki Page */
 
        'mediawiki.page.gallery' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.gallery.js',
+               'scripts' => 'resources/src/mediawiki/page/gallery.js',
                'dependencies' => array(
                        'mediawiki.page.gallery.styles',
                        'jquery.throttle-debounce',
@@ -1474,14 +1563,14 @@ return array(
        ),
        'mediawiki.page.gallery.styles' => array(
                'styles' => array(
-                       'resources/src/mediawiki.page/mediawiki.page.gallery.print.css' => array( 'media' => 'print' ),
-                       'resources/src/mediawiki.page/mediawiki.page.gallery.css',
+                       'resources/src/mediawiki/page/gallery-print.css' => array( 'media' => 'print' ),
+                       'resources/src/mediawiki/page/gallery.css',
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.page.ready' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.ready.js',
+               'scripts' => 'resources/src/mediawiki/page/ready.js',
                'dependencies' => array(
                        'jquery.accessKeyLabel',
                        'jquery.checkboxShiftClick',
@@ -1492,13 +1581,13 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.page.startup' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.startup.js',
+               'scripts' => 'resources/src/mediawiki/page/startup.js',
                'dependencies' => 'mediawiki.util',
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.page.patrol.ajax' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js',
+               'scripts' => 'resources/src/mediawiki/page/patrol.js',
                'dependencies' => array(
                        'mediawiki.page.startup',
                        'mediawiki.api',
@@ -1515,11 +1604,11 @@ return array(
                ),
        ),
        'mediawiki.page.watch.ajax' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.watch.ajax.js',
+               'scripts' => 'resources/src/mediawiki/page/watch.js',
                'dependencies' => array(
+                       'mediawiki.page.startup',
                        'mediawiki.api.watch',
                        'mediawiki.notify',
-                       'mediawiki.page.startup',
                        'mediawiki.util',
                        'jquery.accessKeyLabel',
                        'mediawiki.RegExp',
@@ -1535,7 +1624,7 @@ return array(
                ),
        ),
        'mediawiki.page.image.pagination' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.image.pagination.js',
+               'scripts' => 'resources/src/mediawiki/page/image-pagination.js',
                'dependencies' => array(
                        'mediawiki.Uri',
                        'mediawiki.util',
@@ -1759,8 +1848,11 @@ return array(
        'mediawiki.legacy.commonPrint' => array(
                'position' => 'top',
                'styles' => array(
+                       // @todo: Remove mediawiki.page.gallery when cache has cleared
+                       'resources/src/mediawiki/page/gallery-print.css' => array( 'media' => 'print' ),
                        // @todo: Remove mediawiki.action.view.filepage.print.css when cache has cleared
-                       'resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css' => array( 'media' => 'print' ),
+                       'resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css' =>
+                               array( 'media' => 'print' ),
                        'resources/src/mediawiki.legacy/commonPrint.css' => array( 'media' => 'print' )
                ),
        ),
@@ -1773,6 +1865,8 @@ return array(
        'mediawiki.legacy.shared' => array(
                'position' => 'top',
                'styles' => array(
+                       // @todo: Remove when mediawiki.page.gallery in cached html.
+                       'resources/src/mediawiki/page/gallery.css',
                        // @todo: Remove mediawiki.action.view.filepage.css
                        // and mediawiki.legacy/images/checker.png when cache has cleared
                        'resources/src/mediawiki.action/mediawiki.action.view.filepage.css',
@@ -1872,41 +1966,33 @@ return array(
 
        'mediawiki.widgets' => array(
                'scripts' => array(
-                       'resources/src/mediawiki.widgets/mw.widgets.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
                ),
                'skinStyles' => array(
                        'default' => array(
-                               'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less',
-                               'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less',
-                               'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css',
+                               'resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less',
                        ),
                ),
                'dependencies' => array(
                        'oojs-ui',
                        'mediawiki.widgets.styles',
-                       // DateInputWidget
-                       'moment',
                        // TitleInputWidget
                        'mediawiki.Title',
                        'mediawiki.api',
                        'jquery.byteLimit',
                        // TitleOptionWidget
                        'jquery.autoEllipsis',
+                       // FIXME: Kept for bc
+                       'mediawiki.widgets.CategorySelector',
                ),
                'messages' => array(
-                       // DateInputWidget
-                       'mw-widgets-dateinput-no-date',
-                       'mw-widgets-dateinput-placeholder-day',
-                       'mw-widgets-dateinput-placeholder-month',
                        // NamespaceInputWidget
                        'blanknamespace',
                        'namespacesall',
@@ -1926,6 +2012,39 @@ return array(
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.widgets.DateInputWidget' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js',
+               ),
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less',
+                               'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less',
+                       ),
+               ),
+               'messages' => array(
+                       'mw-widgets-dateinput-no-date',
+                       'mw-widgets-dateinput-placeholder-day',
+                       'mw-widgets-dateinput-placeholder-month',
+               ),
+               'dependencies' => array(
+                       'oojs-ui',
+                       'moment',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+       'mediawiki.widgets.CategorySelector' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
+               ),
+               'dependencies' => array(
+                       'oojs-ui',
+                       'mediawiki.api',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
 
        /* es5-shim */
        'es5-shim' => array(
index 6f79e37..67ec517 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Naudefj"
+                       "Naudefj",
+                       "Fwolff"
                ]
        },
        "ooui-outline-control-move-down": "Skuif item af",
@@ -15,5 +16,8 @@
        "ooui-dialog-process-error": "Iets het verkeerd gegaan",
        "ooui-dialog-process-dismiss": "Sluit",
        "ooui-dialog-process-retry": "Probeer weer",
-       "ooui-dialog-process-continue": "Gaan voort"
+       "ooui-dialog-process-continue": "Gaan voort",
+       "ooui-selectfile-button-select": "Kies 'n lêer",
+       "ooui-selectfile-placeholder": "Geen lêer is gekies nie",
+       "ooui-selectfile-dragdrop-placeholder": "Laat val die lêer hier"
 }
index 33b0ce0..3077b60 100644 (file)
@@ -12,7 +12,8 @@
                        "Edustus",
                        "Davidpar",
                        "Maceleiro",
-                       "Kippelboy"
+                       "Kippelboy",
+                       "Macofe"
                ]
        },
        "ooui-outline-control-move-down": "Baixa l'element",
@@ -27,6 +28,7 @@
        "ooui-dialog-process-dismiss": "Descarta",
        "ooui-dialog-process-retry": "Torneu-ho a provar",
        "ooui-dialog-process-continue": "Continua",
+       "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)"
index b3c4845..8538417 100644 (file)
@@ -26,5 +26,5 @@
        "ooui-dialog-process-continue": "Συνέχεια",
        "ooui-selectfile-not-supported": "Επιλογή αρχείου δεν υποστηρίζεται",
        "ooui-selectfile-placeholder": "Κανένα αρχείο δεν είναι επιλεγμένο",
-       "ooui-selectfile-dragdrop-placeholder": "Σύρετε ένα αρχείο εδώ (ή κάντε κλικ για αναζήτηση)"
+       "ooui-selectfile-dragdrop-placeholder": "Σύρετε το αρχείο εδώ"
 }
index 218ece2..1a8e31b 100644 (file)
@@ -18,6 +18,5 @@
        "ooui-dialog-process-continue": "Continue",
        "ooui-selectfile-not-supported": "File(s) not supported",
        "ooui-selectfile-placeholder": "No file selected",
-       "ooui-selectfile-dragdrop-placeholder": "Drop file here (or click to browse your computer)",
-       "ooui-semicolon-separator": ";"
+       "ooui-selectfile-dragdrop-placeholder": "Drop file here (or click to browse your computer)"
 }
index 7cf2eb1..be00832 100644 (file)
@@ -31,6 +31,5 @@
        "ooui-selectfile-button-select": "Select a file",
        "ooui-selectfile-not-supported": "File selection is not supported",
        "ooui-selectfile-placeholder": "No file is selected",
-       "ooui-selectfile-dragdrop-placeholder": "Drop file here",
-       "ooui-semicolon-separator": "; "
+       "ooui-selectfile-dragdrop-placeholder": "Drop file here"
 }
index 2ead5c5..e789565 100644 (file)
@@ -20,6 +20,7 @@
        "ooui-dialog-process-dismiss": "Elimini",
        "ooui-dialog-process-retry": "Reprovi",
        "ooui-dialog-process-continue": "Daŭrigi",
+       "ooui-selectfile-button-select": "Elekti dosieron",
        "ooui-selectfile-not-supported": "Dosieroselekto ne estas subtenata.",
        "ooui-selectfile-placeholder": "Vi ne selektis dosieron"
 }
index 11bd4b8..0375c8e 100644 (file)
@@ -29,7 +29,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-dragdrop-placeholder": "رها کردن فایل در اینجا (و یا کلیک کنید به فهرست)"
+       "ooui-selectfile-dragdrop-placeholder": "فایل را اینجا رها کنید"
 }
index b374b6f..ceb27c9 100644 (file)
@@ -8,9 +8,16 @@
        "ooui-outline-control-move-up": "Displaciar elemento in alto",
        "ooui-outline-control-remove": "Remover elemento",
        "ooui-toolbar-more": "Plus",
+       "ooui-toolgroup-expand": "Plus",
+       "ooui-toolgroup-collapse": "Minus",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Cancellar",
        "ooui-dialog-process-error": "Qualcosa ha vadite mal",
        "ooui-dialog-process-dismiss": "Clauder",
-       "ooui-dialog-process-retry": "Reprobar"
+       "ooui-dialog-process-retry": "Reprobar",
+       "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Selige un file",
+       "ooui-selectfile-not-supported": "Le selection de files non es supportate",
+       "ooui-selectfile-placeholder": "Nulle file es seligite",
+       "ooui-selectfile-dragdrop-placeholder": "Depone file hic"
 }
index 387d736..68a25b5 100644 (file)
                        "Raoli",
                        "Una giornata uggiosa '94",
                        "Ontsed",
-                       "Alexmar983"
+                       "Alexmar983",
+                       "Nemo bis",
+                       "Jdforrester"
                ]
        },
        "ooui-outline-control-move-down": "Sposta in basso",
        "ooui-outline-control-move-up": "Sposta in alto",
        "ooui-outline-control-remove": "Rimuovi elemento",
        "ooui-toolbar-more": "Altro",
-       "ooui-toolgroup-expand": "Più",
+       "ooui-toolgroup-expand": "Altro",
        "ooui-toolgroup-collapse": "Meno",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annulla",
@@ -28,6 +30,8 @@
        "ooui-dialog-process-dismiss": "Nascondi",
        "ooui-dialog-process-retry": "Riprova",
        "ooui-dialog-process-continue": "Continua",
+       "ooui-selectfile-button-select": "Seleziona un file",
        "ooui-selectfile-not-supported": "La selezione del file non è supportata",
-       "ooui-selectfile-placeholder": "Nessun file è selezionato"
+       "ooui-selectfile-placeholder": "Nessun file è selezionato",
+       "ooui-selectfile-dragdrop-placeholder": "Posiziona i files qui"
 }
index efacb63..f1a1a47 100644 (file)
@@ -24,6 +24,5 @@
        "ooui-dialog-process-retry": "კიდევ სცადეთ",
        "ooui-dialog-process-continue": "გაგრძელება",
        "ooui-selectfile-not-supported": "ფაილის არჩევა არ არის მხარდაჭერილი",
-       "ooui-selectfile-placeholder": "ფაილი არ არის არჩეული",
-       "ooui-semicolon-separator": ";"
+       "ooui-selectfile-placeholder": "ფაილი არ არის არჩეული"
 }
index bf47f6f..3894417 100644 (file)
@@ -9,7 +9,8 @@
                        "고기랑",
                        "Ryuch",
                        "Revi",
-                       "Infinity"
+                       "Infinity",
+                       "Hwangjy9"
                ]
        },
        "ooui-outline-control-move-down": "항목을 아래로 옮기기",
@@ -24,6 +25,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 bc3cf0b..d4068c8 100644 (file)
@@ -17,6 +17,5 @@
        "ooui-dialog-process-retry": "Энтда сынаб кёр",
        "ooui-dialog-process-continue": "Бардыр",
        "ooui-selectfile-not-supported": "Файл сайлау тутулмайды",
-       "ooui-selectfile-placeholder": "Бир файл да сайланмагъанды",
-       "ooui-semicolon-separator": ";"
+       "ooui-selectfile-placeholder": "Бир файл да сайланмагъанды"
 }
diff --git a/resources/lib/oojs-ui/i18n/krl.json b/resources/lib/oojs-ui/i18n/krl.json
new file mode 100644 (file)
index 0000000..6ff25eb
--- /dev/null
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mashoi7"
+               ]
+       },
+       "ooui-toolbar-more": "Enämpi",
+       "ooui-toolgroup-expand": "Enämpi",
+       "ooui-toolgroup-collapse": "Vähempi"
+}
index 326dd14..9649b2e 100644 (file)
@@ -4,7 +4,8 @@
                        "Kavya Manohar",
                        "Praveenp",
                        "Santhosh.thottingal",
-                       "Vssun"
+                       "Vssun",
+                       "Ranjithsiji"
                ]
        },
        "ooui-outline-control-move-down": "ഇനം താഴേയ്ക്ക് മാറ്റുക",
@@ -19,6 +20,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": "പ്രമാണം ഇവിടെ ഇടുക"
 }
diff --git a/resources/lib/oojs-ui/i18n/olo.json b/resources/lib/oojs-ui/i18n/olo.json
new file mode 100644 (file)
index 0000000..1dc994e
--- /dev/null
@@ -0,0 +1,23 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mashoi7"
+               ]
+       },
+       "ooui-outline-control-move-down": "Siirrä kohteh alah",
+       "ooui-outline-control-move-up": "Siirrä kohteh yläh",
+       "ooui-outline-control-remove": "Ota kohteh iäre",
+       "ooui-toolbar-more": "Enämbi",
+       "ooui-toolgroup-expand": "Enämbi",
+       "ooui-toolgroup-collapse": "Vähembi",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Hylgiä",
+       "ooui-dialog-process-error": "Mitah haireh rodih",
+       "ooui-dialog-process-dismiss": "Hylgiä",
+       "ooui-dialog-process-retry": "Opi vie",
+       "ooui-dialog-process-continue": "Jatka",
+       "ooui-selectfile-button-select": "Valliče failu",
+       "ooui-selectfile-not-supported": "Failan valličendua ei tuveta",
+       "ooui-selectfile-placeholder": "Failua ei ole vallittu",
+       "ooui-selectfile-dragdrop-placeholder": "Kirvota failu täh"
+}
index 8379cac..8d9071a 100644 (file)
@@ -10,7 +10,8 @@
                        "Jdforrester",
                        "Luckas",
                        "Vitorvicentevalente",
-                       "SandroHc"
+                       "SandroHc",
+                       "Jkb8"
                ]
        },
        "ooui-outline-control-move-down": "Mover item para baixo",
@@ -27,5 +28,5 @@
        "ooui-dialog-process-continue": "Continuar",
        "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 (ou clicar para navegar)"
+       "ooui-selectfile-dragdrop-placeholder": "Soltar ficheiro aqui"
 }
index cd9c0c2..1a096ef 100644 (file)
@@ -35,6 +35,5 @@
        "ooui-selectfile-button-select": "Label for the file selection widget's select file button",
        "ooui-selectfile-not-supported": "Label for the file selection widget if file selection is not supported",
        "ooui-selectfile-placeholder": "Label for the file selection widget when no file is currently selected",
-       "ooui-selectfile-dragdrop-placeholder": "Label for the file selection widget's drop target",
-       "ooui-semicolon-separator": "{{optional}} Semicolon used as a separator"
+       "ooui-selectfile-dragdrop-placeholder": "Label for the file selection widget's drop target"
 }
index 1ccc67b..ddd27c5 100644 (file)
@@ -9,9 +9,14 @@
        "ooui-outline-control-move-down": "Sposta in baso",
        "ooui-outline-control-move-up": "Sposta in sima",
        "ooui-toolbar-more": "Altro",
+       "ooui-toolgroup-expand": "Piassè",
+       "ooui-toolgroup-collapse": "Manco",
        "ooui-dialog-message-accept": "Va ben",
+       "ooui-dialog-message-reject": "Fa gnente",
        "ooui-dialog-process-error": "Xe 'ndà storto calcossa",
        "ooui-dialog-process-dismiss": "Scondi",
        "ooui-dialog-process-retry": "Proa da novo",
-       "ooui-dialog-process-continue": "Và vanti"
+       "ooui-dialog-process-continue": "Và vanti",
+       "ooui-selectfile-button-select": "Siegli un file",
+       "ooui-selectfile-dragdrop-placeholder": "Mola zo el file chì rento"
 }
index ff14801..27cef23 100644 (file)
@@ -22,5 +22,5 @@
        "ooui-dialog-process-continue": "Tiếp tục",
        "ooui-selectfile-not-supported": "Không hỗ trợ việc chọn tập tin",
        "ooui-selectfile-placeholder": "Không có tập tin nào được chọn",
-       "ooui-selectfile-dragdrop-placeholder": "Thả tập tin vào đây (hoặc nhấn chuột để duyệt)"
+       "ooui-selectfile-dragdrop-placeholder": "Thả tập tin vào đây"
 }
index 7d4e710..629528d 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Deryck Chan",
                        "William915",
-                       "Shinjiman"
+                       "Shinjiman",
+                       "Ktchankt"
                ]
        },
        "ooui-outline-control-move-down": "向下搬",
        "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-placeholder": "無揀到文件",
+       "ooui-selectfile-dragdrop-placeholder": "放檔案響度"
 }
index ede6ea9..fdfbffb 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.8
+ * OOjs UI v0.12.10
  * 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-09-08T20:56:08Z
+ * Date: 2015-09-29T21:20:47Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        right: 18em;
        bottom: 18em;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
        width: 0 !important;
        height: 0 !important;
        overflow: hidden;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
        top: 0 !important;
        left: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
        width: auto !important;
        left: 0;
        top: 0;
        right: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
        right: 0 !important;
        bottom: 0 !important;
        left: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
        height: auto !important;
        top: 0;
        right: 0;
        bottom: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
        bottom: 0 !important;
        left: 0 !important;
        top: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
        width: auto !important;
        right: 0;
        bottom: 0;
        left: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
        left: 0 !important;
        top: 0 !important;
        right: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
        height: auto !important;
        bottom: 0;
        left: 0;
        top: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
        top: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
        display: inline;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link {
+       outline: 0;
        cursor: default;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
        border-left-color: rgba(0, 0, 0, 0.1);
 }
+.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link:focus {
+       outline: 0;
+}
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled:hover > .oo-ui-tool-link .oo-ui-iconElement-icon {
        opacity: 1;
 }
+.oo-ui-barToolGroup.oo-ui-widget-disabled > .oo-ui-toolGroup-tools > .oo-ui-tool:focus {
+       outline: 0;
+}
+.oo-ui-barToolGroup.oo-ui-widget-disabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link:focus {
+       outline: 0;
+}
 .oo-ui-barToolGroup.oo-ui-widget-disabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
        position: absolute;
 }
 .oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       outline: 0;
        cursor: default;
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
        background-color: transparent;
 }
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-       padding-left: 2em;
-}
 .oo-ui-textInputWidget-icon {
        width: 2em;
 }
 }
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2em;
+       padding-left: 2.475em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        width: 1.875em;
-       margin-left: 0.1em;
+       margin-left: 0.3em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 1.5em;
+       padding-right: 2.4875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
        color: #888888;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
-       margin-right: 1.6em;
+       margin-right: 2.0875em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-       margin-left: 2.1em;
+       margin-left: 2.075em;
 }
 .oo-ui-menuSelectWidget {
        position: absolute;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle:focus {
+       outline: 0;
+}
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
        right: 0;
        text-overflow: ellipsis;
 }
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       float: right;
+}
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        right: 0;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
-       left: 0.25em;
+       left: 0;
 }
-.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        line-height: 2.3em;
        margin: 0;
        overflow: hidden;
        left: 0.5em;
        right: 0.5em;
 }
-.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       color: #888888;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        top: 0;
        width: 1.875em;
-       height: 1.875em;
-       margin: 0.3em;
+       margin-right: 0;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       height: 2.3em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        top: 0;
        width: 0.9375em;
-       height: 0.9375em;
-       margin: 0.775em;
+       height: 2.3em;
+       margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
        top: 0;
        width: 1.875em;
-       height: 1.875em;
-       margin: 0.3em;
+       height: 2.3em;
+       margin-left: 0.3em;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
        color: #cccccc;
        color: #cccccc;
 }
 .oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
-       left: 2.75em;
+       left: 2.475em;
 }
 .oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
-       right: 3em;
+       right: 2.175em;
 }
 .oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        right: 0;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
-       right: 5em;
+       right: 4.2625em;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
-       right: 2em;
+       right: 2.0875em;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
-       right: 1em;
+       right: 0.5em;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
index 83452d0..2e3c409 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.8
+ * OOjs UI v0.12.10
  * 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-09-08T20:55:55Z
+ * Date: 2015-09-29T21:20:38Z
  */
 /**
  * @class
index 87ae9a5..e4e0d36 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.8
+ * OOjs UI v0.12.10
  * 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-09-08T20:56:08Z
+ * Date: 2015-09-29T21:20:47Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
        font-weight: bold;
+       text-decoration: none;
 }
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        margin-left: 0;
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
        height: 0.9375em;
-       margin: 0.46875em;
 }
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        margin-left: 0.46875em;
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        color: #cccccc;
 }
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus {
+       box-shadow: none;
+}
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+       padding-left: 2.4em;
+}
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        margin: 0.1em 0;
-       padding: 0.2em 0.8em;
+       padding: 0.5em 1em;
+       min-height: 1.2em;
+       min-width: 1em;
        border-radius: 2px;
+       position: relative;
        -webkit-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
           -moz-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
            -ms-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 1.875em;
+       line-height: 1.2em;
+       display: inline-block;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: -0.5em;
+       position: absolute;
+       top: 0.2em;
+       left: 0.5625em;
 }
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-right: 0.3em;
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       margin-left: 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;
+       display: inline-block;
 }
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        margin-left: 0.46875em;
        margin-right: -0.275em;
 }
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       position: relative;
+       left: 0.2em;
+}
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        color: #ffffff;
        background: #dddddd;
 .oo-ui-indexLayout-stackLayout > .oo-ui-panelLayout {
        padding: 1.5em;
 }
+.oo-ui-indexLayout > .oo-ui-menuLayout-menu {
+       height: 2.75em;
+}
+.oo-ui-indexLayout > .oo-ui-menuLayout-content {
+       top: 2.75em;
+}
 .oo-ui-fieldLayout {
        display: block;
        margin-bottom: 1em;
        right: 18em;
        bottom: 18em;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
        width: 0 !important;
        height: 0 !important;
        overflow: hidden;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
        top: 0 !important;
        left: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
        width: auto !important;
        left: 0;
        top: 0;
        right: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
        right: 0 !important;
        bottom: 0 !important;
        left: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
        height: auto !important;
        top: 0;
        right: 0;
        bottom: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
        bottom: 0 !important;
        left: 0 !important;
        top: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
        width: auto !important;
        right: 0;
        bottom: 0;
        left: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
        left: 0 !important;
        top: 0 !important;
        right: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
        height: auto !important;
        bottom: 0;
        left: 0;
        top: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
        top: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
        display: inline;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link {
+       outline: 0;
        cursor: default;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
        position: absolute;
 }
 .oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       outline: 0;
        cursor: default;
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
        display: inline-block;
        vertical-align: middle;
 }
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       height: 1.875em;
-}
 .oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        margin-top: 0;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        background: #dddddd;
        border-color: #dddddd;
+       outline: 0;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled .oo-ui-toggleSwitchWidget-grip {
        background: #ffffff;
        border: 1px solid #aaaaaa;
        border-radius: 0.2em;
        background-color: #ffffff;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+       box-shadow: 0 0.15em 0 0 rgba(204, 204, 204, 0.5);
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
        margin-top: 9px;
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
        background-color: transparent;
 }
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-       padding-left: 2em;
-}
 .oo-ui-textInputWidget-icon {
        width: 2em;
 }
 }
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2.75em;
+       padding-left: 2.875em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       left: 0.4em;
+       left: 0;
        width: 1.875em;
-       margin-left: 0.1em;
+       margin-left: 0.5em;
        height: 100%;
        background-position: right center;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 1.875em;
+       padding-right: 2.4875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
        color: #888888;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
-       margin-right: 2em;
+       margin-right: 2.0875em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-       margin-left: 2.5em;
+       margin-right: 2.475em;
 }
 .oo-ui-menuSelectWidget {
        position: absolute;
        margin-top: -1px;
        border: 1px solid #aaaaaa;
        border-radius: 0 0 0.2em 0.2em;
-       padding-bottom: 0.25em;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
+       box-shadow: 0 0.15em 0 0 rgba(204, 204, 204, 0.5);
 }
 .oo-ui-menuSelectWidget input {
        position: absolute;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle:focus {
+       outline: 0;
+}
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
        right: 0;
        text-overflow: ellipsis;
 }
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       float: right;
+}
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        right: 0;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
-       left: 0.25em;
+       left: 0;
 }
-.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        line-height: 2.3em;
        margin: 0;
        overflow: hidden;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        text-overflow: ellipsis;
-       left: 1em;
-       right: 1em;
+       left: 0.5em;
+       right: 0.5em;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       color: #888888;
 }
-.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        top: 0;
        width: 1.875em;
-       height: 1.875em;
-       margin: 0.3em;
+       margin-right: 0;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       height: 2.3em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        top: 0;
        width: 0.9375em;
-       height: 0.9375em;
-       margin: 0.775em;
+       height: 2.3em;
+       margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
        top: 0;
        width: 1.875em;
-       height: 1.875em;
-       margin: 0.3em;
+       height: 2.3em;
+       margin-left: 0.5em;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
        color: #cccccc;
        color: #cccccc;
 }
 .oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
-       left: 2.75em;
+       left: 2.875em;
 }
 .oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
-       right: 3em;
+       right: 2.375em;
 }
 .oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        right: 0;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
-       right: 5em;
+       right: 4.4625em;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
-       right: 2em;
+       right: 2.0875em;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
-       right: 1em;
+       right: 0.5em;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        font-weight: bold;
        line-height: 1.875em;
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       min-width: 1.875em;
-       min-height: 1.875em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-       line-height: 1.875em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       margin-top: -0.125em;
-}
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.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;
+       margin: 0.5em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
        padding: 0.75em 1em;
        vertical-align: middle;
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-labelElement-label {
+       line-height: 1.875em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless:hover {
        background-color: rgba(0, 0, 0, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless:active {
        background-color: rgba(0, 0, 0, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover {
        background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active {
        background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
        font-weight: bold;
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
        background-color: rgba(118, 171, 54, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
        background-color: rgba(118, 171, 54, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:hover {
        background-color: rgba(212, 83, 83, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:active {
        background-color: rgba(212, 83, 83, 0.1);
 }
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement {
index a291570..4c6c77c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.8
+ * OOjs UI v0.12.10
  * 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-09-08T20:55:55Z
+ * Date: 2015-09-29T21:20:38Z
  */
 /**
  * @class
index 81677ed..1a7d406 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.8
+ * OOjs UI v0.12.10
  * 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-09-08T20:55:55Z
+ * Date: 2015-09-29T21:20:38Z
  */
 ( function ( OO ) {
 
@@ -67,30 +67,79 @@ OO.ui.generateElementId = function () {
  * @return {boolean}
  */
 OO.ui.isFocusableElement = function ( $element ) {
-       var node = $element[ 0 ],
-               nodeName = node.nodeName.toLowerCase(),
-               // Check if the element have tabindex set
-               isInElementGroup = /^(input|select|textarea|button|object)$/.test( nodeName ),
-               // Check if the element is a link with href or if it has tabindex
-               isOtherElement = (
-                       ( nodeName === 'a' && node.href ) ||
-                       !isNaN( $element.attr( 'tabindex' ) )
-               ),
-               // Check if the element is visible
-               isVisible = (
-                       // This is quicker than calling $element.is( ':visible' )
-                       $.expr.filters.visible( node ) &&
-                       // Check that all parents are visible
-                       !$element.parents().addBack().filter( function () {
-                               return $.css( this, 'visibility' ) === 'hidden';
-                       } ).length
-               ),
-               isTabOk = isNaN( $element.attr( 'tabindex' ) ) || +$element.attr( 'tabindex' ) >= 0;
+       var nodeName,
+               element = $element[ 0 ];
 
-       return (
-               ( isInElementGroup ? !node.disabled : isOtherElement ) &&
-               isVisible && isTabOk
-       );
+       // Anything disabled is not focusable
+       if ( element.disabled ) {
+               return false;
+       }
+
+       // Check if the element is visible
+       if ( !(
+               // This is quicker than calling $element.is( ':visible' )
+               $.expr.filters.visible( element ) &&
+               // Check that all parents are visible
+               !$element.parents().addBack().filter( function () {
+                       return $.css( this, 'visibility' ) === 'hidden';
+               } ).length
+       ) ) {
+               return false;
+       }
+
+       // Check if the element is ContentEditable, which is the string 'true'
+       if ( element.contentEditable === 'true' ) {
+               return true;
+       }
+
+       // Anything with a non-negative numeric tabIndex is focusable.
+       // Use .prop to avoid browser bugs
+       if ( $element.prop( 'tabIndex' ) >= 0 ) {
+               return true;
+       }
+
+       // Some element types are naturally focusable
+       // (indexOf is much faster than regex in Chrome and about the
+       // same in FF: https://jsperf.com/regex-vs-indexof-array2)
+       nodeName = element.nodeName.toLowerCase();
+       if ( [ 'input', 'select', 'textarea', 'button', 'object' ].indexOf( nodeName ) !== -1 ) {
+               return true;
+       }
+
+       // Links and areas are focusable if they have an href
+       if ( ( nodeName === 'a' || nodeName === 'area' ) && $element.attr( 'href' ) !== undefined ) {
+               return true;
+       }
+
+       return false;
+};
+
+/**
+ * Find a focusable child
+ *
+ * @param {jQuery} $container Container to search in
+ * @param {boolean} [backwards] Search backwards
+ * @return {jQuery} Focusable child, an empty jQuery object if none found
+ */
+OO.ui.findFocusable = function ( $container, backwards ) {
+       var $focusable = $( [] ),
+               // $focusableCandidates is a superset of things that
+               // could get matched by isFocusableElement
+               $focusableCandidates = $container
+                       .find( 'input, select, textarea, button, object, a, area, [contenteditable], [tabindex]' );
+
+       if ( backwards ) {
+               $focusableCandidates = Array.prototype.reverse.call( $focusableCandidates );
+       }
+
+       $focusableCandidates.each( function () {
+               var $this = $( this );
+               if ( OO.ui.isFocusableElement( $this ) ) {
+                       $focusable = $this;
+                       return false;
+               }
+       } );
+       return $focusable;
 };
 
 /**
@@ -286,9 +335,7 @@ OO.ui.infuse = function ( idOrNode ) {
                // Label for the file selection widget when no file is currently selected
                'ooui-selectfile-placeholder': 'No file is selected',
                // Label for the file selection widget's drop target
-               'ooui-selectfile-dragdrop-placeholder': 'Drop file here',
-               // Semicolon separator
-               'ooui-semicolon-separator': '; '
+               'ooui-selectfile-dragdrop-placeholder': 'Drop file here'
        };
 
        /**
@@ -1960,7 +2007,8 @@ OO.ui.Widget.static.supportsSimpleLabel = false;
 /**
  * @event disable
  *
- * A 'disable' event is emitted when a widget is disabled.
+ * A 'disable' event is emitted when the disabled state of the widget changes
+ * (i.e. on disable **and** enable).
  *
  * @param {boolean} disabled Widget is disabled
  */
@@ -2081,6 +2129,10 @@ OO.ui.Window = function OoUiWindow( config ) {
        this.$overlay = $( '<div>' );
        this.$content = $( '<div>' );
 
+       this.$focusTrapBefore = $( '<div>' ).prop( 'tabIndex', 0 );
+       this.$focusTrapAfter = $( '<div>' ).prop( 'tabIndex', 0 );
+       this.$focusTraps = this.$focusTrapBefore.add( this.$focusTrapAfter );
+
        // Initialization
        this.$overlay.addClass( 'oo-ui-window-overlay' );
        this.$content
@@ -2088,7 +2140,7 @@ OO.ui.Window = function OoUiWindow( config ) {
                .attr( 'tabindex', 0 );
        this.$frame
                .addClass( 'oo-ui-window-frame' )
-               .append( this.$content );
+               .append( this.$focusTrapBefore, this.$content, this.$focusTrapAfter );
 
        this.$element
                .addClass( 'oo-ui-window' )
@@ -2521,6 +2573,21 @@ OO.ui.Window.prototype.initialize = function () {
        return this;
 };
 
+/**
+ * Called when someone tries to focus the hidden element at the end of the dialog.
+ * Sends focus back to the start of the dialog.
+ *
+ * @param {jQuery.Event} event Focus event
+ */
+OO.ui.Window.prototype.onFocusTrapFocused = function ( event ) {
+       if ( this.$focusTrapBefore.is( event.target ) ) {
+               OO.ui.findFocusable( this.$content, true ).focus();
+       } else {
+               // this.$content is the part of the focus cycle, and is the first focusable element
+               this.$content.focus();
+       }
+};
+
 /**
  * Open the window.
  *
@@ -2581,6 +2648,9 @@ OO.ui.Window.prototype.setup = function ( data ) {
 
        this.toggle( true );
 
+       this.focusTrapHandler = OO.ui.bind( this.onFocusTrapFocused, this );
+       this.$focusTraps.on( 'focus', this.focusTrapHandler );
+
        this.getSetupProcess( data ).execute().done( function () {
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.addClass( 'oo-ui-window-active oo-ui-window-setup' ).width();
@@ -2663,6 +2733,7 @@ OO.ui.Window.prototype.teardown = function ( data ) {
                        // 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 );
                } );
 };
@@ -6754,6 +6825,163 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        return this;
 };
 
+/**
+ * Element that will stick under a specified container, even when it is inserted elsewhere in the
+ * document (for example, in a OO.ui.Window's $overlay).
+ *
+ * The elements's position is automatically calculated and maintained when window is resized or the
+ * page is scrolled. If you reposition the container manually, you have to call #position to make
+ * sure the element is still placed correctly.
+ *
+ * As positioning is only possible when both the element and the container are attached to the DOM
+ * and visible, it's only done after you call #togglePositioning. You might want to do this inside
+ * the #toggle method to display a floating popup, for example.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$floatable] Node to position, assigned to #$floatable, omit to use #$element
+ * @cfg {jQuery} [$floatableContainer] Node to position below
+ */
+OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$floatable = null;
+       this.$floatableContainer = null;
+       this.$floatableWindow = null;
+       this.$floatableClosestScrollable = null;
+       this.onFloatableScrollHandler = this.position.bind( this );
+       this.onFloatableWindowResizeHandler = this.position.bind( this );
+
+       // Initialization
+       this.setFloatableContainer( config.$floatableContainer );
+       this.setFloatableElement( config.$floatable || this.$element );
+};
+
+/* Methods */
+
+/**
+ * Set floatable element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $floatable Element to make floatable
+ */
+OO.ui.mixin.FloatableElement.prototype.setFloatableElement = function ( $floatable ) {
+       if ( this.$floatable ) {
+               this.$floatable.removeClass( 'oo-ui-floatableElement-floatable' );
+               this.$floatable.css( { left: '', top: '' } );
+       }
+
+       this.$floatable = $floatable.addClass( 'oo-ui-floatableElement-floatable' );
+       this.position();
+};
+
+/**
+ * Set floatable container.
+ *
+ * The element will be always positioned under the specified container.
+ *
+ * @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset
+ */
+OO.ui.mixin.FloatableElement.prototype.setFloatableContainer = function ( $floatableContainer ) {
+       this.$floatableContainer = $floatableContainer;
+       if ( this.$floatable ) {
+               this.position();
+       }
+};
+
+/**
+ * Toggle positioning.
+ *
+ * Do not turn positioning on until after the element is attached to the DOM and visible.
+ *
+ * @param {boolean} [positioning] Enable positioning, omit to toggle
+ * @chainable
+ */
+OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positioning ) {
+       var closestScrollableOfContainer, closestScrollableOfFloatable;
+
+       positioning = positioning === undefined ? !this.positioning : !!positioning;
+
+       if ( this.positioning !== positioning ) {
+               this.positioning = positioning;
+
+               closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
+               closestScrollableOfFloatable = OO.ui.Element.static.getClosestScrollableContainer( this.$floatable[ 0 ] );
+               if ( closestScrollableOfContainer !== closestScrollableOfFloatable ) {
+                       // If the scrollable is the root, we have to listen to scroll events
+                       // on the window because of browser inconsistencies (or do we? someone should verify this)
+                       if ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {
+                               closestScrollableOfContainer = OO.ui.Element.static.getWindow( closestScrollableOfContainer );
+                       }
+               }
+
+               if ( positioning ) {
+                       this.$floatableWindow = $( this.getElementWindow() );
+                       this.$floatableWindow.on( 'resize', this.onFloatableWindowResizeHandler );
+
+                       if ( closestScrollableOfContainer !== closestScrollableOfFloatable ) {
+                               this.$floatableClosestScrollable = $( closestScrollableOfContainer );
+                               this.$floatableClosestScrollable.on( 'scroll', this.onFloatableScrollHandler );
+                       }
+
+                       // Initial position after visible
+                       this.position();
+               } else {
+                       if ( this.$floatableWindow ) {
+                               this.$floatableWindow.off( 'resize', this.onFloatableWindowResizeHandler );
+                               this.$floatableWindow = null;
+                       }
+
+                       if ( this.$floatableClosestScrollable ) {
+                               this.$floatableClosestScrollable.off( 'scroll', this.onFloatableScrollHandler );
+                               this.$floatableClosestScrollable = null;
+                       }
+
+                       this.$floatable.css( { left: '', top: '' } );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Position the floatable below its container.
+ *
+ * This should only be done when both of them are attached to the DOM and visible.
+ *
+ * @chainable
+ */
+OO.ui.mixin.FloatableElement.prototype.position = function () {
+       var pos;
+
+       if ( !this.positioning ) {
+               return this;
+       }
+
+       pos = OO.ui.Element.static.getRelativePosition( this.$floatableContainer, this.$floatable.offsetParent() );
+
+       // Position under container
+       pos.top += this.$floatableContainer.height();
+       this.$floatable.css( pos );
+
+       // We updated the position, so re-evaluate the clipping state.
+       // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
+       // will not notice the need to update itself.)
+       // TODO: This is terrible, we shouldn't need to know about ClippableElement at all here. Why does
+       // it not listen to the right events in the right places?
+       if ( this.clip ) {
+               this.clip();
+       }
+
+       return this;
+};
+
 /**
  * AccessKeyedElement is mixed into other classes to provide an `accesskey` attribute.
  * Accesskeys allow an user to go to a specific element by using
@@ -8182,7 +8410,6 @@ OO.ui.MessageDialog.prototype.onResize = function () {
 /**
  * Toggle action layout between vertical and horizontal.
  *
- *
  * @private
  * @param {boolean} [value] Layout actions vertically, omit to toggle
  * @chainable
@@ -8998,7 +9225,6 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
  *
  *     $( 'body' ).append( actionFieldLayout.$element );
  *
- *
  * @class
  * @extends OO.ui.FieldLayout
  *
@@ -9589,7 +9815,7 @@ OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
  * @param {number} [itemIndex] A specific item to focus on
  */
 OO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {
-       var $input, page,
+       var page,
                items = this.stackLayout.getItems();
 
        if ( itemIndex !== undefined && items[ itemIndex ] ) {
@@ -9607,10 +9833,7 @@ OO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {
        }
        // Only change the focus if is not already in the current page
        if ( !page.$element.find( ':focus' ).length ) {
-               $input = page.$element.find( ':input:first' );
-               if ( $input.length ) {
-                       $input[ 0 ].focus();
-               }
+               OO.ui.findFocusable( page.$element ).focus();
        }
 };
 
@@ -9619,28 +9842,7 @@ OO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {
  * on it.
  */
 OO.ui.BookletLayout.prototype.focusFirstFocusable = function () {
-       var i, len,
-               found = false,
-               items = this.stackLayout.getItems(),
-               checkAndFocus = function () {
-                       if ( OO.ui.isFocusableElement( $( this ) ) ) {
-                               $( this ).focus();
-                               found = true;
-                               return false;
-                       }
-               };
-
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               if ( found ) {
-                       break;
-               }
-               // Find all potentially focusable elements in the item
-               // and check if they are focusable
-               items[ i ].$element
-                       .find( 'input, select, textarea, button, object' )
-                       /* jshint loopfunc:true */
-                       .each( checkAndFocus );
-       }
+       OO.ui.findFocusable( this.stackLayout.$element ).focus();
 };
 
 /**
@@ -9908,7 +10110,8 @@ OO.ui.BookletLayout.prototype.clearPages = function () {
 OO.ui.BookletLayout.prototype.setPage = function ( name ) {
        var selectedItem,
                $focused,
-               page = this.pages[ name ];
+               page = this.pages[ name ],
+               previousPage = this.currentPageName && this.pages[ this.currentPageName ];
 
        if ( name !== this.currentPageName ) {
                if ( this.outlined ) {
@@ -9918,21 +10121,34 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
                        }
                }
                if ( page ) {
-                       if ( this.currentPageName && this.pages[ this.currentPageName ] ) {
-                               this.pages[ this.currentPageName ].setActive( false );
-                               // Blur anything focused if the next page doesn't have anything focusable - this
-                               // is not needed if the next page has something focusable because once it is focused
-                               // this blur happens automatically
-                               if ( this.autoFocus && !page.$element.find( ':input' ).length ) {
-                                       $focused = this.pages[ this.currentPageName ].$element.find( ':focus' );
+                       if ( previousPage ) {
+                               previousPage.setActive( false );
+                               // Blur anything focused if the next page doesn't have anything focusable.
+                               // This is not needed if the next page has something focusable (because once it is focused
+                               // this blur happens automatically). If the layout is non-continuous, this check is
+                               // meaningless because the next page is not visible yet and thus can't hold focus.
+                               if (
+                                       this.autoFocus &&
+                                       this.stackLayout.continuous &&
+                                       OO.ui.findFocusable( page.$element ).length !== 0
+                               ) {
+                                       $focused = previousPage.$element.find( ':focus' );
                                        if ( $focused.length ) {
                                                $focused[ 0 ].blur();
                                        }
                                }
                        }
                        this.currentPageName = name;
-                       this.stackLayout.setItem( page );
                        page.setActive( true );
+                       this.stackLayout.setItem( page );
+                       if ( !this.stackLayout.continuous && previousPage ) {
+                               // This should not be necessary, since any inputs on the previous page should have been
+                               // blurred when it was hidden, but browsers are not very consistent about this.
+                               $focused = previousPage.$element.find( ':focus' );
+                               if ( $focused.length ) {
+                                       $focused[ 0 ].blur();
+                               }
+                       }
                        this.emit( 'set', page );
                }
        }
@@ -9969,20 +10185,13 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
  *     }
  *     OO.inheritClass( CardOneLayout, OO.ui.CardLayout );
  *     CardOneLayout.prototype.setupTabItem = function () {
- *         this.tabItem.setLabel( 'Card One' );
- *     };
- *
- *     function CardTwoLayout( name, config ) {
- *         CardTwoLayout.parent.call( this, name, config );
- *         this.$element.append( '<p>Second card</p>' );
- *     }
- *     OO.inheritClass( CardTwoLayout, OO.ui.CardLayout );
- *     CardTwoLayout.prototype.setupTabItem = function () {
- *         this.tabItem.setLabel( 'Card Two' );
+ *         this.tabItem.setLabel( 'Card one' );
  *     };
  *
  *     var card1 = new CardOneLayout( 'one' ),
- *         card2 = new CardTwoLayout( 'two' );
+ *         card2 = new CardLayout( 'two', { label: 'Card two' } );
+ *
+ *     card2.$element.append( '<p>Second card</p>' );
  *
  *     var index = new OO.ui.IndexLayout();
  *
@@ -9995,6 +10204,7 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [continuous=false] Show all cards, one after another
+ * @cfg {boolean} [expanded=true] Expand the content panel to fill the entire parent element.
  * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed.
  */
 OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
@@ -10008,7 +10218,10 @@ OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
        this.currentCardName = null;
        this.cards = {};
        this.ignoreFocus = false;
-       this.stackLayout = new OO.ui.StackLayout( { continuous: !!config.continuous } );
+       this.stackLayout = new OO.ui.StackLayout( {
+               continuous: !!config.continuous,
+               expanded: config.expanded
+       } );
        this.$content.append( this.stackLayout.$element );
        this.autoFocus = config.autoFocus === undefined || !!config.autoFocus;
 
@@ -10109,7 +10322,7 @@ OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
  * @param {number} [itemIndex] A specific item to focus on
  */
 OO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {
-       var $input, card,
+       var card,
                items = this.stackLayout.getItems();
 
        if ( itemIndex !== undefined && items[ itemIndex ] ) {
@@ -10127,10 +10340,7 @@ OO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {
        }
        // Only change the focus if is not already in the current card
        if ( !card.$element.find( ':focus' ).length ) {
-               $input = card.$element.find( ':input:first' );
-               if ( $input.length ) {
-                       $input[ 0 ].focus();
-               }
+               OO.ui.findFocusable( card.$element ).focus();
        }
 };
 
@@ -10139,27 +10349,7 @@ OO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {
  * on it.
  */
 OO.ui.IndexLayout.prototype.focusFirstFocusable = function () {
-       var i, len,
-               found = false,
-               items = this.stackLayout.getItems(),
-               checkAndFocus = function () {
-                       if ( OO.ui.isFocusableElement( $( this ) ) ) {
-                               $( this ).focus();
-                               found = true;
-                               return false;
-                       }
-               };
-
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               if ( found ) {
-                       break;
-               }
-               // Find all potentially focusable elements in the item
-               // and check if they are focusable
-               items[ i ].$element
-                       .find( 'input, select, textarea, button, object' )
-                       .each( checkAndFocus );
-       }
+       OO.ui.findFocusable( this.stackLayout.$element ).focus();
 };
 
 /**
@@ -10363,7 +10553,8 @@ OO.ui.IndexLayout.prototype.clearCards = function () {
 OO.ui.IndexLayout.prototype.setCard = function ( name ) {
        var selectedItem,
                $focused,
-               card = this.cards[ name ];
+               card = this.cards[ name ],
+               previousCard = this.currentCardName && this.cards[ this.currentCardName ];
 
        if ( name !== this.currentCardName ) {
                selectedItem = this.tabSelectWidget.getSelectedItem();
@@ -10371,21 +10562,34 @@ OO.ui.IndexLayout.prototype.setCard = function ( name ) {
                        this.tabSelectWidget.selectItemByData( name );
                }
                if ( card ) {
-                       if ( this.currentCardName && this.cards[ this.currentCardName ] ) {
-                               this.cards[ this.currentCardName ].setActive( false );
-                               // Blur anything focused if the next card doesn't have anything focusable - this
-                               // is not needed if the next card has something focusable because once it is focused
-                               // this blur happens automatically
-                               if ( this.autoFocus && !card.$element.find( ':input' ).length ) {
-                                       $focused = this.cards[ this.currentCardName ].$element.find( ':focus' );
+                       if ( previousCard ) {
+                               previousCard.setActive( false );
+                               // Blur anything focused if the next card doesn't have anything focusable.
+                               // This is not needed if the next card has something focusable (because once it is focused
+                               // this blur happens automatically). If the layout is non-continuous, this check is
+                               // meaningless because the next card is not visible yet and thus can't hold focus.
+                               if (
+                                       this.autoFocus &&
+                                       this.stackLayout.continuous &&
+                                       OO.ui.findFocusable( card.$element ).length !== 0
+                               ) {
+                                       $focused = previousCard.$element.find( ':focus' );
                                        if ( $focused.length ) {
                                                $focused[ 0 ].blur();
                                        }
                                }
                        }
                        this.currentCardName = name;
-                       this.stackLayout.setItem( card );
                        card.setActive( true );
+                       this.stackLayout.setItem( card );
+                       if ( !this.stackLayout.continuous && previousCard ) {
+                               // This should not be necessary, since any inputs on the previous card should have been
+                               // blurred when it was hidden, but browsers are not very consistent about this.
+                               $focused = previousCard.$element.find( ':focus' );
+                               if ( $focused.length ) {
+                                       $focused[ 0 ].blur();
+                               }
+                       }
                        this.emit( 'set', card );
                }
        }
@@ -10475,6 +10679,7 @@ OO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );
  * @constructor
  * @param {string} name Unique symbolic name of card
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery|string|Function|OO.ui.HtmlSnippet} [label] Label for card's tab
  */
 OO.ui.CardLayout = function OoUiCardLayout( name, config ) {
        // Allow passing positional parameters inside the config object
@@ -10491,6 +10696,7 @@ OO.ui.CardLayout = function OoUiCardLayout( name, config ) {
 
        // Properties
        this.name = name;
+       this.label = config.label;
        this.tabItem = null;
        this.active = false;
 
@@ -10576,6 +10782,9 @@ OO.ui.CardLayout.prototype.setTabItem = function ( tabItem ) {
  * @chainable
  */
 OO.ui.CardLayout.prototype.setupTabItem = function () {
+       if ( this.label ) {
+               this.tabItem.setLabel( this.label );
+       }
        return this;
 };
 
@@ -11310,8 +11519,8 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
                        }
                        if ( this.isClippedHorizontally() ) {
                                // Anchoring to the right also caused the popup to clip, so just make it fill the container
-                               containerWidth = this.$clippableContainer.width();
-                               containerLeft = this.$clippableContainer.offset().left;
+                               containerWidth = this.$clippableScrollableContainer.width();
+                               containerLeft = this.$clippableScrollableContainer.offset().left;
 
                                this.toggleClipping( false );
                                this.$element.removeClass( 'oo-ui-popupToolGroup-right' );
@@ -12119,7 +12328,6 @@ OO.ui.OutlineControlsWidget.prototype.setAbilities = function ( abilities ) {
 };
 
 /**
- *
  * @private
  * Handle outline change events.
  */
@@ -13031,6 +13239,18 @@ OO.mixinClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.mixin.IconElement );
 
 /* Methods */
 
+/**
+ * Construct a OO.ui.CapsuleItemWidget (or a subclass thereof) from given label and data.
+ *
+ * @protected
+ * @param {Mixed} data Custom data of any type.
+ * @param {string} label The label text.
+ * @return {OO.ui.CapsuleItemWidget}
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.createItemWidget = function ( data, label ) {
+       return new OO.ui.CapsuleItemWidget( { data: data, label: label } );
+};
+
 /**
  * Get the data of the items in the capsule
  * @return {Mixed[]}
@@ -13071,7 +13291,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.setItemsFromData = function ( datas ) {
                        }
                }
                if ( !item ) {
-                       item = new OO.ui.CapsuleItemWidget( { data: data, label: label } );
+                       item = widget.createItemWidget( data, label );
                }
                widget.addItems( [ item ], i );
        } );
@@ -13100,9 +13320,9 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItemsFromData = function ( datas ) {
                if ( !widget.getItemFromData( data ) ) {
                        item = menu.getItemFromData( data );
                        if ( item ) {
-                               items.push( new OO.ui.CapsuleItemWidget( { data: data, label: item.label } ) );
+                               items.push( widget.createItemWidget( data, item.label ) );
                        } else if ( widget.allowArbitrary ) {
-                               items.push( new OO.ui.CapsuleItemWidget( { data: data, label: String( data ) } ) );
+                               items.push( widget.createItemWidget( data, String( data ) ) );
                        }
                }
        } );
@@ -13469,7 +13689,6 @@ OO.ui.CapsuleItemWidget = function OoUiCapsuleItemWidget( config ) {
                keydown: this.onCloseKeyDown.bind( this ),
                click: this.onCloseClick.bind( this )
        } );
-       this.$element.on( 'click', false );
 
        // Initialization
        this.$element
@@ -13549,6 +13768,10 @@ OO.ui.CapsuleItemWidget.prototype.onCloseKeyDown = function ( e ) {
  *
  *     $( 'body' ).append( dropDown.$element );
  *
+ *     dropDown.getMenu().selectItemByData( 'b' );
+ *
+ *     dropDown.getMenu().getSelectedItem().getData(); // returns 'b'
+ *
  * For more information, please see the [OOjs UI documentation on MediaWiki] [1].
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
@@ -13870,6 +14093,7 @@ OO.ui.SelectFileWidget.prototype.setValue = function ( file ) {
  * @protected
  */
 OO.ui.SelectFileWidget.prototype.updateUI = function () {
+       var $label;
        if ( !this.isSupported ) {
                this.$element.addClass( 'oo-ui-selectFileWidget-notsupported' );
                this.$element.removeClass( 'oo-ui-selectFileWidget-empty' );
@@ -13878,9 +14102,12 @@ OO.ui.SelectFileWidget.prototype.updateUI = function () {
                this.$element.addClass( 'oo-ui-selectFileWidget-supported' );
                if ( this.currentFile ) {
                        this.$element.removeClass( 'oo-ui-selectFileWidget-empty' );
-                       this.setLabel( this.currentFile.name +
-                               ( this.currentFile.type !== '' ? OO.ui.msg( 'ooui-semicolon-separator' ) + this.currentFile.type : '' )
-                       );
+                       $label = $( [] );
+                       if ( this.currentFile.type !== '' ) {
+                               $label = $label.add( $( '<span>' ).addClass( 'oo-ui-selectFileWidget-fileType' ).text( this.currentFile.type ) );
+                       }
+                       $label = $label.add( $( '<span>' ).text( this.currentFile.name ) );
+                       this.setLabel( $label );
                } else {
                        this.$element.addClass( 'oo-ui-selectFileWidget-empty' );
                        this.setLabel( this.placeholder );
@@ -16026,7 +16253,6 @@ OO.ui.ComboBoxWidget.prototype.onInputChange = function ( value ) {
 /**
  * Handle mouse click events.
  *
- *
  * @private
  * @param {jQuery.Event} e Mouse click event
  */
@@ -16041,7 +16267,6 @@ OO.ui.ComboBoxWidget.prototype.onClick = function ( e ) {
 /**
  * Handle key press events.
  *
- *
  * @private
  * @param {jQuery.Event} e Key press event
  */
@@ -16134,7 +16359,6 @@ OO.ui.ComboBoxWidget.prototype.setDisabled = function ( disabled ) {
  *     ] );
  *     $( 'body' ).append( fieldset.$element );
  *
- *
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.LabelElement
@@ -16644,7 +16868,6 @@ OO.ui.MenuOptionWidget.static.scrollIntoViewOnSelect = true;
  *     } );
  *     $( 'body' ).append( myDropdown.$element );
  *
- *
  * @class
  * @extends OO.ui.DecoratedOptionWidget
  *
@@ -16854,6 +17077,7 @@ OO.ui.TabOptionWidget.static.highlightable = false;
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.LabelElement
+ * @mixins OO.ui.mixin.ClippableElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -17443,8 +17667,10 @@ OO.ui.SearchWidget.prototype.onQueryChange = function () {
  * @param {string} value New value
  */
 OO.ui.SearchWidget.prototype.onQueryEnter = function () {
-       // Reset
-       this.results.chooseItem( this.results.getHighlightedItem() );
+       var highlightedItem = this.results.getHighlightedItem();
+       if ( highlightedItem ) {
+               this.results.chooseItem( highlightedItem );
+       }
 };
 
 /**
@@ -18166,8 +18392,10 @@ OO.ui.SelectWidget.prototype.pressItem = function ( item ) {
  * @chainable
  */
 OO.ui.SelectWidget.prototype.chooseItem = function ( item ) {
-       this.selectItem( item );
-       this.emit( 'choose', item );
+       if ( item ) {
+               this.selectItem( item );
+               this.emit( 'choose', item );
+       }
 
        return this;
 };
@@ -18748,6 +18976,7 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
  *
  * @class
  * @extends OO.ui.MenuSelectWidget
+ * @mixins OO.ui.mixin.FloatableElement
  *
  * @constructor
  * @param {OO.ui.Widget} [inputWidget] Widget to provide the menu for.
@@ -18768,10 +18997,12 @@ OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWid
        // Parent constructor
        OO.ui.FloatingMenuSelectWidget.parent.call( this, config );
 
-       // Properties
+       // Properties (must be set before mixin constructors)
        this.inputWidget = inputWidget; // For backwards compatibility
        this.$container = config.$container || this.inputWidget.$element;
-       this.onWindowResizeHandler = this.onWindowResize.bind( this );
+
+       // Mixins constructors
+       OO.ui.mixin.FloatableElement.call( this, $.extend( {}, config, { $floatableContainer: this.$container } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-floatingMenuSelectWidget' );
@@ -18782,75 +19013,37 @@ OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWid
 /* Setup */
 
 OO.inheritClass( OO.ui.FloatingMenuSelectWidget, OO.ui.MenuSelectWidget );
+OO.mixinClass( OO.ui.FloatingMenuSelectWidget, OO.ui.mixin.FloatableElement );
 
 // For backwards compatibility
 OO.ui.TextInputMenuSelectWidget = OO.ui.FloatingMenuSelectWidget;
 
 /* Methods */
 
-/**
- * Handle window resize event.
- *
- * @private
- * @param {jQuery.Event} e Window resize event
- */
-OO.ui.FloatingMenuSelectWidget.prototype.onWindowResize = function () {
-       this.position();
-};
-
 /**
  * @inheritdoc
  */
 OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
        var change;
        visible = visible === undefined ? !this.isVisible() : !!visible;
-
        change = visible !== this.isVisible();
 
        if ( change && visible ) {
                // Make sure the width is set before the parent method runs.
-               // After this we have to call this.position(); again to actually
-               // position ourselves correctly.
-               this.position();
+               this.setIdealSize( this.$container.width() );
        }
 
        // Parent method
+       // This will call this.clip(), which is nonsensical since we're not positioned yet...
        OO.ui.FloatingMenuSelectWidget.parent.prototype.toggle.call( this, visible );
 
        if ( change ) {
-               if ( this.isVisible() ) {
-                       this.position();
-                       $( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
-               } else {
-                       $( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
-               }
+               this.togglePositioning( this.isVisible() );
        }
 
        return this;
 };
 
-/**
- * Position the menu.
- *
- * @private
- * @chainable
- */
-OO.ui.FloatingMenuSelectWidget.prototype.position = function () {
-       var $container = this.$container,
-               pos = OO.ui.Element.static.getRelativePosition( $container, this.$element.offsetParent() );
-
-       // Position under input
-       pos.top += $container.height();
-       this.$element.css( pos );
-
-       // Set width
-       this.setIdealSize( $container.width() );
-       // We updated the position, so re-evaluate the clipping state
-       this.clip();
-
-       return this;
-};
-
 /**
  * OutlineSelectWidget is a structured list that contains {@link OO.ui.OutlineOptionWidget outline options}
  * A set of controls can be provided with an {@link OO.ui.OutlineControlsWidget outline controls} widget.
@@ -19235,7 +19428,6 @@ OO.ui.NumberInputWidget.prototype.onWheel = function ( event ) {
 /**
  * Handle key down events.
  *
- *
  * @private
  * @param {jQuery.Event} e Key down event
  */
index 2043424..d680396 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/picture.png and b/resources/lib/oojs-ui/themes/apex/images/icons/picture.png differ
index 24d7315..246e130 100644 (file)
@@ -1,8 +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="picture">
-        <path id="frame" d="M18 4H6c-2-.007-3 .993-3 2.993L3.014 16C3 18 4 18.988 6 19h12c2-.012 2.994-1 3-3.006v-9c-.006-2-1-3-3-2.994zm1 13H5V6h14v11z"/>
-        <path id="mountains" d="M6 13.5L9.5 10l2.328 2.312-1.312 1.094.875 1.032L15.5 11l2.5 2v3H6z"/>
-        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172L15.5 9l2.5 2V7H6z"/>
+        <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>
index fb6b985..2eedd1e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/table.png and b/resources/lib/oojs-ui/themes/apex/images/icons/table.png differ
index 3c901f7..b5733fb 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="table-insert">
-        <path id="table" d="M4 5v13h16V5zm2 2h5v4H6zm7 0h5v4h-5zm-7 5h5v4H6zm7 0h5v4h-5z"/>
+        <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
 </svg>
index d6dc62c..f63756b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png differ
index be2c66d..a969967 100644 (file)
@@ -1,8 +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"><style>* { fill: #FFFFFF }</style>
     <g id="picture">
-        <path id="frame" d="M18 4H6c-2-.007-3 .993-3 2.993L3.014 16C3 18 4 18.988 6 19h12c2-.012 2.994-1 3-3.006v-9c-.006-2-1-3-3-2.994zm1 13H5V6h14v11z"/>
-        <path id="mountains" d="M6 13.5L9.5 10l2.328 2.312-1.312 1.094.875 1.032L15.5 11l2.5 2v3H6z"/>
-        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172L15.5 9l2.5 2V7H6z"/>
+        <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>
index 2043424..d680396 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png differ
index 24d7315..246e130 100644 (file)
@@ -1,8 +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="picture">
-        <path id="frame" d="M18 4H6c-2-.007-3 .993-3 2.993L3.014 16C3 18 4 18.988 6 19h12c2-.012 2.994-1 3-3.006v-9c-.006-2-1-3-3-2.994zm1 13H5V6h14v11z"/>
-        <path id="mountains" d="M6 13.5L9.5 10l2.328 2.312-1.312 1.094.875 1.032L15.5 11l2.5 2v3H6z"/>
-        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172L15.5 9l2.5 2V7H6z"/>
+        <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>
index 9cc620a..ee9885f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.png differ
index 246be85..808d8d8 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="table-insert">
-        <path id="table" d="M4 5v13h16V5zm2 2h5v4H6zm7 0h5v4h-5zm-7 5h5v4H6zm7 0h5v4h-5z"/>
+        <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
 </svg>
index fb6b985..2eedd1e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table.png differ
index 3c901f7..b5733fb 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="table-insert">
-        <path id="table" d="M4 5v13h16V5zm2 2h5v4H6zm7 0h5v4h-5zm-7 5h5v4H6zm7 0h5v4h-5z"/>
+        <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
 </svg>
index e1115d6..fd7e8d1 100644 (file)
@@ -10,11 +10,13 @@ var
        // Use a separate cache when match highlighting is enabled
        matchTextCache = {};
 
+// Due to <https://github.com/jscs-dev/jscs-jsdoc/issues/136>
+// jscs:disable jsDoc
 /**
  * Automatically truncate the plain text contents of an element and add an ellipsis
  *
  * @param {Object} options
- * @param {'center'|'left'|'right'} [options.position='center'] Where to remove text.
+ * @param {'left'|'center'|'right'} [options.position='center'] Where to remove text.
  * @param {boolean} [options.tooltip=false] Whether to show a tooltip with the remainder
  * of the text.
  * @param {boolean} [options.restoreText=false] Whether to save the text for restoring
@@ -159,6 +161,7 @@ $.fn.autoEllipsis = function ( options ) {
 
        } );
 };
+// jscs:enable jsDoc
 
 /**
  * @class jQuery
index 221e6bb..f9db72f 100644 (file)
@@ -40,7 +40,8 @@
                /**
                 * Sets the value of a property, and updates the widget accordingly
                 *
-                * @param {String} property Name of property
+                * @param {Object} context
+                * @param {string} property Name of property
                 * @param {Mixed} value Value to set property with
                 */
                configure: function ( context, property, value ) {
index 785b273..8d263fb 100644 (file)
                 * Depending on the action it either injects our listener into the methods, or
                 * reads from our tracker and records which methods have not been called by the test suite.
                 *
-                * @param {String|Null} currName Name of the given object member (Initially this is null).
-                * @param {mixed} currVar The variable to check (initially an object,
+                * @param {Mixed} currObj The variable to check (initially an object,
                 *  further down it could be anything).
+                * @param {string|null} currName Name of the given object member (Initially this is null).
                 * @param {Object} masterVariable Throughout our interation, always keep track of the master/root.
                 *  Initially this is the same as currVar.
                 * @param {Array} parentPathArray Array of names that indicate our breadcrumb path starting at
                 * was called during the test suite (as far as the tracker knows).
                 * If not it adds it to missingTests.
                 *
-                * @param {String} fnName
-                * @return {Boolean}
+                * @param {string} fnName
+                * @return {boolean}
                 */
                hasTest: function ( fnName ) {
                        if ( !( fnName in this.methodCallTracker ) ) {
                 * Injects a function (such as a spy that updates methodCallTracker when
                 * it's called) inside another function.
                 *
-                * @param {Object} masterVariable
-                * @param {Array} objectPathArray
-                * @param {Function} injectFn
+                * @param {Object} obj The object into which `injectFn` will be inserted
+                * @param {Array} key The key by which `injectFn` will be known in `obj`; if this already
+                *   exists, a wrapper will first call `injectFn` and then the original `obj[key]` function.
+                * @param {Function} injectFn The function to insert
                 */
                injectCheck: function ( obj, key, injectFn ) {
                        var spy,
index dc1c779..df6fff3 100644 (file)
  *
  * @class jQuery.plugin.suggestions
  */
+
 /**
  * @method suggestions
- * @return {jQuery}
  * @chainable
+ * @return {jQuery}
  *
  * @param {Object} options
  *
  * @param {boolean} [options.highlightInput=false] Whether to highlight matched portions of the
  *  input or not.
  */
-( function ( $ ) {
-
-var hasOwn = Object.hasOwnProperty;
-
-/**
- * Used by jQuery.plugin.suggestions.
- *
- * @class jQuery.suggestions
- * @singleton
- * @private
- */
-$.suggestions = {
-       /**
-        * Cancel any delayed maybeFetch() call and callback the context so
-        * they can cancel any async fetching if they use AJAX or something.
-        */
-       cancel: function ( context ) {
-               if ( context.data.timerID !== null ) {
-                       clearTimeout( context.data.timerID );
-               }
-               if ( $.isFunction( context.config.cancel ) ) {
-                       context.config.cancel.call( context.data.$textbox );
-               }
-       },
 
-       /**
-        * Hide the element with suggestions and clean up some state.
-        */
-       hide: function ( context ) {
-               // Remove any highlights, including on "special" items
-               context.data.$container.find( '.suggestions-result-current' ).removeClass( 'suggestions-result-current' );
-               // Hide the container
-               context.data.$container.hide();
-       },
+( function ( $ ) {
 
-       /**
-        * Restore the text the user originally typed in the textbox, before it
-        * was overwritten by highlight(). This restores the value the currently
-        * displayed suggestions are based on, rather than the value just before
-        * highlight() overwrote it; the former is arguably slightly more sensible.
-        */
-       restore: function ( context ) {
-               context.data.$textbox.val( context.data.prevText );
-       },
+       var hasOwn = Object.hasOwnProperty;
 
        /**
-        * Ask the user-specified callback for new suggestions. Any previous delayed
-        * call to this function still pending will be canceled. If the value in the
-        * textbox is empty or hasn't changed since the last time suggestions were fetched,
-        * this function does nothing.
+        * Used by jQuery.plugin.suggestions.
         *
-        * @param {boolean} delayed Whether or not to delay this by the currently configured amount of time
+        * @class jQuery.suggestions
+        * @singleton
+        * @private
         */
-       update: function ( context, delayed ) {
-               function maybeFetch() {
-                       var val = context.data.$textbox.val(),
-                               cache = context.data.cache,
-                               cacheHit;
-
-                       if ( typeof context.config.update.before === 'function' ) {
-                               context.config.update.before.call( context.data.$textbox );
+       $.suggestions = {
+               /**
+                * Cancel any delayed maybeFetch() call and callback the context so
+                * they can cancel any async fetching if they use AJAX or something.
+                *
+                * @param {Object} context
+                */
+               cancel: function ( context ) {
+                       if ( context.data.timerID !== null ) {
+                               clearTimeout( context.data.timerID );
                        }
-
-                       // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
-                       // if the textbox is empty then clear the result div, but leave other settings intouched
-                       if ( val.length === 0 ) {
-                               $.suggestions.hide( context );
-                               context.data.prevText = '';
-                       } else if (
-                               val !== context.data.prevText ||
-                               !context.data.$container.is( ':visible' )
-                       ) {
-                               context.data.prevText = val;
-                               // Try cache first
-                               if ( context.config.cache && hasOwn.call( cache, val ) ) {
-                                       if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
-                                               context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
-                                               if ( typeof context.config.update.after === 'function' ) {
-                                                       context.config.update.after.call( context.data.$textbox );
-                                               }
-                                               cacheHit = true;
-                                       } else {
-                                               // Cache expired
-                                               delete cache[ val ];
-                                       }
+                       if ( $.isFunction( context.config.cancel ) ) {
+                               context.config.cancel.call( context.data.$textbox );
+                       }
+               },
+
+               /**
+                * Hide the element with suggestions and clean up some state.
+                *
+                * @param {Object} context
+                */
+               hide: function ( context ) {
+                       // Remove any highlights, including on "special" items
+                       context.data.$container.find( '.suggestions-result-current' ).removeClass( 'suggestions-result-current' );
+                       // Hide the container
+                       context.data.$container.hide();
+               },
+
+               /**
+                * Restore the text the user originally typed in the textbox, before it
+                * was overwritten by highlight(). This restores the value the currently
+                * displayed suggestions are based on, rather than the value just before
+                * highlight() overwrote it; the former is arguably slightly more sensible.
+                *
+                * @param {Object} context
+                */
+               restore: function ( context ) {
+                       context.data.$textbox.val( context.data.prevText );
+               },
+
+               /**
+                * Ask the user-specified callback for new suggestions. Any previous delayed
+                * call to this function still pending will be canceled. If the value in the
+                * textbox is empty or hasn't changed since the last time suggestions were fetched,
+                * this function does nothing.
+                *
+                * @param {Object} context
+                * @param {boolean} delayed Whether or not to delay this by the currently configured amount of time
+                */
+               update: function ( context, delayed ) {
+                       function maybeFetch() {
+                               var val = context.data.$textbox.val(),
+                                       cache = context.data.cache,
+                                       cacheHit;
+
+                               if ( typeof context.config.update.before === 'function' ) {
+                                       context.config.update.before.call( context.data.$textbox );
                                }
-                               if ( !cacheHit && typeof context.config.fetch === 'function' ) {
-                                       context.config.fetch.call(
-                                               context.data.$textbox,
-                                               val,
-                                               function ( suggestions ) {
-                                                       suggestions = suggestions.slice( 0, context.config.maxRows );
-                                                       context.data.$textbox.suggestions( 'suggestions', suggestions );
+
+                               // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
+                               // if the textbox is empty then clear the result div, but leave other settings intouched
+                               if ( val.length === 0 ) {
+                                       $.suggestions.hide( context );
+                                       context.data.prevText = '';
+                               } else if (
+                                       val !== context.data.prevText ||
+                                       !context.data.$container.is( ':visible' )
+                               ) {
+                                       context.data.prevText = val;
+                                       // Try cache first
+                                       if ( context.config.cache && hasOwn.call( cache, val ) ) {
+                                               if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
+                                                       context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
                                                        if ( typeof context.config.update.after === 'function' ) {
                                                                context.config.update.after.call( context.data.$textbox );
                                                        }
-                                                       if ( context.config.cache ) {
-                                                               cache[ val ] = {
-                                                                       suggestions: suggestions,
-                                                                       timestamp: +new Date()
-                                                               };
-                                                       }
-                                               },
-                                               context.config.maxRows
-                                       );
+                                                       cacheHit = true;
+                                               } else {
+                                                       // Cache expired
+                                                       delete cache[ val ];
+                                               }
+                                       }
+                                       if ( !cacheHit && typeof context.config.fetch === 'function' ) {
+                                               context.config.fetch.call(
+                                                       context.data.$textbox,
+                                                       val,
+                                                       function ( suggestions ) {
+                                                               suggestions = suggestions.slice( 0, context.config.maxRows );
+                                                               context.data.$textbox.suggestions( 'suggestions', suggestions );
+                                                               if ( typeof context.config.update.after === 'function' ) {
+                                                                       context.config.update.after.call( context.data.$textbox );
+                                                               }
+                                                               if ( context.config.cache ) {
+                                                                       cache[ val ] = {
+                                                                               suggestions: suggestions,
+                                                                               timestamp: +new Date()
+                                                                       };
+                                                               }
+                                                       },
+                                                       context.config.maxRows
+                                               );
+                                       }
                                }
-                       }
 
-                       // Always update special rendering
-                       $.suggestions.special( context );
-               }
+                               // Always update special rendering
+                               $.suggestions.special( context );
+                       }
 
-               // Cancels any delayed maybeFetch call, and invokes context.config.cancel.
-               $.suggestions.cancel( context );
+                       // Cancels any delayed maybeFetch call, and invokes context.config.cancel.
+                       $.suggestions.cancel( context );
 
-               if ( delayed ) {
-                       // To avoid many started/aborted requests while typing, we're gonna take a short
-                       // break before trying to fetch data.
-                       context.data.timerID = setTimeout( maybeFetch, context.config.delay );
-               } else {
-                       maybeFetch();
-               }
-       },
-
-       special: function ( context ) {
-               // Allow custom rendering - but otherwise don't do any rendering
-               if ( typeof context.config.special.render === 'function' ) {
-                       // Wait for the browser to update the value
-                       setTimeout( function () {
-                               // Render special
-                               var $special = context.data.$container.find( '.suggestions-special' );
-                               context.config.special.render.call( $special, context.data.$textbox.val(), context );
-                       }, 1 );
-               }
-       },
-
-       /**
-        * Sets the value of a property, and updates the widget accordingly
-        *
-        * @param {string} property Name of property
-        * @param {Mixed} value Value to set property with
-        */
-       configure: function ( context, property, value ) {
-               var newCSS,
-                       $result, $results, $spanForWidth, childrenWidth,
-                       i, expWidth, maxWidth, text;
-
-               // Validate creation using fallback values
-               switch ( property ) {
-                       case 'fetch':
-                       case 'cancel':
-                       case 'special':
-                       case 'result':
-                       case 'update':
-                       case '$region':
-                       case 'expandFrom':
-                               context.config[ property ] = value;
-                               break;
-                       case 'suggestions':
-                               context.config[ property ] = value;
-                               // Update suggestions
-                               if ( context.data !== undefined ) {
-                                       if ( context.data.$textbox.val().length === 0 ) {
-                                               // Hide the div when no suggestion exist
-                                               $.suggestions.hide( context );
-                                       } else {
-                                               // Rebuild the suggestions list
-                                               context.data.$container.show();
-                                               // Update the size and position of the list
-                                               newCSS = {
-                                                       top: context.config.$region.offset().top + context.config.$region.outerHeight(),
-                                                       bottom: 'auto',
-                                                       width: context.config.$region.outerWidth(),
-                                                       height: 'auto'
-                                               };
-
-                                               // Process expandFrom, after this it is set to left or right.
-                                               context.config.expandFrom = ( function ( expandFrom ) {
-                                                       var regionWidth, docWidth, regionCenter, docCenter,
-                                                               docDir = $( document.documentElement ).css( 'direction' ),
-                                                               $region = context.config.$region;
-
-                                                       // Backwards compatible
-                                                       if ( context.config.positionFromLeft ) {
-                                                               expandFrom = 'left';
-
-                                                       // Catch invalid values, default to 'auto'
-                                                       } else if ( $.inArray( expandFrom, [ 'left', 'right', 'start', 'end', 'auto' ] ) === -1 ) {
-                                                               expandFrom = 'auto';
-                                                       }
+                       if ( delayed ) {
+                               // To avoid many started/aborted requests while typing, we're gonna take a short
+                               // break before trying to fetch data.
+                               context.data.timerID = setTimeout( maybeFetch, context.config.delay );
+                       } else {
+                               maybeFetch();
+                       }
+               },
+
+               /**
+                * @param {Object} context
+               */
+               special: function ( context ) {
+                       // Allow custom rendering - but otherwise don't do any rendering
+                       if ( typeof context.config.special.render === 'function' ) {
+                               // Wait for the browser to update the value
+                               setTimeout( function () {
+                                       // Render special
+                                       var $special = context.data.$container.find( '.suggestions-special' );
+                                       context.config.special.render.call( $special, context.data.$textbox.val(), context );
+                               }, 1 );
+                       }
+               },
+
+               /**
+                * Sets the value of a property, and updates the widget accordingly
+                *
+                * @param {Object} context
+                * @param {string} property Name of property
+                * @param {Mixed} value Value to set property with
+                */
+               configure: function ( context, property, value ) {
+                       var newCSS,
+                               $result, $results, $spanForWidth, childrenWidth,
+                               i, expWidth, maxWidth, text;
+
+                       // Validate creation using fallback values
+                       switch ( property ) {
+                               case 'fetch':
+                               case 'cancel':
+                               case 'special':
+                               case 'result':
+                               case 'update':
+                               case '$region':
+                               case 'expandFrom':
+                                       context.config[ property ] = value;
+                                       break;
+                               case 'suggestions':
+                                       context.config[ property ] = value;
+                                       // Update suggestions
+                                       if ( context.data !== undefined ) {
+                                               if ( context.data.$textbox.val().length === 0 ) {
+                                                       // Hide the div when no suggestion exist
+                                                       $.suggestions.hide( context );
+                                               } else {
+                                                       // Rebuild the suggestions list
+                                                       context.data.$container.show();
+                                                       // Update the size and position of the list
+                                                       newCSS = {
+                                                               top: context.config.$region.offset().top + context.config.$region.outerHeight(),
+                                                               bottom: 'auto',
+                                                               width: context.config.$region.outerWidth(),
+                                                               height: 'auto'
+                                                       };
+
+                                                       // Process expandFrom, after this it is set to left or right.
+                                                       context.config.expandFrom = ( function ( expandFrom ) {
+                                                               var regionWidth, docWidth, regionCenter, docCenter,
+                                                                       docDir = $( document.documentElement ).css( 'direction' ),
+                                                                       $region = context.config.$region;
+
+                                                               // Backwards compatible
+                                                               if ( context.config.positionFromLeft ) {
+                                                                       expandFrom = 'left';
+
+                                                               // Catch invalid values, default to 'auto'
+                                                               } else if ( $.inArray( expandFrom, [ 'left', 'right', 'start', 'end', 'auto' ] ) === -1 ) {
+                                                                       expandFrom = 'auto';
+                                                               }
 
-                                                       if ( expandFrom === 'auto' ) {
-                                                               if ( $region.data( 'searchsuggest-expand-dir' ) ) {
-                                                                       // If the markup explicitly contains a direction, use it.
-                                                                       expandFrom = $region.data( 'searchsuggest-expand-dir' );
-                                                               } else {
-                                                                       regionWidth = $region.outerWidth();
-                                                                       docWidth = $( document ).width();
-                                                                       if ( regionWidth > ( 0.85 * docWidth ) ) {
-                                                                               // If the input size takes up more than 85% of the document horizontally
-                                                                               // expand the suggestions to the writing direction's native end.
-                                                                               expandFrom = 'start';
+                                                               if ( expandFrom === 'auto' ) {
+                                                                       if ( $region.data( 'searchsuggest-expand-dir' ) ) {
+                                                                               // If the markup explicitly contains a direction, use it.
+                                                                               expandFrom = $region.data( 'searchsuggest-expand-dir' );
                                                                        } else {
-                                                                               // Calculate the center points of the input and document
-                                                                               regionCenter = $region.offset().left + regionWidth / 2;
-                                                                               docCenter = docWidth / 2;
-                                                                               if ( Math.abs( regionCenter - docCenter ) < ( 0.10 * docCenter ) ) {
-                                                                                       // If the input's center is within 10% of the document center
-                                                                                       // use the writing direction's native end.
+                                                                               regionWidth = $region.outerWidth();
+                                                                               docWidth = $( document ).width();
+                                                                               if ( regionWidth > ( 0.85 * docWidth ) ) {
+                                                                                       // If the input size takes up more than 85% of the document horizontally
+                                                                                       // expand the suggestions to the writing direction's native end.
                                                                                        expandFrom = 'start';
                                                                                } else {
-                                                                                       // Otherwise expand the input from the closest side of the page,
-                                                                                       // towards the side of the page with the most free open space
-                                                                                       expandFrom = regionCenter > docCenter ? 'right' : 'left';
+                                                                                       // Calculate the center points of the input and document
+                                                                                       regionCenter = $region.offset().left + regionWidth / 2;
+                                                                                       docCenter = docWidth / 2;
+                                                                                       if ( Math.abs( regionCenter - docCenter ) < ( 0.10 * docCenter ) ) {
+                                                                                               // If the input's center is within 10% of the document center
+                                                                                               // use the writing direction's native end.
+                                                                                               expandFrom = 'start';
+                                                                                       } else {
+                                                                                               // Otherwise expand the input from the closest side of the page,
+                                                                                               // towards the side of the page with the most free open space
+                                                                                               expandFrom = regionCenter > docCenter ? 'right' : 'left';
+                                                                                       }
                                                                                }
                                                                        }
                                                                }
-                                                       }
 
-                                                       if ( expandFrom === 'start' ) {
-                                                               expandFrom = docDir === 'rtl' ? 'right' : 'left';
+                                                               if ( expandFrom === 'start' ) {
+                                                                       expandFrom = docDir === 'rtl' ? 'right' : 'left';
 
-                                                       } else if ( expandFrom === 'end' ) {
-                                                               expandFrom = docDir === 'rtl' ? 'left' : 'right';
-                                                       }
+                                                               } else if ( expandFrom === 'end' ) {
+                                                                       expandFrom = docDir === 'rtl' ? 'left' : 'right';
+                                                               }
 
-                                                       return expandFrom;
+                                                               return expandFrom;
 
-                                               }( context.config.expandFrom ) );
+                                                       }( context.config.expandFrom ) );
 
-                                               if ( context.config.expandFrom === 'left' ) {
-                                                       // Expand from left
-                                                       newCSS.left = context.config.$region.offset().left;
-                                                       newCSS.right = 'auto';
-                                               } else {
-                                                       // Expand from right
-                                                       newCSS.left = 'auto';
-                                                       newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
-                                               }
-
-                                               context.data.$container.css( newCSS );
-                                               $results = context.data.$container.children( '.suggestions-results' );
-                                               $results.empty();
-                                               expWidth = -1;
-                                               for ( i = 0; i < context.config.suggestions.length; i++ ) {
-                                                       /*jshint loopfunc:true */
-                                                       text = context.config.suggestions[ i ];
-                                                       $result = $( '<div>' )
-                                                               .addClass( 'suggestions-result' )
-                                                               .attr( 'rel', i )
-                                                               .data( 'text', context.config.suggestions[ i ] )
-                                                               .mousemove( function () {
-                                                                       context.data.selectedWithMouse = true;
-                                                                       $.suggestions.highlight(
-                                                                               context,
-                                                                               $( this ).closest( '.suggestions-results .suggestions-result' ),
-                                                                               false
-                                                                       );
-                                                               } )
-                                                               .appendTo( $results );
-                                                       // Allow custom rendering
-                                                       if ( typeof context.config.result.render === 'function' ) {
-                                                               context.config.result.render.call( $result, context.config.suggestions[ i ], context );
+                                                       if ( context.config.expandFrom === 'left' ) {
+                                                               // Expand from left
+                                                               newCSS.left = context.config.$region.offset().left;
+                                                               newCSS.right = 'auto';
                                                        } else {
-                                                               $result.text( text );
+                                                               // Expand from right
+                                                               newCSS.left = 'auto';
+                                                               newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
                                                        }
 
-                                                       if ( context.config.highlightInput ) {
-                                                               $result.highlightText( context.data.prevText );
-                                                       }
+                                                       context.data.$container.css( newCSS );
+                                                       $results = context.data.$container.children( '.suggestions-results' );
+                                                       $results.empty();
+                                                       expWidth = -1;
+                                                       for ( i = 0; i < context.config.suggestions.length; i++ ) {
+                                                               /*jshint loopfunc:true */
+                                                               text = context.config.suggestions[ i ];
+                                                               $result = $( '<div>' )
+                                                                       .addClass( 'suggestions-result' )
+                                                                       .attr( 'rel', i )
+                                                                       .data( 'text', context.config.suggestions[ i ] )
+                                                                       .mousemove( function () {
+                                                                               context.data.selectedWithMouse = true;
+                                                                               $.suggestions.highlight(
+                                                                                       context,
+                                                                                       $( this ).closest( '.suggestions-results .suggestions-result' ),
+                                                                                       false
+                                                                               );
+                                                                       } )
+                                                                       .appendTo( $results );
+                                                               // Allow custom rendering
+                                                               if ( typeof context.config.result.render === 'function' ) {
+                                                                       context.config.result.render.call( $result, context.config.suggestions[ i ], context );
+                                                               } else {
+                                                                       $result.text( text );
+                                                               }
 
-                                                       // Widen results box if needed (new width is only calculated here, applied later).
-
-                                                       // The monstrosity below accomplishes two things:
-                                                       // * Wraps the text contents in a DOM element, so that we can know its width. There is
-                                                       //   no way to directly access the width of a text node, and we can't use the parent
-                                                       //   node width as it has text-overflow: ellipsis; and overflow: hidden; applied to
-                                                       //   it, which trims it to a smaller width.
-                                                       // * Temporarily applies position: absolute; to the wrapper to pull it out of normal
-                                                       //   document flow. Otherwise the CSS text-overflow: ellipsis; and overflow: hidden;
-                                                       //   rules would cause some browsers (at least all versions of IE from 6 to 11) to
-                                                       //   still report the "trimmed" width. This should not be done in regular CSS
-                                                       //   stylesheets as we don't want this rule to apply to other <span> elements, like
-                                                       //   the ones generated by jquery.highlightText.
-                                                       $spanForWidth = $result.wrapInner( '<span>' ).children();
-                                                       childrenWidth = $spanForWidth.css( 'position', 'absolute' ).outerWidth();
-                                                       $spanForWidth.contents().unwrap();
-
-                                                       if ( childrenWidth > $result.width() && childrenWidth > expWidth ) {
-                                                               // factor in any padding, margin, or border space on the parent
-                                                               expWidth = childrenWidth + ( context.data.$container.width() - $result.width() );
+                                                               if ( context.config.highlightInput ) {
+                                                                       $result.highlightText( context.data.prevText );
+                                                               }
+
+                                                               // Widen results box if needed (new width is only calculated here, applied later).
+
+                                                               // The monstrosity below accomplishes two things:
+                                                               // * Wraps the text contents in a DOM element, so that we can know its width. There is
+                                                               //   no way to directly access the width of a text node, and we can't use the parent
+                                                               //   node width as it has text-overflow: ellipsis; and overflow: hidden; applied to
+                                                               //   it, which trims it to a smaller width.
+                                                               // * Temporarily applies position: absolute; to the wrapper to pull it out of normal
+                                                               //   document flow. Otherwise the CSS text-overflow: ellipsis; and overflow: hidden;
+                                                               //   rules would cause some browsers (at least all versions of IE from 6 to 11) to
+                                                               //   still report the "trimmed" width. This should not be done in regular CSS
+                                                               //   stylesheets as we don't want this rule to apply to other <span> elements, like
+                                                               //   the ones generated by jquery.highlightText.
+                                                               $spanForWidth = $result.wrapInner( '<span>' ).children();
+                                                               childrenWidth = $spanForWidth.css( 'position', 'absolute' ).outerWidth();
+                                                               $spanForWidth.contents().unwrap();
+
+                                                               if ( childrenWidth > $result.width() && childrenWidth > expWidth ) {
+                                                                       // factor in any padding, margin, or border space on the parent
+                                                                       expWidth = childrenWidth + ( context.data.$container.width() - $result.width() );
+                                                               }
                                                        }
-                                               }
 
-                                               // Apply new width for results box, if any
-                                               if ( expWidth > context.data.$container.width() ) {
-                                                       maxWidth = context.config.maxExpandFactor * context.data.$textbox.width();
-                                                       context.data.$container.width( Math.min( expWidth, maxWidth ) );
+                                                       // Apply new width for results box, if any
+                                                       if ( expWidth > context.data.$container.width() ) {
+                                                               maxWidth = context.config.maxExpandFactor * context.data.$textbox.width();
+                                                               context.data.$container.width( Math.min( expWidth, maxWidth ) );
+                                                       }
                                                }
                                        }
-                               }
-                               break;
-                       case 'maxRows':
-                               context.config[ property ] = Math.max( 1, Math.min( 100, value ) );
-                               break;
-                       case 'delay':
-                               context.config[ property ] = Math.max( 0, Math.min( 1200, value ) );
-                               break;
-                       case 'cacheMaxAge':
-                               context.config[ property ] = Math.max( 1, value );
-                               break;
-                       case 'maxExpandFactor':
-                               context.config[ property ] = Math.max( 1, value );
-                               break;
-                       case 'cache':
-                       case 'submitOnClick':
-                       case 'positionFromLeft':
-                       case 'highlightInput':
-                               context.config[ property ] = !!value;
-                               break;
-               }
-       },
+                                       break;
+                               case 'maxRows':
+                                       context.config[ property ] = Math.max( 1, Math.min( 100, value ) );
+                                       break;
+                               case 'delay':
+                                       context.config[ property ] = Math.max( 0, Math.min( 1200, value ) );
+                                       break;
+                               case 'cacheMaxAge':
+                                       context.config[ property ] = Math.max( 1, value );
+                                       break;
+                               case 'maxExpandFactor':
+                                       context.config[ property ] = Math.max( 1, value );
+                                       break;
+                               case 'cache':
+                               case 'submitOnClick':
+                               case 'positionFromLeft':
+                               case 'highlightInput':
+                                       context.config[ property ] = !!value;
+                                       break;
+                       }
+               },
+
+               /**
+                * Highlight a result in the results table
+                *
+                * @param {Object} context
+                * @param {jQuery|string} result `<tr>` to highlight, or 'prev' or 'next'
+                * @param {boolean} updateTextbox If true, put the suggestion in the textbox
+                */
+               highlight: function ( context, result, updateTextbox ) {
+                       var selected = context.data.$container.find( '.suggestions-result-current' );
+                       if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
+                               if ( result === 'prev' ) {
+                                       if ( selected.hasClass( 'suggestions-special' ) ) {
+                                               result = context.data.$container.find( '.suggestions-result:last' );
+                                       } else {
+                                               result = selected.prev();
+                                               if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
+                                                       // there is something in the DOM between selected element and the wrapper, bypass it
+                                                       result = selected.parents( '.suggestions-results > *' ).prev().find( '.suggestions-result' ).eq( 0 );
+                                               }
 
-       /**
-        * Highlight a result in the results table
-        *
-        * @param {jQuery|string} result `<tr>` to highlight, or 'prev' or 'next'
-        * @param {boolean} updateTextbox If true, put the suggestion in the textbox
-        */
-       highlight: function ( context, result, updateTextbox ) {
-               var selected = context.data.$container.find( '.suggestions-result-current' );
-               if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
-                       if ( result === 'prev' ) {
-                               if ( selected.hasClass( 'suggestions-special' ) ) {
-                                       result = context.data.$container.find( '.suggestions-result:last' );
-                               } else {
-                                       result = selected.prev();
-                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
-                                               // there is something in the DOM between selected element and the wrapper, bypass it
-                                               result = selected.parents( '.suggestions-results > *' ).prev().find( '.suggestions-result' ).eq( 0 );
+                                               if ( selected.length === 0 ) {
+                                                       // we are at the beginning, so lets jump to the last item
+                                                       if ( context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
+                                                               result = context.data.$container.find( '.suggestions-special' );
+                                                       } else {
+                                                               result = context.data.$container.find( '.suggestions-results .suggestions-result:last' );
+                                                       }
+                                               }
                                        }
-
+                               } else if ( result === 'next' ) {
                                        if ( selected.length === 0 ) {
-                                               // we are at the beginning, so lets jump to the last item
-                                               if ( context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
+                                               // No item selected, go to the first one
+                                               result = context.data.$container.find( '.suggestions-results .suggestions-result:first' );
+                                               if ( result.length === 0 && context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
+                                                       // No suggestion exists, go to the special one directly
                                                        result = context.data.$container.find( '.suggestions-special' );
-                                               } else {
-                                                       result = context.data.$container.find( '.suggestions-results .suggestions-result:last' );
                                                }
-                                       }
-                               }
-                       } else if ( result === 'next' ) {
-                               if ( selected.length === 0 ) {
-                                       // No item selected, go to the first one
-                                       result = context.data.$container.find( '.suggestions-results .suggestions-result:first' );
-                                       if ( result.length === 0 && context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
-                                               // No suggestion exists, go to the special one directly
-                                               result = context.data.$container.find( '.suggestions-special' );
-                                       }
-                               } else {
-                                       result = selected.next();
-                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
-                                               // there is something in the DOM between selected element and the wrapper, bypass it
-                                               result = selected.parents( '.suggestions-results > *' ).next().find( '.suggestions-result' ).eq( 0 );
-                                       }
+                                       } else {
+                                               result = selected.next();
+                                               if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
+                                                       // there is something in the DOM between selected element and the wrapper, bypass it
+                                                       result = selected.parents( '.suggestions-results > *' ).next().find( '.suggestions-result' ).eq( 0 );
+                                               }
 
-                                       if ( selected.hasClass( 'suggestions-special' ) ) {
-                                               result = $( [] );
-                                       } else if (
-                                               result.length === 0 &&
-                                               context.data.$container.find( '.suggestions-special' ).html() !== ''
-                                       ) {
-                                               // We were at the last item, jump to the specials!
-                                               result = context.data.$container.find( '.suggestions-special' );
+                                               if ( selected.hasClass( 'suggestions-special' ) ) {
+                                                       result = $( [] );
+                                               } else if (
+                                                       result.length === 0 &&
+                                                       context.data.$container.find( '.suggestions-special' ).html() !== ''
+                                               ) {
+                                                       // We were at the last item, jump to the specials!
+                                                       result = context.data.$container.find( '.suggestions-special' );
+                                               }
                                        }
                                }
+                               selected.removeClass( 'suggestions-result-current' );
+                               result.addClass( 'suggestions-result-current' );
                        }
-                       selected.removeClass( 'suggestions-result-current' );
-                       result.addClass( 'suggestions-result-current' );
-               }
-               if ( updateTextbox ) {
-                       if ( result.length === 0 || result.is( '.suggestions-special' ) ) {
-                               $.suggestions.restore( context );
-                       } else {
-                               context.data.$textbox.val( result.data( 'text' ) );
-                               // .val() doesn't call any event handlers, so
-                               // let the world know what happened
-                               context.data.$textbox.change();
-                       }
-                       context.data.$textbox.trigger( 'change' );
-               }
-       },
-
-       /**
-        * Respond to keypress event
-        *
-        * @param {number} key Code of key pressed
-        */
-       keypress: function ( e, context, key ) {
-               var selected,
-                       wasVisible = context.data.$container.is( ':visible' ),
-                       preventDefault = false;
-
-               switch ( key ) {
-                       // Arrow down
-                       case 40:
-                               if ( wasVisible ) {
-                                       $.suggestions.highlight( context, 'next', true );
-                                       context.data.selectedWithMouse = false;
+                       if ( updateTextbox ) {
+                               if ( result.length === 0 || result.is( '.suggestions-special' ) ) {
+                                       $.suggestions.restore( context );
                                } else {
-                                       $.suggestions.update( context, false );
-                               }
-                               preventDefault = true;
-                               break;
-                       // Arrow up
-                       case 38:
-                               if ( wasVisible ) {
-                                       $.suggestions.highlight( context, 'prev', true );
-                                       context.data.selectedWithMouse = false;
+                                       context.data.$textbox.val( result.data( 'text' ) );
+                                       // .val() doesn't call any event handlers, so
+                                       // let the world know what happened
+                                       context.data.$textbox.change();
                                }
-                               preventDefault = wasVisible;
-                               break;
-                       // Escape
-                       case 27:
-                               $.suggestions.hide( context );
-                               $.suggestions.restore( context );
-                               $.suggestions.cancel( context );
                                context.data.$textbox.trigger( 'change' );
-                               preventDefault = wasVisible;
-                               break;
-                       // Enter
-                       case 13:
-                               preventDefault = wasVisible;
-                               selected = context.data.$container.find( '.suggestions-result-current' );
-                               $.suggestions.hide( context );
-                               if ( selected.length === 0 || context.data.selectedWithMouse ) {
-                                       // If nothing is selected or if something was selected with the mouse
-                                       // cancel any current requests and allow the form to be submitted
-                                       // (simply don't prevent default behavior).
+                       }
+               },
+
+               /**
+                * Respond to keypress event
+                *
+                * @param {jQuery.Event} e
+                * @param {Object} context
+                * @param {number} key Code of key pressed
+                */
+               keypress: function ( e, context, key ) {
+                       var selected,
+                               wasVisible = context.data.$container.is( ':visible' ),
+                               preventDefault = false;
+
+                       switch ( key ) {
+                               // Arrow down
+                               case 40:
+                                       if ( wasVisible ) {
+                                               $.suggestions.highlight( context, 'next', true );
+                                               context.data.selectedWithMouse = false;
+                                       } else {
+                                               $.suggestions.update( context, false );
+                                       }
+                                       preventDefault = true;
+                                       break;
+                               // Arrow up
+                               case 38:
+                                       if ( wasVisible ) {
+                                               $.suggestions.highlight( context, 'prev', true );
+                                               context.data.selectedWithMouse = false;
+                                       }
+                                       preventDefault = wasVisible;
+                                       break;
+                               // Escape
+                               case 27:
+                                       $.suggestions.hide( context );
+                                       $.suggestions.restore( context );
                                        $.suggestions.cancel( context );
-                                       preventDefault = false;
-                               } else if ( selected.is( '.suggestions-special' ) ) {
-                                       if ( typeof context.config.special.select === 'function' ) {
-                                               // Allow the callback to decide whether to prevent default or not
-                                               if ( context.config.special.select.call( selected, context.data.$textbox ) === true ) {
-                                                       preventDefault = false;
+                                       context.data.$textbox.trigger( 'change' );
+                                       preventDefault = wasVisible;
+                                       break;
+                               // Enter
+                               case 13:
+                                       preventDefault = wasVisible;
+                                       selected = context.data.$container.find( '.suggestions-result-current' );
+                                       $.suggestions.hide( context );
+                                       if ( selected.length === 0 || context.data.selectedWithMouse ) {
+                                               // If nothing is selected or if something was selected with the mouse
+                                               // cancel any current requests and allow the form to be submitted
+                                               // (simply don't prevent default behavior).
+                                               $.suggestions.cancel( context );
+                                               preventDefault = false;
+                                       } else if ( selected.is( '.suggestions-special' ) ) {
+                                               if ( typeof context.config.special.select === 'function' ) {
+                                                       // Allow the callback to decide whether to prevent default or not
+                                                       if ( context.config.special.select.call( selected, context.data.$textbox ) === true ) {
+                                                               preventDefault = false;
+                                                       }
                                                }
-                                       }
-                               } else {
-                                       if ( typeof context.config.result.select === 'function' ) {
-                                               // Allow the callback to decide whether to prevent default or not
-                                               if ( context.config.result.select.call( selected, context.data.$textbox ) === true ) {
-                                                       preventDefault = false;
+                                       } else {
+                                               if ( typeof context.config.result.select === 'function' ) {
+                                                       // Allow the callback to decide whether to prevent default or not
+                                                       if ( context.config.result.select.call( selected, context.data.$textbox ) === true ) {
+                                                               preventDefault = false;
+                                                       }
                                                }
                                        }
-                               }
-                               break;
-                       default:
-                               $.suggestions.update( context, true );
-                               break;
-               }
-               if ( preventDefault ) {
-                       e.preventDefault();
-                       e.stopPropagation();
-               }
-       }
-};
-
-// See file header for method documentation
-$.fn.suggestions = function () {
-
-       // Multi-context fields
-       var returnValue,
-               args = arguments;
-
-       $( this ).each( function () {
-               var context, key;
-
-               /* Construction and Loading */
-
-               context = $( this ).data( 'suggestions-context' );
-               if ( context === undefined || context === null ) {
-                       context = {
-                               config: {
-                                       fetch: function () {},
-                                       cancel: function () {},
-                                       special: {},
-                                       result: {},
-                                       update: {},
-                                       $region: $( this ),
-                                       suggestions: [],
-                                       maxRows: 10,
-                                       delay: 120,
-                                       cache: false,
-                                       cacheMaxAge: 60000,
-                                       submitOnClick: false,
-                                       maxExpandFactor: 3,
-                                       expandFrom: 'auto',
-                                       highlightInput: false
-                               }
-                       };
+                                       break;
+                               default:
+                                       $.suggestions.update( context, true );
+                                       break;
+                       }
+                       if ( preventDefault ) {
+                               e.preventDefault();
+                               e.stopPropagation();
+                       }
                }
+       };
+
+       // See file header for method documentation
+       $.fn.suggestions = function () {
+
+               // Multi-context fields
+               var returnValue,
+                       args = arguments;
+
+               $( this ).each( function () {
+                       var context, key;
+
+                       /* Construction and Loading */
+
+                       context = $( this ).data( 'suggestions-context' );
+                       if ( context === undefined || context === null ) {
+                               context = {
+                                       config: {
+                                               fetch: function () {},
+                                               cancel: function () {},
+                                               special: {},
+                                               result: {},
+                                               update: {},
+                                               $region: $( this ),
+                                               suggestions: [],
+                                               maxRows: 10,
+                                               delay: 120,
+                                               cache: false,
+                                               cacheMaxAge: 60000,
+                                               submitOnClick: false,
+                                               maxExpandFactor: 3,
+                                               expandFrom: 'auto',
+                                               highlightInput: false
+                                       }
+                               };
+                       }
 
-               /* API */
+                       /* API */
 
-               // Handle various calling styles
-               if ( args.length > 0 ) {
-                       if ( typeof args[ 0 ] === 'object' ) {
-                               // Apply set of properties
-                               for ( key in args[ 0 ] ) {
-                                       $.suggestions.configure( context, key, args[ 0 ][ key ] );
-                               }
-                       } else if ( typeof args[ 0 ] === 'string' ) {
-                               if ( args.length > 1 ) {
-                                       // Set property values
-                                       $.suggestions.configure( context, args[ 0 ], args[ 1 ] );
-                               } else if ( returnValue === null || returnValue === undefined ) {
-                                       // Get property values, but don't give access to internal data - returns only the first
-                                       returnValue = ( args[ 0 ] in context.config ? undefined : context.config[ args[ 0 ] ] );
+                       // Handle various calling styles
+                       if ( args.length > 0 ) {
+                               if ( typeof args[ 0 ] === 'object' ) {
+                                       // Apply set of properties
+                                       for ( key in args[ 0 ] ) {
+                                               $.suggestions.configure( context, key, args[ 0 ][ key ] );
+                                       }
+                               } else if ( typeof args[ 0 ] === 'string' ) {
+                                       if ( args.length > 1 ) {
+                                               // Set property values
+                                               $.suggestions.configure( context, args[ 0 ], args[ 1 ] );
+                                       } else if ( returnValue === null || returnValue === undefined ) {
+                                               // Get property values, but don't give access to internal data - returns only the first
+                                               returnValue = ( args[ 0 ] in context.config ? undefined : context.config[ args[ 0 ] ] );
+                                       }
                                }
                        }
-               }
 
-               /* Initialization */
-
-               if ( context.data === undefined ) {
-                       context.data = {
-                               // ID of running timer
-                               timerID: null,
-
-                               // Text in textbox when suggestions were last fetched
-                               prevText: null,
-
-                               // Cache of fetched suggestions
-                               cache: {},
-
-                               // Number of results visible without scrolling
-                               visibleResults: 0,
-
-                               // Suggestion the last mousedown event occurred on
-                               mouseDownOn: $( [] ),
-                               $textbox: $( this ),
-                               selectedWithMouse: false
-                       };
-
-                       context.data.$container = $( '<div>' )
-                               .css( 'display', 'none' )
-                               .addClass( 'suggestions' )
-                               .append(
-                                       $( '<div>' ).addClass( 'suggestions-results' )
-                                               // Can't use click() because the container div is hidden when the
-                                               // textbox loses focus. Instead, listen for a mousedown followed
-                                               // by a mouseup on the same div.
-                                               .mousedown( function ( e ) {
-                                                       context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results .suggestions-result' );
-                                               } )
-                                               .mouseup( function ( e ) {
-                                                       var $result = $( e.target ).closest( '.suggestions-results .suggestions-result' ),
-                                                               $other = context.data.mouseDownOn;
-
-                                                       context.data.mouseDownOn = $( [] );
-                                                       if ( $result.get( 0 ) !== $other.get( 0 ) ) {
-                                                               return;
-                                                       }
-                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
-                                                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                               $.suggestions.highlight( context, $result, true );
-                                                               if ( typeof context.config.result.select === 'function' ) {
-                                                                       context.config.result.select.call( $result, context.data.$textbox );
+                       /* Initialization */
+
+                       if ( context.data === undefined ) {
+                               context.data = {
+                                       // ID of running timer
+                                       timerID: null,
+
+                                       // Text in textbox when suggestions were last fetched
+                                       prevText: null,
+
+                                       // Cache of fetched suggestions
+                                       cache: {},
+
+                                       // Number of results visible without scrolling
+                                       visibleResults: 0,
+
+                                       // Suggestion the last mousedown event occurred on
+                                       mouseDownOn: $( [] ),
+                                       $textbox: $( this ),
+                                       selectedWithMouse: false
+                               };
+
+                               context.data.$container = $( '<div>' )
+                                       .css( 'display', 'none' )
+                                       .addClass( 'suggestions' )
+                                       .append(
+                                               $( '<div>' ).addClass( 'suggestions-results' )
+                                                       // Can't use click() because the container div is hidden when the
+                                                       // textbox loses focus. Instead, listen for a mousedown followed
+                                                       // by a mouseup on the same div.
+                                                       .mousedown( function ( e ) {
+                                                               context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results .suggestions-result' );
+                                                       } )
+                                                       .mouseup( function ( e ) {
+                                                               var $result = $( e.target ).closest( '.suggestions-results .suggestions-result' ),
+                                                                       $other = context.data.mouseDownOn;
+
+                                                               context.data.mouseDownOn = $( [] );
+                                                               if ( $result.get( 0 ) !== $other.get( 0 ) ) {
+                                                                       return;
                                                                }
-                                                               // This will hide the link we're just clicking on, which causes problems
-                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
-                                                               setTimeout( function () {
-                                                                       $.suggestions.hide( context );
-                                                               }, 0 );
-                                                       }
-                                                       // Always bring focus to the textbox, as that's probably where the user expects it
-                                                       // if they were just typing.
-                                                       context.data.$textbox.focus();
-                                               } )
-                               )
-                               .append(
-                                       $( '<div>' ).addClass( 'suggestions-special' )
-                                               // Can't use click() because the container div is hidden when the
-                                               // textbox loses focus. Instead, listen for a mousedown followed
-                                               // by a mouseup on the same div.
-                                               .mousedown( function ( e ) {
-                                                       context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
-                                               } )
-                                               .mouseup( function ( e ) {
-                                                       var $special = $( e.target ).closest( '.suggestions-special' ),
-                                                               $other = context.data.mouseDownOn;
-
-                                                       context.data.mouseDownOn = $( [] );
-                                                       if ( $special.get( 0 ) !== $other.get( 0 ) ) {
-                                                               return;
-                                                       }
-                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
-                                                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                               if ( typeof context.config.special.select === 'function' ) {
-                                                                       context.config.special.select.call( $special, context.data.$textbox );
+                                                               // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
+                                                               if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+                                                                       $.suggestions.highlight( context, $result, true );
+                                                                       if ( typeof context.config.result.select === 'function' ) {
+                                                                               context.config.result.select.call( $result, context.data.$textbox );
+                                                                       }
+                                                                       // This will hide the link we're just clicking on, which causes problems
+                                                                       // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                                       setTimeout( function () {
+                                                                               $.suggestions.hide( context );
+                                                                       }, 0 );
                                                                }
-                                                               // This will hide the link we're just clicking on, which causes problems
-                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
-                                                               setTimeout( function () {
-                                                                       $.suggestions.hide( context );
-                                                               }, 0 );
-                                                       }
-                                                       // Always bring focus to the textbox, as that's probably where the user expects it
-                                                       // if they were just typing.
-                                                       context.data.$textbox.focus();
-                                               } )
-                                               .mousemove( function ( e ) {
-                                                       context.data.selectedWithMouse = true;
-                                                       $.suggestions.highlight(
-                                                               context, $( e.target ).closest( '.suggestions-special' ), false
-                                                       );
-                                               } )
-                               )
-                               .appendTo( $( 'body' ) );
-
-                       $( this )
-                               // Stop browser autocomplete from interfering
-                               .attr( 'autocomplete', 'off' )
-                               .keydown( function ( e ) {
-                                       // Store key pressed to handle later
-                                       context.data.keypressed = e.which;
-                                       context.data.keypressedCount = 0;
-                               } )
-                               .keypress( function ( e ) {
-                                       context.data.keypressedCount++;
-                                       $.suggestions.keypress( e, context, context.data.keypressed );
-                               } )
-                               .keyup( function ( e ) {
-                                       // Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
-                                       // keypress in between, solve it
-                                       if ( context.data.keypressedCount === 0 ) {
+                                                               // Always bring focus to the textbox, as that's probably where the user expects it
+                                                               // if they were just typing.
+                                                               context.data.$textbox.focus();
+                                                       } )
+                                       )
+                                       .append(
+                                               $( '<div>' ).addClass( 'suggestions-special' )
+                                                       // Can't use click() because the container div is hidden when the
+                                                       // textbox loses focus. Instead, listen for a mousedown followed
+                                                       // by a mouseup on the same div.
+                                                       .mousedown( function ( e ) {
+                                                               context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
+                                                       } )
+                                                       .mouseup( function ( e ) {
+                                                               var $special = $( e.target ).closest( '.suggestions-special' ),
+                                                                       $other = context.data.mouseDownOn;
+
+                                                               context.data.mouseDownOn = $( [] );
+                                                               if ( $special.get( 0 ) !== $other.get( 0 ) ) {
+                                                                       return;
+                                                               }
+                                                               // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
+                                                               if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+                                                                       if ( typeof context.config.special.select === 'function' ) {
+                                                                               context.config.special.select.call( $special, context.data.$textbox );
+                                                                       }
+                                                                       // This will hide the link we're just clicking on, which causes problems
+                                                                       // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                                       setTimeout( function () {
+                                                                               $.suggestions.hide( context );
+                                                                       }, 0 );
+                                                               }
+                                                               // Always bring focus to the textbox, as that's probably where the user expects it
+                                                               // if they were just typing.
+                                                               context.data.$textbox.focus();
+                                                       } )
+                                                       .mousemove( function ( e ) {
+                                                               context.data.selectedWithMouse = true;
+                                                               $.suggestions.highlight(
+                                                                       context, $( e.target ).closest( '.suggestions-special' ), false
+                                                               );
+                                                       } )
+                                       )
+                                       .appendTo( $( 'body' ) );
+
+                               $( this )
+                                       // Stop browser autocomplete from interfering
+                                       .attr( 'autocomplete', 'off' )
+                                       .keydown( function ( e ) {
+                                               // Store key pressed to handle later
+                                               context.data.keypressed = e.which;
+                                               context.data.keypressedCount = 0;
+                                       } )
+                                       .keypress( function ( e ) {
+                                               context.data.keypressedCount++;
                                                $.suggestions.keypress( e, context, context.data.keypressed );
-                                       }
-                               } )
-                               .blur( function () {
-                                       // When losing focus because of a mousedown
-                                       // on a suggestion, don't hide the suggestions
-                                       if ( context.data.mouseDownOn.length > 0 ) {
-                                               return;
-                                       }
-                                       $.suggestions.hide( context );
-                                       $.suggestions.cancel( context );
-                               } );
-               }
+                                       } )
+                                       .keyup( function ( e ) {
+                                               // Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
+                                               // keypress in between, solve it
+                                               if ( context.data.keypressedCount === 0 ) {
+                                                       $.suggestions.keypress( e, context, context.data.keypressed );
+                                               }
+                                       } )
+                                       .blur( function () {
+                                               // When losing focus because of a mousedown
+                                               // on a suggestion, don't hide the suggestions
+                                               if ( context.data.mouseDownOn.length > 0 ) {
+                                                       return;
+                                               }
+                                               $.suggestions.hide( context );
+                                               $.suggestions.cancel( context );
+                                       } );
+                       }
 
-               // Store the context for next time
-               $( this ).data( 'suggestions-context', context );
-       } );
-       return returnValue !== undefined ? returnValue : $( this );
-};
+                       // Store the context for next time
+                       $( this ).data( 'suggestions-context', context );
+               } );
+               return returnValue !== undefined ? returnValue : $( this );
+       };
 
-/**
- * @class jQuery
- * @mixins jQuery.plugin.suggestions
- */
+       /**
       * @class jQuery
       * @mixins jQuery.plugin.suggestions
       */
 
 }( jQuery ) );
index eaa138b..0eefae6 100644 (file)
         * in default (ascending) order when their header cell is clicked the next time.
         *
         * @param {jQuery} $headers
-        * @param {Number[][]} sortList
-        * @param {Number[][]} headerToColumns
+        * @param {number[][]} sortList
+        * @param {number[][]} headerToColumns
         */
        function setHeadersOrder( $headers, sortList, headerToColumns ) {
                // Loop through all headers to retrieve the indices of the columns the header spans across:
                                new RegExp( /(https?|ftp|file):\/\// )
                        ],
                        isoDate: [
-                               new RegExp( /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/ )
+                               new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)([T\s]((([01]\d|2[0-3])(:?[0-5]\d)?|24:?00)?(:?([0-5]\d))?([.,]\d+)?)([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?/ ),
+                               new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)/ )
                        ],
                        usLongDate: [
                                new RegExp( /^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/ )
                        return ts.rgx.isoDate[ 0 ].test( s );
                },
                format: function ( s ) {
-                       return $.tablesorter.formatFloat( ( s !== '' ) ? new Date( s.replace(
-                       new RegExp( /-/g ), '/' ) ).getTime() : '0' );
+                       var isodate,
+                               matches;
+                       if ( !Date.prototype.toISOString ) {
+                               // Old browsers don't understand iso, Fallback to US date parsing and ignore the time part.
+                               matches = $.trim( s ).match( ts.rgx.isoDate[ 1 ] );
+                               if ( matches ) {
+                                       isodate = new Date( matches[ 2 ]  + '/' + matches[ 3 ] + '/' + matches[ 1 ] );
+                               } else {
+                                       return $.tablesorter.formatFloat( 0 );
+                               }
+                       } else {
+                               isodate = new Date( $.trim( s ) );
+                       }
+                       return $.tablesorter.formatFloat( ( isodate !== undefined ) ? isodate.getTime() : 0 );
                },
                type: 'numeric'
        } );
index ab4535b..6d0175e 100644 (file)
                        uselang: mw.config.get( 'wgUserLanguage' ),
                        title: mw.config.get( 'wgPageName' ),
                        text: $textbox.textSelection( 'getContents' ),
-                       summary: $summary.textSelection( 'getContents' )
+                       summary: $summary.textSelection( 'getContents' ),
+                       sectionpreview: section !== ''
                };
 
-               if ( section !== '' ) {
-                       postData.sectionpreview = '';
-                       if ( section === 'new' ) {
-                               postData.section = section;
-                               postData.sectiontitle = postData.summary;
-                       }
+               if ( section === 'new' ) {
+                       postData.section = 'new';
+                       postData.sectiontitle = postData.summary;
                }
 
                if ( isDiff ) {
                        $wikiPreview.hide();
 
                        // First PST the input, then diff it
-                       postData.onlypst = '';
+                       postData.onlypst = true;
                        request = api.post( postData );
                        request.done( function ( response ) {
-                               var postData;
-                               postData = {
+                               api.post( {
                                        action: 'query',
-                                       indexpageids: '',
+                                       indexpageids: true,
                                        prop: 'revisions',
                                        titles: mw.config.get( 'wgPageName' ),
                                        rvdifftotext: response.parse.text[ '*' ],
-                                       rvprop: ''
-                               };
-                               if ( section !== '' ) {
-                                       postData.rvsection = section;
-                               }
-                               return api.post( postData ).done( function ( result2 ) {
+                                       rvprop: [],
+                                       rvsection: section === '' ? undefined : section
+                               } ).done( function ( response ) {
                                        try {
-                                               var diffHtml = result2.query.pages[ result2.query.pageids[ 0 ] ]
+                                               var diffHtml = response.query.pages[ response.query.pageids[ 0 ] ]
                                                        .revisions[ 0 ].diff[ '*' ];
                                                $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
                                        } catch ( e ) {
                } else {
                        $wikiDiff.hide();
                        $.extend( postData, {
-                               pst: '',
-                               preview: '',
+                               pst: true,
+                               preview: true,
                                prop: 'text|displaytitle|modules|jsconfigvars|categorieshtml|templates|langlinks|limitreporthtml',
                                disableeditsection: true
                        } );
                                if ( response.parse.modules ) {
                                        mw.loader.load( response.parse.modules.concat(
                                                response.parse.modulescripts,
-                                               response.parse.modulestyles,
-                                               response.parse.modulemessages ) );
+                                               response.parse.modulestyles
+                                       ) );
                                }
                                if ( response.parse.displaytitle ) {
                                        $displaytitle = $( $.parseHTML( response.parse.displaytitle ) );
diff --git a/resources/src/mediawiki.api/mediawiki.ForeignApi.js b/resources/src/mediawiki.api/mediawiki.ForeignApi.js
deleted file mode 100644 (file)
index b8cc059..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-( function ( mw, $ ) {
-
-       /**
-        * Create an object like mw.Api, but automatically handling everything required to communicate
-        * with another MediaWiki wiki via cross-origin requests (CORS).
-        *
-        * The foreign wiki must be configured to accept requests from the current wiki. See
-        * <https://www.mediawiki.org/wiki/Manual:$wgCrossSiteAJAXdomains> for details.
-        *
-        *     var api = new mw.ForeignApi( 'https://commons.wikimedia.org/w/api.php' );
-        *     api.get( {
-        *         action: 'query',
-        *         meta: 'userinfo'
-        *     } ).done( function ( data ) {
-        *         console.log( data );
-        *     } );
-        *
-        * To ensure that the user at the foreign wiki is logged in, pass the `assert: 'user'` parameter
-        * to #get/#post (since MW 1.23): if they are not, the API request will fail. (Note that this
-        * doesn't guarantee that it's the same user.)
-        *
-        * Authentication-related MediaWiki extensions may extend this class to ensure that the user
-        * authenticated on the current wiki will be automatically authenticated on the foreign one. These
-        * extension modules should be registered using the ResourceLoaderForeignApiModules hook. See
-        * CentralAuth for a practical example. The general pattern to extend and override the name is:
-        *
-        *     function MyForeignApi() {};
-        *     OO.inheritClass( MyForeignApi, mw.ForeignApi );
-        *     mw.ForeignApi = MyForeignApi;
-        *
-        * @class mw.ForeignApi
-        * @extends mw.Api
-        * @since 1.26
-        *
-        * @constructor
-        * @param {string|mw.Uri} url URL pointing to another wiki's `api.php` endpoint.
-        * @param {Object} [options] See mw.Api.
-        *
-        * @author Bartosz Dziewoński
-        * @author Jon Robson
-        */
-       function CoreForeignApi( url, options ) {
-               if ( !url || $.isPlainObject( url ) ) {
-                       throw new Error( 'mw.ForeignApi() requires a `url` parameter' );
-               }
-
-               this.apiUrl = String( url );
-
-               options = $.extend( /*deep=*/ true,
-                       {
-                               ajax: {
-                                       url: this.apiUrl,
-                                       xhrFields: {
-                                               withCredentials: true
-                                       }
-                               },
-                               parameters: {
-                                       // Add 'origin' query parameter to all requests.
-                                       origin: this.getOrigin()
-                               }
-                       },
-                       options
-               );
-
-               // Call parent constructor
-               CoreForeignApi.parent.call( this, options );
-       }
-
-       OO.inheritClass( CoreForeignApi, mw.Api );
-
-       /**
-        * Return the origin to use for API requests, in the required format (protocol, host and port, if
-        * any).
-        *
-        * @protected
-        * @return {string}
-        */
-       CoreForeignApi.prototype.getOrigin = function () {
-               var origin = location.protocol + '//' + location.hostname;
-               if ( location.port ) {
-                       origin += ':' + location.port;
-               }
-               return origin;
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CoreForeignApi.prototype.ajax = function ( parameters, ajaxOptions ) {
-               var url, origin, newAjaxOptions;
-
-               // 'origin' query parameter must be part of the request URI, and not just POST request body
-               if ( ajaxOptions.type === 'POST' ) {
-                       url = ( ajaxOptions && ajaxOptions.url ) || this.defaults.ajax.url;
-                       origin = ( parameters && parameters.origin ) || this.defaults.parameters.origin;
-                       url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) +
-                               'origin=' + encodeURIComponent( origin );
-                       newAjaxOptions = $.extend( {}, ajaxOptions, { url: url } );
-               } else {
-                       newAjaxOptions = ajaxOptions;
-               }
-
-               return CoreForeignApi.parent.prototype.ajax.call( this, parameters, newAjaxOptions );
-       };
-
-       // Expose
-       mw.ForeignApi = CoreForeignApi;
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.category.js b/resources/src/mediawiki.api/mediawiki.api.category.js
deleted file mode 100644 (file)
index 14077e0..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * @class mw.Api.plugin.category
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Determine if a category exists.
-                *
-                * @param {mw.Title|string} title
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {boolean} return.done.isCategory Whether the category exists.
-                */
-               isCategory: function ( title ) {
-                       var apiPromise = this.get( {
-                               prop: 'categoryinfo',
-                               titles: String( title )
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var exists = false;
-                                       if ( data.query && data.query.pages ) {
-                                               $.each( data.query.pages, function ( id, page ) {
-                                                       if ( page.categoryinfo ) {
-                                                               exists = true;
-                                                       }
-                                               } );
-                                       }
-                                       return exists;
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               },
-
-               /**
-                * Get a list of categories that match a certain prefix.
-                *
-                * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables"...
-                *
-                * @param {string} prefix Prefix to match.
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string[]} return.done.categories Matched categories
-                */
-               getCategoriesByPrefix: function ( prefix ) {
-                       // Fetch with allpages to only get categories that have a corresponding description page.
-                       var apiPromise = this.get( {
-                               list: 'allpages',
-                               apprefix: prefix,
-                               apnamespace: mw.config.get( 'wgNamespaceIds' ).category
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var texts = [];
-                                       if ( data.query && data.query.allpages ) {
-                                               $.each( data.query.allpages, function ( i, category ) {
-                                                       texts.push( new mw.Title( category.title ).getMainText() );
-                                               } );
-                                       }
-                                       return texts;
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               },
-
-               /**
-                * Get the categories that a particular page on the wiki belongs to.
-                *
-                * @param {mw.Title|string} title
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
-                *  if title was not found.
-                */
-               getCategories: function ( title ) {
-                       var apiPromise = this.get( {
-                               prop: 'categories',
-                               titles: String( title )
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var titles = false;
-                                       if ( data.query && data.query.pages ) {
-                                               $.each( data.query.pages, function ( id, page ) {
-                                                       if ( page.categories ) {
-                                                               if ( titles === false ) {
-                                                                       titles = [];
-                                                               }
-                                                               $.each( page.categories, function ( i, cat ) {
-                                                                       titles.push( new mw.Title( cat.title ) );
-                                                               } );
-                                                       }
-                                               } );
-                                       }
-                                       return titles;
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.category
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.edit.js b/resources/src/mediawiki.api/mediawiki.api.edit.js
deleted file mode 100644 (file)
index e43285f..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * @class mw.Api.plugin.edit
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-
-               /**
-                * Post to API with edit token. If we have no token, get one and try to post.
-                * If we have a cached token try using that, and if it fails, blank out the
-                * cached token and start over.
-                *
-                * @param {Object} params API parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise} See #post
-                */
-               postWithEditToken: function ( params, ajaxOptions ) {
-                       return this.postWithToken( 'edit', params, ajaxOptions );
-               },
-
-               /**
-                * API helper to grab an edit token.
-                *
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.token Received token.
-                */
-               getEditToken: function () {
-                       return this.getToken( 'edit' );
-               },
-
-               /**
-                * Post a new section to the page.
-                *
-                * @see #postWithEditToken
-                * @param {mw.Title|String} title Target page
-                * @param {string} header
-                * @param {string} message wikitext message
-                * @param {Object} [additionalParams] Additional API parameters, e.g. `{ redirect: true }`
-                * @return {jQuery.Promise}
-                */
-               newSection: function ( title, header, message, additionalParams ) {
-                       return this.postWithEditToken( $.extend( {
-                               action: 'edit',
-                               section: 'new',
-                               title: String( title ),
-                               summary: header,
-                               text: message
-                       }, additionalParams ) );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.edit
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.js b/resources/src/mediawiki.api/mediawiki.api.js
deleted file mode 100644 (file)
index 43b20b8..0000000
+++ /dev/null
@@ -1,416 +0,0 @@
-( function ( mw, $ ) {
-
-       /**
-        * @class mw.Api
-        */
-
-       /**
-        * @property {Object} defaultOptions Default options for #ajax calls. Can be overridden by passing
-        *     `options` to mw.Api constructor.
-        * @property {Object} defaultOptions.parameters Default query parameters for API requests.
-        * @property {Object} defaultOptions.ajax Default options for jQuery#ajax.
-        * @private
-        */
-       var defaultOptions = {
-                       parameters: {
-                               action: 'query',
-                               format: 'json'
-                       },
-                       ajax: {
-                               url: mw.util.wikiScript( 'api' ),
-                               timeout: 30 * 1000, // 30 seconds
-                               dataType: 'json'
-                       }
-               },
-
-               // Keyed by ajax url and symbolic name for the individual request
-               promises = {};
-
-       // 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 ] = {};
-       $.each( mw.user.tokens.get(), function ( key, value ) {
-               // This requires #getToken to use the same key as user.tokens.
-               // Format: token-type + "Token" (eg. editToken, patrolToken, watchToken).
-               promises[ defaultOptions.ajax.url ][ key ] = $.Deferred()
-                       .resolve( value )
-                       .promise( { abort: function () {} } );
-       } );
-
-       /**
-        * Constructor to create an object to interact with the API of a particular MediaWiki server.
-        * mw.Api objects represent the API of a particular MediaWiki server.
-        *
-        *     var api = new mw.Api();
-        *     api.get( {
-        *         action: 'query',
-        *         meta: 'userinfo'
-        *     } ).done( function ( data ) {
-        *         console.log( data );
-        *     } );
-        *
-        * Since MW 1.25, multiple values for a parameter can be specified using an array:
-        *
-        *     var api = new mw.Api();
-        *     api.get( {
-        *         action: 'query',
-        *         meta: [ 'userinfo', 'siteinfo' ] // same effect as 'userinfo|siteinfo'
-        *     } ).done( function ( data ) {
-        *         console.log( data );
-        *     } );
-        *
-        * Since MW 1.26, boolean values for a parameter can be specified directly. If the value is
-        * `false` or `undefined`, the parameter will be omitted from the request, as required by the API.
-        *
-        * @constructor
-        * @param {Object} [options] See #defaultOptions documentation above. Can also be overridden for
-        *  each individual request by passing them to #get or #post (or directly #ajax) later on.
-        */
-       mw.Api = function ( options ) {
-               // TODO: Share API objects with exact same config.
-               options = options || {};
-
-               // Force a string if we got a mw.Uri object
-               if ( options.ajax && options.ajax.url !== undefined ) {
-                       options.ajax.url = String( options.ajax.url );
-               }
-
-               options.parameters = $.extend( {}, defaultOptions.parameters, options.parameters );
-               options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
-
-               this.defaults = options;
-       };
-
-       mw.Api.prototype = {
-
-               /**
-                * Perform API get request
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise}
-                */
-               get: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = ajaxOptions || {};
-                       ajaxOptions.type = 'GET';
-                       return this.ajax( parameters, ajaxOptions );
-               },
-
-               /**
-                * Perform API post request
-                *
-                * TODO: Post actions for non-local hostnames will need proxy.
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise}
-                */
-               post: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = ajaxOptions || {};
-                       ajaxOptions.type = 'POST';
-                       return this.ajax( parameters, ajaxOptions );
-               },
-
-               /**
-                * Massage parameters from the nice format we accept into a format suitable for the API.
-                *
-                * @private
-                * @param {Object} parameters (modified in-place)
-                */
-               preprocessParameters: function ( parameters ) {
-                       var key;
-                       // Handle common MediaWiki API idioms for passing parameters
-                       for ( key in parameters ) {
-                               // Multiple values are pipe-separated
-                               if ( $.isArray( parameters[ key ] ) ) {
-                                       parameters[ key ] = parameters[ key ].join( '|' );
-                               }
-                               // Boolean values are only false when not given at all
-                               if ( parameters[ key ] === false || parameters[ key ] === undefined ) {
-                                       delete parameters[ key ];
-                               }
-                       }
-               },
-
-               /**
-                * Perform the API call.
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise} Done: API response data and the jqXHR object.
-                *  Fail: Error code
-                */
-               ajax: function ( parameters, ajaxOptions ) {
-                       var token,
-                               apiDeferred = $.Deferred(),
-                               xhr, key, formData;
-
-                       parameters = $.extend( {}, this.defaults.parameters, parameters );
-                       ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
-
-                       // Ensure that token parameter is last (per [[mw:API:Edit#Token]]).
-                       if ( parameters.token ) {
-                               token = parameters.token;
-                               delete parameters.token;
-                       }
-
-                       this.preprocessParameters( parameters );
-
-                       // If multipart/form-data has been requested and emulation is possible, emulate it
-                       if (
-                               ajaxOptions.type === 'POST' &&
-                               window.FormData &&
-                               ajaxOptions.contentType === 'multipart/form-data'
-                       ) {
-
-                               formData = new FormData();
-
-                               for ( key in parameters ) {
-                                       formData.append( key, parameters[ key ] );
-                               }
-                               // If we extracted a token parameter, add it back in.
-                               if ( token ) {
-                                       formData.append( 'token', token );
-                               }
-
-                               ajaxOptions.data = formData;
-
-                               // Prevent jQuery from mangling our FormData object
-                               ajaxOptions.processData = false;
-                               // Prevent jQuery from overriding the Content-Type header
-                               ajaxOptions.contentType = false;
-                       } else {
-                               // Some deployed MediaWiki >= 1.17 forbid periods in URLs, due to an IE XSS bug
-                               // So let's escape them here. See bug #28235
-                               // This works because jQuery accepts data as a query string or as an Object
-                               ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
-
-                               // If we extracted a token parameter, add it back in.
-                               if ( token ) {
-                                       ajaxOptions.data += '&token=' + encodeURIComponent( token );
-                               }
-
-                               if ( ajaxOptions.contentType === 'multipart/form-data' ) {
-                                       // We were asked to emulate but can't, so drop the Content-Type header, otherwise
-                                       // it'll be wrong and the server will fail to decode the POST body
-                                       delete ajaxOptions.contentType;
-                               }
-                       }
-
-                       // Make the AJAX request
-                       xhr = $.ajax( ajaxOptions )
-                               // If AJAX fails, reject API call with error code 'http'
-                               // and details in second argument.
-                               .fail( function ( xhr, textStatus, exception ) {
-                                       apiDeferred.reject( 'http', {
-                                               xhr: xhr,
-                                               textStatus: textStatus,
-                                               exception: exception
-                                       } );
-                               } )
-                               // AJAX success just means "200 OK" response, also check API error codes
-                               .done( function ( result, textStatus, jqXHR ) {
-                                       if ( result === undefined || result === null || result === '' ) {
-                                               apiDeferred.reject( 'ok-but-empty',
-                                                       'OK response but empty result (check HTTP headers?)'
-                                               );
-                                       } else if ( result.error ) {
-                                               var code = result.error.code === undefined ? 'unknown' : result.error.code;
-                                               apiDeferred.reject( code, result );
-                                       } else {
-                                               apiDeferred.resolve( result, jqXHR );
-                                       }
-                               } );
-
-                       // Return the Promise
-                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
-                               if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) {
-                                       mw.log( 'mw.Api error: ', code, details );
-                               }
-                       } );
-               },
-
-               /**
-                * Post to API with specified type of token. If we have no token, get one and try to post.
-                * If we have a cached token try using that, and if it fails, blank out the
-                * cached token and start over. For example to change an user option you could do:
-                *
-                *     new mw.Api().postWithToken( 'options', {
-                *         action: 'options',
-                *         optionname: 'gender',
-                *         optionvalue: 'female'
-                *     } );
-                *
-                * @param {string} tokenType The name of the token, like options or edit.
-                * @param {Object} params API parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise} See #post
-                * @since 1.22
-                */
-               postWithToken: function ( tokenType, params, ajaxOptions ) {
-                       var api = this;
-
-                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
-                               params.token = token;
-                               return api.post( params, ajaxOptions ).then(
-                                       // If no error, return to caller as-is
-                                       null,
-                                       // Error handler
-                                       function ( code ) {
-                                               if ( code === 'badtoken' ) {
-                                                       api.badToken( tokenType );
-                                                       // Try again, once
-                                                       params.token = undefined;
-                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
-                                                               params.token = token;
-                                                               return api.post( params, ajaxOptions );
-                                                       } );
-                                               }
-
-                                               // Different error, pass on to let caller handle the error code
-                                               return this;
-                                       }
-                               );
-                       } );
-               },
-
-               /**
-                * Get a token for a certain action from the API.
-                *
-                * 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
-                */
-               getToken: function ( type, assert ) {
-                       var apiPromise,
-                               promiseGroup = promises[ this.defaults.ajax.url ],
-                               d = promiseGroup && promiseGroup[ type + 'Token' ];
-
-                       if ( !d ) {
-                               apiPromise = this.get( { action: 'tokens', type: type, assert: assert } );
-
-                               d = apiPromise
-                                       .then( function ( data ) {
-                                               if ( data.tokens && data.tokens[ type + 'token' ] ) {
-                                                       return data.tokens[ type + 'token' ];
-                                               }
-
-                                               // 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 );
-                                       }, function () {
-                                               // Clear promise. Do not cache errors.
-                                               delete promiseGroup[ type + 'Token' ];
-                                               // Pass on to allow the caller to handle the error
-                                               return this;
-                                       } )
-                                       // Attach abort handler
-                                       .promise( { abort: apiPromise.abort } );
-
-                               // Store deferred now so that we can use it again even if it isn't ready yet
-                               if ( !promiseGroup ) {
-                                       promiseGroup = promises[ this.defaults.ajax.url ] = {};
-                               }
-                               promiseGroup[ type + 'Token' ] = d;
-                       }
-
-                       return d;
-               },
-
-               /**
-                * Indicate that the cached token for a certain action of the API is bad.
-                *
-                * Call this if you get a 'badtoken' error when using the token returned by #getToken.
-                * You may also want to use #postWithToken instead, which invalidates bad cached tokens
-                * automatically.
-                *
-                * @param {string} type Token type
-                * @since 1.26
-                */
-               badToken: function ( type ) {
-                       var promiseGroup = promises[ this.defaults.ajax.url ];
-                       if ( promiseGroup ) {
-                               delete promiseGroup[ type + 'Token' ];
-                       }
-               }
-       };
-
-       /**
-        * @static
-        * @property {Array}
-        * List of errors we might receive from the API.
-        * For now, this just documents our expectation that there should be similar messages
-        * available.
-        */
-       mw.Api.errors = [
-               // occurs when POST aborted
-               // jQuery 1.4 can't distinguish abort or lost connection from 200 OK + empty result
-               'ok-but-empty',
-
-               // timeout
-               'timeout',
-
-               // really a warning, but we treat it like an error
-               'duplicate',
-               'duplicate-archive',
-
-               // upload succeeded, but no image info.
-               // this is probably impossible, but might as well check for it
-               'noimageinfo',
-               // remote errors, defined in API
-               'uploaddisabled',
-               'nomodule',
-               'mustbeposted',
-               'badaccess-groups',
-               'missingresult',
-               'missingparam',
-               'invalid-file-key',
-               'copyuploaddisabled',
-               'mustbeloggedin',
-               'empty-file',
-               'file-too-large',
-               'filetype-missing',
-               'filetype-banned',
-               'filetype-banned-type',
-               'filename-tooshort',
-               'illegal-filename',
-               'verification-error',
-               'hookaborted',
-               'unknown-error',
-               'internal-error',
-               'overwrite',
-               'badtoken',
-               'fetchfileerror',
-               'fileexists-shared-forbidden',
-               'invalidtitle',
-               'notloggedin',
-
-               // Stash-specific errors - expanded
-               'stashfailed',
-               'stasherror',
-               'stashedfilenotfound',
-               'stashpathinvalid',
-               'stashfilestorage',
-               'stashzerolength',
-               'stashnotloggedin',
-               'stashwrongowner',
-               'stashnosuchfilekey'
-       ];
-
-       /**
-        * @static
-        * @property {Array}
-        * List of warnings we might receive from the API.
-        * For now, this just documents our expectation that there should be similar messages
-        * available.
-        */
-       mw.Api.warnings = [
-               'duplicate',
-               'exists'
-       ];
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.login.js b/resources/src/mediawiki.api/mediawiki.api.login.js
deleted file mode 100644 (file)
index 2b709aa..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Make the two-step login easier.
- *
- * @author Niklas Laxström
- * @class mw.Api.plugin.login
- * @since 1.22
- */
-( function ( mw, $ ) {
-       'use strict';
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * @param {string} username
-                * @param {string} password
-                * @return {jQuery.Promise} See mw.Api#post
-                */
-               login: function ( username, password ) {
-                       var params, apiPromise, innerPromise,
-                               api = this;
-
-                       params = {
-                               action: 'login',
-                               lgname: username,
-                               lgpassword: password
-                       };
-
-                       apiPromise = api.post( params );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       params.lgtoken = data.login.token;
-                                       innerPromise = api.post( params )
-                                               .then( function ( data ) {
-                                                       var code;
-                                                       if ( data.login.result !== 'Success' ) {
-                                                               // Set proper error code whenever possible
-                                                               code = data.error && data.error.code || 'unknown';
-                                                               return $.Deferred().reject( code, data );
-                                                       }
-                                                       return data;
-                                               } );
-                                       return innerPromise;
-                               } )
-                               .promise( {
-                                       abort: function () {
-                                               apiPromise.abort();
-                                               if ( innerPromise ) {
-                                                       innerPromise.abort();
-                                               }
-                                       }
-                               } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.login
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.options.js b/resources/src/mediawiki.api/mediawiki.api.options.js
deleted file mode 100644 (file)
index 399e6f4..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * @class mw.Api.plugin.options
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-
-               /**
-                * Asynchronously save the value of a single user option using the API. See #saveOptions.
-                *
-                * @param {string} name
-                * @param {string|null} value
-                * @return {jQuery.Promise}
-                */
-               saveOption: function ( name, value ) {
-                       var param = {};
-                       param[ name ] = value;
-                       return this.saveOptions( param );
-               },
-
-               /**
-                * Asynchronously save the values of user options using the API.
-                *
-                * If a value of `null` is provided, the given option will be reset to the default value.
-                *
-                * Any warnings returned by the API, including warnings about invalid option names or values,
-                * are ignored. However, do not rely on this behavior.
-                *
-                * If necessary, the options will be saved using several parallel API requests. Only one promise
-                * is always returned that will be resolved when all requests complete.
-                *
-                * @param {Object} options Options as a `{ name: value, … }` object
-                * @return {jQuery.Promise}
-                */
-               saveOptions: function ( options ) {
-                       var name, value, bundleable,
-                               grouped = [],
-                               deferreds = [];
-
-                       for ( name in options ) {
-                               value = options[ name ] === null ? null : String( options[ name ] );
-
-                               // Can we bundle this option, or does it need a separate request?
-                               bundleable =
-                                       ( value === null || value.indexOf( '|' ) === -1 ) &&
-                                       ( name.indexOf( '|' ) === -1 && name.indexOf( '=' ) === -1 );
-
-                               if ( bundleable ) {
-                                       if ( value !== null ) {
-                                               grouped.push( name + '=' + value );
-                                       } else {
-                                               // Omitting value resets the option
-                                               grouped.push( name );
-                                       }
-                               } else {
-                                       if ( value !== null ) {
-                                               deferreds.push( this.postWithToken( 'options', {
-                                                       action: 'options',
-                                                       optionname: name,
-                                                       optionvalue: value
-                                               } ) );
-                                       } else {
-                                               // Omitting value resets the option
-                                               deferreds.push( this.postWithToken( 'options', {
-                                                       action: 'options',
-                                                       optionname: name
-                                               } ) );
-                                       }
-                               }
-                       }
-
-                       if ( grouped.length ) {
-                               deferreds.push( this.postWithToken( 'options', {
-                                       action: 'options',
-                                       change: grouped.join( '|' )
-                               } ) );
-                       }
-
-                       return $.when.apply( $, deferreds );
-               }
-
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.options
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.parse.js b/resources/src/mediawiki.api/mediawiki.api.parse.js
deleted file mode 100644 (file)
index bc3d44f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @class mw.Api.plugin.parse
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convenience method for 'action=parse'.
-                *
-                * @param {string} wikitext
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.data Parsed HTML of `wikitext`.
-                */
-               parse: function ( wikitext ) {
-                       var apiPromise = this.get( {
-                               action: 'parse',
-                               contentmodel: 'wikitext',
-                               text: wikitext
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       return data.parse.text[ '*' ];
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.parse
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.upload.js b/resources/src/mediawiki.api/mediawiki.api.upload.js
deleted file mode 100644 (file)
index 4abff28..0000000
+++ /dev/null
@@ -1,368 +0,0 @@
-/**
- * Provides an interface for uploading files to MediaWiki.
- *
- * @class mw.Api.plugin.upload
- * @singleton
- */
-( function ( mw, $ ) {
-       var nonce = 0,
-               fieldsAllowed = {
-                       stash: true,
-                       filekey: true,
-                       filename: true,
-                       comment: true,
-                       text: true,
-                       watchlist: true,
-                       ignorewarnings: true
-               };
-
-       /**
-        * @private
-        * Get nonce for iframe IDs on the page.
-        *
-        * @return {number}
-        */
-       function getNonce() {
-               return nonce++;
-       }
-
-       /**
-        * @private
-        * Get new iframe object for an upload.
-        *
-        * @return {HTMLIframeElement}
-        */
-       function getNewIframe( id ) {
-               var frame = document.createElement( 'iframe' );
-               frame.id = id;
-               frame.name = id;
-               return frame;
-       }
-
-       /**
-        * @private
-        * Shortcut for getting hidden inputs
-        *
-        * @return {jQuery}
-        */
-       function getHiddenInput( name, val ) {
-               return $( '<input type="hidden" />' )
-                       .attr( 'name', name )
-                       .val( val );
-       }
-
-       /**
-        * Process the result of the form submission, returned to an iframe.
-        * This is the iframe's onload event.
-        *
-        * @param {HTMLIframeElement} iframe Iframe to extract result from
-        * @return {Object} Response from the server. The return value may or may
-        *   not be an XMLDocument, this code was copied from elsewhere, so if you
-        *   see an unexpected return type, please file a bug.
-        */
-       function processIframeResult( iframe ) {
-               var json,
-                       doc = iframe.contentDocument || frames[ iframe.id ].document;
-
-               if ( doc.XMLDocument ) {
-                       // The response is a document property in IE
-                       return doc.XMLDocument;
-               }
-
-               if ( doc.body ) {
-                       // Get the json string
-                       // We're actually searching through an HTML doc here --
-                       // according to mdale we need to do this
-                       // because IE does not load JSON properly in an iframe
-                       json = $( doc.body ).find( 'pre' ).text();
-
-                       return JSON.parse( json );
-               }
-
-               // Response is a xml document
-               return doc;
-       }
-
-       function formDataAvailable() {
-               return window.FormData !== undefined &&
-                       window.File !== undefined &&
-                       window.File.prototype.slice !== undefined;
-       }
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Upload a file to MediaWiki.
-                *
-                * The file will be uploaded using AJAX and FormData, if the browser supports it, or via an
-                * iframe if it doesn't.
-                *
-                * Caveats of iframe upload:
-                * - The returned jQuery.Promise will not receive `progress` notifications during the upload
-                * - It is incompatible with uploads to a foreign wiki using mw.ForeignApi
-                * - You must pass a HTMLInputElement and not a File for it to be possible
-                *
-                * @param {HTMLInputElement|File} file HTML input type=file element with a file already inside
-                *     of it, or a File object.
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @return {jQuery.Promise}
-                */
-               upload: function ( file, data ) {
-                       var isFileInput, canUseFormData;
-
-                       isFileInput = file && file.nodeType === Node.ELEMENT_NODE;
-
-                       if ( formDataAvailable() && isFileInput && file.files ) {
-                               file = file.files[ 0 ];
-                       }
-
-                       if ( !file ) {
-                               return $.Deferred().reject( 'No file' );
-                       }
-
-                       canUseFormData = formDataAvailable() && file instanceof window.File;
-
-                       if ( !isFileInput && !canUseFormData ) {
-                               return $.Deferred().reject( 'Unsupported argument type passed to mw.Api.upload' );
-                       }
-
-                       if ( canUseFormData ) {
-                               return this.uploadWithFormData( file, data );
-                       }
-
-                       return this.uploadWithIframe( file, data );
-               },
-
-               /**
-                * Upload a file to MediaWiki with an iframe and a form.
-                *
-                * This method is necessary for browsers without the File/FormData
-                * APIs, and continues to work in browsers with those APIs.
-                *
-                * The rough sketch of how this method works is as follows:
-                * 1. An iframe is loaded with no content.
-                * 2. A form is submitted with the passed-in file input and some extras.
-                * 3. The MediaWiki API receives that form data, and sends back a response.
-                * 4. The response is sent to the iframe, because we set target=(iframe id)
-                * 5. The response is parsed out of the iframe's document, and passed back
-                *    through the promise.
-                *
-                * @private
-                * @param {HTMLInputElement} file The file input with a file in it.
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @return {jQuery.Promise}
-                */
-               uploadWithIframe: function ( file, data ) {
-                       var key,
-                               tokenPromise = $.Deferred(),
-                               api = this,
-                               deferred = $.Deferred(),
-                               nonce = getNonce(),
-                               id = 'uploadframe-' + nonce,
-                               $form = $( '<form>' ),
-                               iframe = getNewIframe( id ),
-                               $iframe = $( iframe );
-
-                       for ( key in data ) {
-                               if ( !fieldsAllowed[ key ] ) {
-                                       delete data[ key ];
-                               }
-                       }
-
-                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
-                       $form.addClass( 'mw-api-upload-form' );
-
-                       $form.css( 'display', 'none' )
-                               .attr( {
-                                       action: this.defaults.ajax.url,
-                                       method: 'POST',
-                                       target: id,
-                                       enctype: 'multipart/form-data'
-                               } );
-
-                       $iframe.one( 'load', function () {
-                               $iframe.one( 'load', function () {
-                                       var result = processIframeResult( iframe );
-
-                                       if ( !result ) {
-                                               deferred.reject( 'No response from API on upload attempt.' );
-                                       } else if ( result.error || result.warnings ) {
-                                               if ( result.error && result.error.code === 'badtoken' ) {
-                                                       api.badToken( 'edit' );
-                                               }
-
-                                               deferred.reject( result.error || result.warnings );
-                                       } else {
-                                               deferred.notify( 1 );
-                                               deferred.resolve( result );
-                                       }
-                               } );
-                               tokenPromise.done( function () {
-                                       $form.submit();
-                               } );
-                       } );
-
-                       $iframe.error( function ( error ) {
-                               deferred.reject( 'iframe failed to load: ' + error );
-                       } );
-
-                       $iframe.prop( 'src', 'about:blank' ).hide();
-
-                       file.name = 'file';
-
-                       $.each( data, function ( key, val ) {
-                               $form.append( getHiddenInput( key, val ) );
-                       } );
-
-                       if ( !data.filename && !data.stash ) {
-                               return $.Deferred().reject( 'Filename not included in file data.' );
-                       }
-
-                       if ( this.needToken() ) {
-                               this.getEditToken().then( function ( token ) {
-                                       $form.append( getHiddenInput( 'token', token ) );
-                                       tokenPromise.resolve();
-                               }, tokenPromise.reject );
-                       } else {
-                               tokenPromise.resolve();
-                       }
-
-                       $( 'body' ).append( $form, $iframe );
-
-                       deferred.always( function () {
-                               $form.remove();
-                               $iframe.remove();
-                       } );
-
-                       return deferred.promise();
-               },
-
-               /**
-                * Uploads a file using the FormData API.
-                *
-                * @private
-                * @param {File} file
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @return {jQuery.Promise}
-                */
-               uploadWithFormData: function ( file, data ) {
-                       var key,
-                               deferred = $.Deferred();
-
-                       for ( key in data ) {
-                               if ( !fieldsAllowed[ key ] ) {
-                                       delete data[ key ];
-                               }
-                       }
-
-                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
-                       data.file = file;
-
-                       if ( !data.filename && !data.stash ) {
-                               return $.Deferred().reject( 'Filename not included in file data.' );
-                       }
-
-                       // Use this.postWithEditToken() or this.post()
-                       this[ this.needToken() ? 'postWithEditToken' : 'post' ]( data, {
-                               // Use FormData (if we got here, we know that it's available)
-                               contentType: 'multipart/form-data',
-                               // Provide upload progress notifications
-                               xhr: function () {
-                                       var xhr = $.ajaxSettings.xhr();
-                                       if ( xhr.upload ) {
-                                               // need to bind this event before we open the connection (see note at
-                                               // https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest#Monitoring_progress)
-                                               xhr.upload.addEventListener( 'progress', function ( ev ) {
-                                                       if ( ev.lengthComputable ) {
-                                                               deferred.notify( ev.loaded / ev.total );
-                                                       }
-                                               } );
-                                       }
-                                       return xhr;
-                               }
-                       } )
-                               .done( function ( result ) {
-                                       if ( result.error || result.warnings ) {
-                                               deferred.reject( result.error || result.warnings );
-                                       } else {
-                                               deferred.notify( 1 );
-                                               deferred.resolve( result );
-                                       }
-                               } )
-                               .fail( function ( result ) {
-                                       deferred.reject( result );
-                               } );
-
-                       return deferred.promise();
-               },
-
-               /**
-                * Upload a file to the stash.
-                *
-                * This function will return a promise, which when resolved, will pass back a function
-                * to finish the stash upload. You can call that function with an argument containing
-                * more, or conflicting, data to pass to the server. For example:
-                *
-                *     // upload a file to the stash with a placeholder filename
-                *     api.uploadToStash( file, { filename: 'testing.png' } ).done( function ( finish ) {
-                *         // finish is now the function we can use to finalize the upload
-                *         // pass it a new filename from user input to override the initial value
-                *         finish( { filename: getFilenameFromUser() } ).done( function ( data ) {
-                *             // the upload is complete, data holds the API response
-                *         } );
-                *     } );
-                *
-                * @param {File|HTMLInputElement} file
-                * @param {Object} [data]
-                * @return {jQuery.Promise}
-                * @return {Function} return.finishStashUpload Call this function to finish the upload.
-                * @return {Object} return.finishStashUpload.data Additional data for the upload.
-                * @return {jQuery.Promise} return.finishStashUpload.return API promise for the final upload
-                * @return {Object} return.finishStashUpload.return.data API return value for the final upload
-                */
-               uploadToStash: function ( file, data ) {
-                       var filekey,
-                               api = this;
-
-                       if ( !data.filename ) {
-                               return $.Deferred().reject( 'Filename not included in file data.' );
-                       }
-
-                       function finishUpload( moreData ) {
-                               data = $.extend( data, moreData );
-                               data.filekey = filekey;
-                               data.action = 'upload';
-                               data.format = 'json';
-
-                               if ( !data.filename ) {
-                                       return $.Deferred().reject( 'Filename not included in file data.' );
-                               }
-
-                               return api.postWithEditToken( data ).then( function ( result ) {
-                                       if ( result.upload && ( result.upload.error || result.upload.warnings ) ) {
-                                               return $.Deferred().reject( result.upload.error || result.upload.warnings ).promise();
-                                       }
-                                       return result;
-                               } );
-                       }
-
-                       return this.upload( file, { stash: true, filename: data.filename } ).then( function ( result ) {
-                               if ( result && result.upload && result.upload.filekey ) {
-                                       filekey = result.upload.filekey;
-                               } else if ( result && ( result.error || result.warning ) ) {
-                                       return $.Deferred().reject( result );
-                               }
-
-                               return finishUpload;
-                       } );
-               },
-
-               needToken: function () {
-                       return true;
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.upload
-        */
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.watch.js b/resources/src/mediawiki.api/mediawiki.api.watch.js
deleted file mode 100644 (file)
index a2ff129..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * @class mw.Api.plugin.watch
- * @since 1.19
- */
-( function ( mw, $ ) {
-
-       /**
-        * @private
-        * @static
-        * @context mw.Api
-        *
-        * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
-        *  array thereof. If an array is passed, the return value passed to the promise will also be an
-        *  array of appropriate objects.
-        * @return {jQuery.Promise}
-        * @return {Function} return.done
-        * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
-        *  parameter)
-        * @return {string} return.done.watch.title Full pagename
-        * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
-        * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
-        */
-       function doWatchInternal( pages, addParams ) {
-               // XXX: Parameter addParams is undocumented because we inherit this
-               // documentation in the public method...
-               var apiPromise = this.postWithToken( 'watch',
-                       $.extend(
-                               {
-                                       action: 'watch',
-                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
-                                       uselang: mw.config.get( 'wgUserLanguage' )
-                               },
-                               addParams
-                       )
-               );
-
-               return apiPromise
-                       .then( function ( data ) {
-                               // If a single page was given (not an array) respond with a single item as well.
-                               return $.isArray( pages ) ? data.watch : data.watch[ 0 ];
-                       } )
-                       .promise( { abort: apiPromise.abort } );
-       }
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convenience method for `action=watch`.
-                *
-                * @inheritdoc #doWatchInternal
-                */
-               watch: function ( pages ) {
-                       return doWatchInternal.call( this, pages );
-               },
-
-               /**
-                * Convenience method for `action=watch&unwatch=1`.
-                *
-                * @inheritdoc #doWatchInternal
-                */
-               unwatch: function ( pages ) {
-                       return doWatchInternal.call( this, pages, { unwatch: 1 } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.watch
-        */
-
-}( mediaWiki, jQuery ) );
index ee1d6ef..ccc68f1 100644 (file)
@@ -7,6 +7,7 @@
 // cases.
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
+       /*global $ */
        'use strict';
 
        var grammarForms = mediaWiki.language.getData( 'ru', 'grammarForms' );
@@ -52,6 +53,31 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                                word = word.slice( 0, -3 ) + 'нике';
                        }
                        break;
+               case 'languagegen': // язык в родительном падеже ("(с) русского")
+                       if ( word.slice( -3 ) === 'кий' ) {
+                               word = word.slice( 0, -2 ) + 'ого';
+                       } else if ( $.inArray( word, [ 'иврит', 'идиш' ] ) > -1 ) {
+                               word = word + 'а';
+                       }
+                       break;
+               case 'languageprep': // язык в предложном падеже ("(на) русском")
+                       if ( word.slice( -3 ) === 'кий' ) {
+                               word = word.slice( 0, -2 ) + 'ом';
+                       } else if ( $.inArray( word, [ 'иврит', 'идиш' ] ) > -1 ) {
+                               word = word + 'е';
+                       }
+                       break;
+               case 'languageadverb': // наречие с названием языка ("по-русски")
+                       if ( word.slice( -3 ) === 'кий' ) {
+                               word = 'по-' + word.slice( 0, -1 );
+                       } else if ( $.inArray( word, [ 'иврит', 'идиш' ] ) > -1 ) {
+                               word = 'на ' + word + 'е';
+                       } else if ( $.inArray( word, [ 'идо', 'урду', 'хинди', 'эсперанто' ] ) > -1 ) {
+                               word = 'на ' + word;
+                       } else {
+                               word = 'на языке ' + word;
+                       }
+                       break;
        }
        return word;
 };
index a22874b..138045c 100644 (file)
@@ -9,29 +9,24 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        }
        switch ( form ) {
                case 'genitive': // родовий відмінок
-                       if ( word.slice( -4 ) !== 'вікі' && word.slice( -4 ) !== 'Вікі' ) {
-                               if ( word.slice( -1 ) === 'ь' ) {
-                                       word = word.slice( 0, -1 ) + 'я';
-                               } else if ( word.slice( -2 ) === 'ія' ) {
-                                       word = word.slice( 0, -2 ) + 'ії';
-                               } else if ( word.slice( -2 ) === 'ка' ) {
-                                       word = word.slice( 0, -2 ) + 'ки';
-                               } else if ( word.slice( -2 ) === 'ти' ) {
-                                       word = word.slice( 0, -2 ) + 'тей';
-                               } else if ( word.slice( -2 ) === 'ды' ) {
-                                       word = word.slice( 0, -2 ) + 'дов';
-                               } else if ( word.slice( -3 ) === 'ник' ) {
-                                       word = word.slice( 0, -3 ) + 'ника';
-                               }
+                       if ( word.slice( -2 ) === 'ія' ) {
+                               word = word.slice( 0, -2 ) + 'ії';
+                       } else if ( word.slice( -2 ) === 'ти' ) {
+                               word = word.slice( 0, -2 ) + 'т';
+                       } else if ( word.slice( -2 ) === 'ди' ) {
+                               word = word.slice( 0, -2 ) + 'дів';
+                       } else if ( word.slice( -3 ) === 'ник' ) {
+                               word = word.slice( 0, -3 ) + 'ника';
                        }
+
                        break;
                case 'accusative': // знахідний відмінок
-                       if ( word.slice( -4 ) !== 'вікі' && word.slice( -4 ) !== 'Вікі' ) {
-                               if ( word.slice( -2 ) === 'ія' ) {
-                                       word = word.slice( 0, -2 ) + 'ію';
-                               }
+                       if ( word.slice( -2 ) === 'ія' ) {
+                               word = word.slice( 0, -2 ) + 'ію';
                        }
+
                        break;
        }
+
        return word;
 };
index e1b3198..77fa753 100644 (file)
@@ -147,24 +147,11 @@ span.texhtml {
 /**
  * Links
  */
-a.stub,
-a.new {
-       color: #ba0000;
-       text-decoration: none;
-}
-
 a {
-       color: black !important;
        background: none !important;
        padding: 0 !important;
 }
 
-a:link, a:visited {
-       color: #520;
-       background: transparent;
-       text-decoration: underline;
-}
-
 /* Expand URLs for printing */
 .mw-body a.external.text:after,
 .mw-body a.external.autonumber:after {
index 961c02b..dd37051 100644 (file)
@@ -116,16 +116,6 @@ abbr[title],
        unicode-bidi: isolate;
 }
 
-/**
- * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
- * [[Special:Watchlist/edit]] and in category listings.
- */
-.allpagesredirect,
-.redirect-in-category,
-.watchlistredir {
-       font-style: italic;
-}
-
 /* Comment portions of RC entries */
 span.comment {
        font-style: italic;
index 91366ff..113fb00 100644 (file)
@@ -16,6 +16,7 @@
        /**
         * Post a message (with subject and body) to a talk page.
         *
+        * @abstract
         * @param {string} subject Subject/topic title; plaintext only (no wikitext or HTML)
         * @param {string} body Body, as wikitext.  Signature code will automatically be added
         *   by MessagePosters that require one, unless the message already contains the string
index 296576b..ad01865 100644 (file)
@@ -39,7 +39,7 @@
                        if ( resp.edit.result === 'Success' ) {
                                return $.Deferred().resolve( resp, jqXHR );
                        } else {
-                               // mediawiki.api.js checks for resp.error.  Are there actually cases where the
+                               // mw.Api checks for response error.  Are there actually cases where the
                                // request fails, but it's not caught there?
                                return $.Deferred().reject( 'api-unexpected' );
                        }
index 6f9aa02..4d0231f 100644 (file)
@@ -64,7 +64,7 @@
                return this.api.get( {
                        action: 'query',
                        prop: 'info',
-                       indexpageids: 1,
+                       indexpageids: true,
                        titles: title.getPrefixedDb()
                } ).then( function ( result ) {
                        if ( result.query.pageids && result.query.pageids.length > 0 ) {
diff --git a/resources/src/mediawiki.page/mediawiki.page.gallery.css b/resources/src/mediawiki.page/mediawiki.page.gallery.css
deleted file mode 100644 (file)
index 20deb21..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Galleries */
-/* These display attributes look nonsensical, but are needed to support IE and FF2 */
-/* Don't forget to update mediawiki.page.gallery.print.css */
-li.gallerybox {
-       vertical-align: top;
-       display: -moz-inline-box;
-       display: inline-block;
-}
-
-ul.gallery,
-li.gallerybox {
-       zoom: 1;
-       *display: inline;
-}
-
-ul.gallery {
-       margin: 2px;
-       padding: 2px;
-       display: block;
-}
-
-li.gallerycaption {
-       font-weight: bold;
-       text-align: center;
-       display: block;
-       word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-       text-align: center;
-       border: 1px solid #ccc;
-       background-color: #f9f9f9;
-       margin: 2px;
-}
-
-li.gallerybox div.thumb img {
-       display: block;
-       margin: 0 auto;
-}
-
-div.gallerytext {
-       overflow: hidden;
-       font-size: 94%;
-       padding: 2px 4px;
-       word-wrap: break-word;
-}
-
-/* new gallery stuff */
-ul.mw-gallery-nolines li.gallerybox div.thumb {
-       background-color: transparent;
-       border: none;
-}
-
-ul.mw-gallery-nolines li.gallerybox div.gallerytext {
-       text-align: center;
-}
-
-/* height constrained gallery */
-
-ul.mw-gallery-packed li.gallerybox div.thumb,
-ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
-ul.mw-gallery-packed-hover li.gallerybox div.thumb {
-       background-color: transparent;
-       border: none;
-}
-
-ul.mw-gallery-packed li.gallerybox div.thumb img,
-ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
-ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
-       margin: 0 auto;
-}
-
-ul.mw-gallery-packed-hover li.gallerybox,
-ul.mw-gallery-packed-overlay li.gallerybox {
-       position: relative;
-}
-
-ul.mw-gallery-packed-hover div.gallerytextwrapper {
-       overflow: hidden;
-       height: 0;
-}
-
-ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
-ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
-ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
-       position: absolute;
-       background: white;
-       background: rgba(255, 255, 255, 0.8);
-       padding: 5px 10px;
-       bottom: 0;
-       left: 0; /* Needed for IE */
-       height: auto;
-       font-weight: bold;
-       margin: 2px; /* correspond to style on div.thumb */
-}
-
-ul.mw-gallery-packed-hover,
-ul.mw-gallery-packed-overlay,
-ul.mw-gallery-packed {
-       text-align: center;
-}
diff --git a/resources/src/mediawiki.page/mediawiki.page.gallery.js b/resources/src/mediawiki.page/mediawiki.page.gallery.js
deleted file mode 100644 (file)
index dfccf21..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-/*!
- * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
- * Also Dynamically resize images to justify them.
- */
-( function ( mw, $ ) {
-       var $galleries,
-               bound = false,
-               // Is there a better way to detect a touchscreen? Current check taken from stack overflow.
-               isTouchScreen = !!( window.ontouchstart !== undefined ||
-                       window.DocumentTouch !== undefined && document instanceof window.DocumentTouch
-               );
-
-       /**
-        * Perform the layout justification.
-        *
-        * @ignore
-        * @context {HTMLElement} A `ul.mw-gallery-*` element
-        */
-       function justify() {
-               var lastTop,
-                       $img,
-                       imgWidth,
-                       imgHeight,
-                       captionWidth,
-                       rows = [],
-                       $gallery = $( this );
-
-               $gallery.children( 'li' ).each( function () {
-                       // Math.floor to be paranoid if things are off by 0.00000000001
-                       var top = Math.floor( $( this ).position().top ),
-                               $this = $( this );
-
-                       if ( top !== lastTop ) {
-                               rows[ rows.length ] = [];
-                               lastTop = top;
-                       }
-
-                       $img = $this.find( 'div.thumb a.image img' );
-                       if ( $img.length && $img[ 0 ].height ) {
-                               imgHeight = $img[ 0 ].height;
-                               imgWidth = $img[ 0 ].width;
-                       } else {
-                               // If we don't have a real image, get the containing divs width/height.
-                               // Note that if we do have a real image, using this method will generally
-                               // give the same answer, but can be different in the case of a very
-                               // narrow image where extra padding is added.
-                               imgHeight = $this.children().children( 'div:first' ).height();
-                               imgWidth = $this.children().children( 'div:first' ).width();
-                       }
-
-                       // Hack to make an edge case work ok
-                       if ( imgHeight < 30 ) {
-                               // Don't try and resize this item.
-                               imgHeight = 0;
-                       }
-
-                       captionWidth = $this.children().children( 'div.gallerytextwrapper' ).width();
-                       rows[ rows.length - 1 ][ rows[ rows.length - 1 ].length ] = {
-                               $elm: $this,
-                               width: $this.outerWidth(),
-                               imgWidth: imgWidth,
-                               // XXX: can divide by 0 ever happen?
-                               aspect: imgWidth / imgHeight,
-                               captionWidth: captionWidth,
-                               height: imgHeight
-                       };
-
-                       // Save all boundaries so we can restore them on window resize
-                       $this.data( 'imgWidth', imgWidth );
-                       $this.data( 'imgHeight', imgHeight );
-                       $this.data( 'width', $this.outerWidth() );
-                       $this.data( 'captionWidth', captionWidth );
-               } );
-
-               ( function () {
-                       var maxWidth,
-                               combinedAspect,
-                               combinedPadding,
-                               curRow,
-                               curRowHeight,
-                               wantedWidth,
-                               preferredHeight,
-                               newWidth,
-                               padding,
-                               $outerDiv,
-                               $innerDiv,
-                               $imageDiv,
-                               $imageElm,
-                               imageElm,
-                               $caption,
-                               i,
-                               j,
-                               avgZoom,
-                               totalZoom = 0;
-
-                       for ( i = 0; i < rows.length; i++ ) {
-                               maxWidth = $gallery.width();
-                               combinedAspect = 0;
-                               combinedPadding = 0;
-                               curRow = rows[ i ];
-                               curRowHeight = 0;
-
-                               for ( j = 0; j < curRow.length; j++ ) {
-                                       if ( curRowHeight === 0 ) {
-                                               if ( isFinite( curRow[ j ].height ) ) {
-                                                       // Get the height of this row, by taking the first
-                                                       // non-out of bounds height
-                                                       curRowHeight = curRow[ j ].height;
-                                               }
-                                       }
-
-                                       if ( curRow[ j ].aspect === 0 || !isFinite( curRow[ j ].aspect ) ) {
-                                               // One of the dimensions are 0. Probably should
-                                               // not try to resize.
-                                               combinedPadding += curRow[ j ].width;
-                                       } else {
-                                               combinedAspect += curRow[ j ].aspect;
-                                               combinedPadding += curRow[ j ].width - curRow[ j ].imgWidth;
-                                       }
-                               }
-
-                               // Add some padding for inter-element spacing.
-                               combinedPadding += 5 * curRow.length;
-                               wantedWidth = maxWidth - combinedPadding;
-                               preferredHeight = wantedWidth / combinedAspect;
-
-                               if ( preferredHeight > curRowHeight * 1.5 ) {
-                                       // Only expand at most 1.5 times current size
-                                       // As that's as high a resolution as we have.
-                                       // Also on the off chance there is a bug in this
-                                       // code, would prevent accidentally expanding to
-                                       // be 10 billion pixels wide.
-                                       if ( i === rows.length - 1 ) {
-                                               // If its the last row, and we can't fit it,
-                                               // don't make the entire row huge.
-                                               avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
-                                               if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
-                                                       preferredHeight = avgZoom;
-                                               } else {
-                                                       // Probably a single row gallery
-                                                       preferredHeight = curRowHeight;
-                                               }
-                                       } else {
-                                               preferredHeight = 1.5 * curRowHeight;
-                                       }
-                               }
-                               if ( !isFinite( preferredHeight ) ) {
-                                       // This *definitely* should not happen.
-                                       // Skip this row.
-                                       continue;
-                               }
-                               if ( preferredHeight < 5 ) {
-                                       // Well something clearly went wrong...
-                                       // Skip this row.
-                                       continue;
-                               }
-
-                               if ( preferredHeight / curRowHeight > 1 ) {
-                                       totalZoom += preferredHeight / curRowHeight;
-                               } else {
-                                       // If we shrink, still consider that a zoom of 1
-                                       totalZoom += 1;
-                               }
-
-                               for ( j = 0; j < curRow.length; j++ ) {
-                                       newWidth = preferredHeight * curRow[ j ].aspect;
-                                       padding = curRow[ j ].width - curRow[ j ].imgWidth;
-                                       $outerDiv = curRow[ j ].$elm;
-                                       $innerDiv = $outerDiv.children( 'div' ).first();
-                                       $imageDiv = $innerDiv.children( 'div.thumb' );
-                                       $imageElm = $imageDiv.find( 'img' ).first();
-                                       imageElm = $imageElm.length ? $imageElm[ 0 ] : null;
-                                       $caption = $outerDiv.find( 'div.gallerytextwrapper' );
-
-                                       // Since we are going to re-adjust the height, the vertical
-                                       // centering margins need to be reset.
-                                       $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
-
-                                       if ( newWidth < 60 || !isFinite( newWidth ) ) {
-                                               // Making something skinnier than this will mess up captions,
-                                               if ( newWidth < 1 || !isFinite( newWidth ) ) {
-                                                       $innerDiv.height( preferredHeight );
-                                                       // Don't even try and touch the image size if it could mean
-                                                       // making it disappear.
-                                                       continue;
-                                               }
-                                       } else {
-                                               $outerDiv.width( newWidth + padding );
-                                               $innerDiv.width( newWidth + padding );
-                                               $imageDiv.width( newWidth );
-                                               $caption.width( curRow[ j ].captionWidth + ( newWidth - curRow[ j ].imgWidth ) );
-                                       }
-
-                                       if ( imageElm ) {
-                                               // We don't always have an img, e.g. in the case of an invalid file.
-                                               imageElm.width = newWidth;
-                                               imageElm.height = preferredHeight;
-                                       } else {
-                                               // Not a file box.
-                                               $imageDiv.height( preferredHeight );
-                                       }
-                               }
-                       }
-               }() );
-       }
-
-       function handleResizeStart() {
-               $galleries.children( 'li' ).each( function () {
-                       var imgWidth = $( this ).data( 'imgWidth' ),
-                               imgHeight = $( this ).data( 'imgHeight' ),
-                               width = $( this ).data( 'width' ),
-                               captionWidth = $( this ).data( 'captionWidth' ),
-                               $innerDiv = $( this ).children( 'div' ).first(),
-                               $imageDiv = $innerDiv.children( 'div.thumb' ),
-                               $imageElm, imageElm;
-
-                       // Restore original sizes so we can arrange the elements as on freshly loaded page
-                       $( this ).width( width );
-                       $innerDiv.width( width );
-                       $imageDiv.width( imgWidth );
-                       $( this ).find( 'div.gallerytextwrapper' ).width( captionWidth );
-
-                       $imageElm = $( this ).find( 'img' ).first();
-                       imageElm = $imageElm.length ? $imageElm[ 0 ] : null;
-                       if ( imageElm ) {
-                               imageElm.width = imgWidth;
-                               imageElm.height = imgHeight;
-                       } else {
-                               $imageDiv.height( imgHeight );
-                       }
-               } );
-       }
-
-       function handleResizeEnd() {
-               $galleries.each( justify );
-       }
-
-       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               if ( isTouchScreen ) {
-                       // Always show the caption for a touch screen.
-                       $content.find( 'ul.mw-gallery-packed-hover' )
-                               .addClass( 'mw-gallery-packed-overlay' )
-                               .removeClass( 'mw-gallery-packed-hover' );
-               } else {
-                       // Note use of just "a", not a.image, since we want this to trigger if a link in
-                       // the caption receives focus
-                       $content.find( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
-                               // Confusingly jQuery leaves e.type as focusout for delegated blur events
-                               var gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
-                               $( this ).closest( 'li.gallerybox' ).toggleClass( 'mw-gallery-focused', gettingFocus );
-                       } );
-               }
-
-               $galleries = $content.find( 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed' );
-               // Call the justification asynchronous because live preview fires the hook with detached $content.
-               setTimeout( function () {
-                       $galleries.each( justify );
-
-                       // Bind here instead of in the top scope as the callbacks use $galleries.
-                       if ( !bound ) {
-                               bound = true;
-                               $( window )
-                                       .resize( $.debounce( 300, true, handleResizeStart ) )
-                                       .resize( $.debounce( 300, handleResizeEnd ) );
-                       }
-               } );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.gallery.print.css b/resources/src/mediawiki.page/mediawiki.page.gallery.print.css
deleted file mode 100644 (file)
index 0c14865..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-li.gallerybox {
-       vertical-align: top;
-       display: inline-block;
-}
-
-ul.gallery, li.gallerybox {
-       zoom: 1;
-       *display: inline;
-}
-
-ul.gallery {
-       margin: 2px;
-       padding: 2px;
-       display: block;
-}
-
-li.gallerycaption {
-       font-weight: bold;
-       text-align: center;
-       display: block;
-       word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-       text-align: center;
-       border: 1px solid #ccc;
-       margin: 2px;
-}
-
-div.gallerytext {
-       overflow: hidden;
-       font-size: 94%;
-       padding: 2px 4px;
-       word-wrap: break-word;
-}
diff --git a/resources/src/mediawiki.page/mediawiki.page.image.pagination.js b/resources/src/mediawiki.page/mediawiki.page.image.pagination.js
deleted file mode 100644 (file)
index 49a51df..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-/*!
- * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
- */
-( function ( mw, $ ) {
-       /*jshint latedef:false */
-       var jqXhr, $multipageimage, $spinner,
-               cache = {},
-               cacheOrder = [];
-
-       /* Fetch the next page, caching up to 10 last-loaded pages.
-        * @param {string} url
-        * @return {jQuery.Promise}
-        */
-       function fetchPageData( url ) {
-               if ( jqXhr && jqXhr.abort ) {
-                       // Prevent race conditions and piling up pending requests
-                       jqXhr.abort();
-               }
-               jqXhr = undefined;
-
-               // Try the cache
-               if ( cache[ url ] ) {
-                       // Update access freshness
-                       cacheOrder.splice( $.inArray( url, cacheOrder ), 1 );
-                       cacheOrder.push( url );
-                       return $.Deferred().resolve( cache[ url ] ).promise();
-               }
-
-               // @todo Don't fetch the entire page. Ideally we'd only fetch the content portion or the data
-               // (thumbnail urls) and update the interface manually.
-               jqXhr = $.ajax( url ).then( function ( data ) {
-                       return $( data ).find( 'table.multipageimage' ).contents();
-               } );
-
-               // Handle cache updates
-               jqXhr.done( function ( $contents ) {
-                       jqXhr = undefined;
-
-                       // Cache the newly loaded page
-                       cache[ url ] = $contents;
-                       cacheOrder.push( url );
-
-                       // Remove the oldest entry if we're over the limit
-                       if ( cacheOrder.length > 10 ) {
-                               delete cache[ cacheOrder[ 0 ] ];
-                               cacheOrder = cacheOrder.slice( 1 );
-                       }
-               } );
-
-               return jqXhr.promise();
-       }
-
-       /* Fetch the next page and use jQuery to swap the table.multipageimage contents.
-        * @param {string} url
-        * @param {boolean} [hist=false] Whether this is a load triggered by history navigation (if
-        *   true, this function won't push a new history state, for the browser did so already).
-        */
-       function switchPage( url, hist ) {
-               var $tr, promise;
-
-               // Start fetching data (might be cached)
-               promise = fetchPageData( url );
-
-               // Add a new spinner if one doesn't already exist and the data is not already ready
-               if ( !$spinner && promise.state() !== 'resolved' ) {
-                       $tr = $multipageimage.find( 'tr' );
-                       $spinner = $.createSpinner( {
-                               size: 'large',
-                               type: 'block'
-                       } )
-                               // Copy the old content dimensions equal so that the current scroll position is not
-                               // lost between emptying the table is and receiving the new contents.
-                               .css( {
-                                       height: $tr.outerHeight(),
-                                       width: $tr.outerWidth()
-                               } );
-
-                       $multipageimage.empty().append( $spinner );
-               }
-
-               promise.done( function ( $contents ) {
-                       $spinner = undefined;
-
-                       // Replace table contents
-                       $multipageimage.empty().append( $contents.clone() );
-
-                       bindPageNavigation( $multipageimage );
-
-                       // Fire hook because the page's content has changed
-                       mw.hook( 'wikipage.content' ).fire( $multipageimage );
-
-                       // Update browser history and address bar. But not if we came here from a history
-                       // event, in which case the url is already updated by the browser.
-                       if ( history.pushState && !hist ) {
-                               history.pushState( { tag: 'mw-pagination' }, document.title, url );
-                       }
-               } );
-       }
-
-       function bindPageNavigation( $container ) {
-               $container.find( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
-                       var page, uri;
-
-                       // Generate the same URL on client side as the one generated in ImagePage::openShowImage.
-                       // We avoid using the URL in the link directly since it could have been manipulated (bug 66608)
-                       page = Number( mw.util.getParamValue( 'page', this.href ) );
-                       uri = new mw.Uri( mw.util.wikiScript() )
-                               .extend( { title: mw.config.get( 'wgPageName' ), page: page } )
-                               .toString();
-
-                       switchPage( uri );
-                       e.preventDefault();
-               } );
-
-               $container.find( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
-                       switchPage( this.action + '?' + $( this ).serialize() );
-                       e.preventDefault();
-               } );
-       }
-
-       $( function () {
-               if ( mw.config.get( 'wgNamespaceNumber' ) !== 6 ) {
-                       return;
-               }
-               $multipageimage = $( 'table.multipageimage' );
-               if ( !$multipageimage.length ) {
-                       return;
-               }
-
-               bindPageNavigation( $multipageimage );
-
-               // Update the url using the History API (if available)
-               if ( history.pushState && history.replaceState ) {
-                       history.replaceState( { tag: 'mw-pagination' }, '' );
-                       $( window ).on( 'popstate', function ( e ) {
-                               var state = e.originalEvent.state;
-                               if ( state && state.tag === 'mw-pagination' ) {
-                                       switchPage( location.href, true );
-                               }
-                       } );
-               }
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js b/resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js
deleted file mode 100644 (file)
index f9b0d35..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*!
- * Animate patrol links to use asynchronous API requests to
- * patrol pages, rather than navigating to a different URI.
- *
- * @since 1.21
- * @author Marius Hoch <hoo@online.de>
- */
-( function ( mw, $ ) {
-       if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
-               // Current user has no patrol right, or an old cached version of user.tokens
-               // that didn't have patrolToken yet.
-               return;
-       }
-       $( function () {
-               var $patrolLinks = $( '.patrollink a' );
-               $patrolLinks.on( 'click', function ( e ) {
-                       var $spinner, href, rcid, apiRequest;
-
-                       // Start preloading the notification module (normally loaded by mw.notify())
-                       mw.loader.load( 'mediawiki.notification' );
-
-                       // Hide the link and create a spinner to show it inside the brackets.
-                       $spinner = $.createSpinner( {
-                               size: 'small',
-                               type: 'inline'
-                       } );
-                       $( this ).hide().after( $spinner );
-
-                       href = $( this ).attr( 'href' );
-                       rcid = mw.util.getParamValue( 'rcid', href );
-                       apiRequest = new mw.Api();
-
-                       apiRequest.postWithToken( 'patrol', {
-                               action: 'patrol',
-                               rcid: rcid
-                       } )
-                       .done( function ( data ) {
-                               // Remove all patrollinks from the page (including any spinners inside).
-                               $patrolLinks.closest( '.patrollink' ).remove();
-                               if ( data.patrol !== undefined ) {
-                                       // Success
-                                       var title = new mw.Title( data.patrol.title );
-                                       mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
-                               } else {
-                                       // This should never happen as errors should trigger fail
-                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ), { type: 'error' } );
-                               }
-                       } )
-                       .fail( function ( error ) {
-                               $spinner.remove();
-                               // Restore the patrol link. This allows the user to try again
-                               // (or open it in a new window, bypassing this ajax module).
-                               $patrolLinks.show();
-                               if ( error === 'noautopatrol' ) {
-                                       // Can't patrol own
-                                       mw.notify( mw.msg( 'markedaspatrollederror-noautopatrol' ), { type: 'warn' } );
-                               } else {
-                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ), { type: 'error' } );
-                               }
-                       } );
-
-                       e.preventDefault();
-               } );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.ready.js b/resources/src/mediawiki.page/mediawiki.page.ready.js
deleted file mode 100644 (file)
index 8ec4cf0..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-( function ( mw, $ ) {
-       var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
-
-       // Break out of framesets
-       if ( mw.config.get( 'wgBreakFrames' ) ) {
-               // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
-               // it works only comparing to window.self or window.window (http://stackoverflow.com/q/4850978/319266)
-               if ( window.top !== window.self ) {
-                       // Un-trap us from framesets
-                       window.top.location.href = location.href;
-               }
-       }
-
-       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $sortableTables;
-
-               // Run jquery.placeholder polyfill if placeholder is not supported
-               if ( !supportsPlaceholder ) {
-                       $content.find( 'input[placeholder]' ).placeholder();
-               }
-
-               // Run jquery.makeCollapsible
-               $content.find( '.mw-collapsible' ).makeCollapsible();
-
-               // Lazy load jquery.tablesorter
-               $sortableTables = $content.find( 'table.sortable' );
-               if ( $sortableTables.length ) {
-                       mw.loader.using( 'jquery.tablesorter', function () {
-                               $sortableTables.tablesorter();
-                       } );
-               }
-
-               // Run jquery.checkboxShiftClick
-               $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
-       } );
-
-       // Things outside the wikipage content
-       $( function () {
-               var $nodes;
-
-               if ( !supportsPlaceholder ) {
-                       // Exclude content to avoid hitting it twice for the (first) wikipage content
-                       $( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
-               }
-
-               // Add accesskey hints to the tooltips
-               if ( document.querySelectorAll ) {
-                       // If we're running on a browser where we can do this efficiently,
-                       // just find all elements that have accesskeys. We can't use jQuery's
-                       // polyfill for the selector since looping over all elements on page
-                       // load might be too slow.
-                       $nodes = $( document.querySelectorAll( '[accesskey]' ) );
-               } else {
-                       // Otherwise go through some elements likely to have accesskeys rather
-                       // than looping over all of them. Unfortunately this will not fully
-                       // work for custom skins with different HTML structures. Input, label
-                       // and button should be rare enough that no optimizations are needed.
-                       $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label, button' );
-               }
-               $nodes.updateTooltipAccessKeys();
-
-               // Infuse OOUI widgets, if any are present
-               $nodes = $( '[data-ooui]' );
-               if ( $nodes.length ) {
-                       mw.loader.using( 'mediawiki.widgets' ).done( function () {
-                               $nodes.each( function () {
-                                       OO.ui.infuse( this );
-                               } );
-                       } );
-               }
-
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.startup.js b/resources/src/mediawiki.page/mediawiki.page.startup.js
deleted file mode 100644 (file)
index 708dcb5..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-( function ( mw, $ ) {
-
-       // Support: MediaWiki < 1.26
-       // Cached HTML will not yet have this from OutputPage::getHeadScripts.
-       document.documentElement.className = document.documentElement.className
-               .replace( /(^|\s)client-nojs(\s|$)/, '$1client-js$2' );
-
-       mw.page = {};
-
-       $( function () {
-               mw.util.init();
-
-               /**
-                * Fired when wiki content is being added to the DOM
-                *
-                * It is encouraged to fire it before the main DOM is changed (when $content
-                * is still detatched).  However, this order is not defined either way, so you
-                * should only rely on $content itself.
-                *
-                * This includes the ready event on a page load (including post-edit loads)
-                * and when content has been previewed with LivePreview.
-                *
-                * @event wikipage_content
-                * @member mw.hook
-                * @param {jQuery} $content The most appropriate element containing the content,
-                *   such as #mw-content-text (regular content root) or #wikiPreview (live preview
-                *   root)
-                */
-               mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.watch.ajax.js b/resources/src/mediawiki.page/mediawiki.page.watch.ajax.js
deleted file mode 100644 (file)
index a3197da..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * Animate watch/unwatch links to use asynchronous API requests to
- * watch pages, rather than navigating to a different URI.
- *
- * @class mw.page.watch.ajax
- */
-( function ( mw, $ ) {
-       // The name of the page to watch or unwatch
-       var title = mw.config.get( 'wgRelevantPageName' );
-
-       /**
-        * Update the link text, link href attribute and (if applicable)
-        * "loading" class.
-        *
-        * @param {jQuery} $link Anchor tag of (un)watch link
-        * @param {string} action One of 'watch', 'unwatch'
-        * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
-        */
-       function updateWatchLink( $link, action, state ) {
-               var msgKey, $li, otherAction;
-
-               // A valid but empty jQuery object shouldn't throw a TypeError
-               if ( !$link.length ) {
-                       return;
-               }
-
-               // Invalid actions shouldn't silently turn the page in an unrecoverable state
-               if ( action !== 'watch' && action !== 'unwatch' ) {
-                       throw new Error( 'Invalid action' );
-               }
-
-               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
-               msgKey = state === 'loading' ? action + 'ing' : action;
-               otherAction = action === 'watch' ? 'unwatch' : 'watch';
-               $li = $link.closest( 'li' );
-
-               // Trigger a 'watchpage' event for this List item.
-               // Announce the otherAction value as the first param.
-               // Used to monitor the state of watch link.
-               // TODO: Revise when system wide hooks are implemented
-               if ( state === undefined ) {
-                       $li.trigger( 'watchpage.mw', otherAction );
-               }
-
-               $link
-                       .text( mw.msg( msgKey ) )
-                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) )
-                       .updateTooltipAccessKeys()
-                       .attr( 'href', mw.util.wikiScript() + '?' + $.param( {
-                                       title: title,
-                                       action: action
-                               } )
-                       );
-
-               // Most common ID style
-               if ( $li.prop( 'id' ) === 'ca-' + otherAction ) {
-                       $li.prop( 'id', 'ca-' + action );
-               }
-
-               if ( state === 'loading' ) {
-                       $link.addClass( 'loading' );
-               } else {
-                       $link.removeClass( 'loading' );
-               }
-       }
-
-       /**
-        * TODO: This should be moved somewhere more accessible.
-        *
-        * @private
-        * @param {string} url
-        * @return {string} The extracted action, defaults to 'view'
-        */
-       function mwUriGetAction( url ) {
-               var action, actionPaths, key, i, m, parts;
-
-               // TODO: Does MediaWiki give action path or query param
-               // precedence? If the former, move this to the bottom
-               action = mw.util.getParamValue( 'action', url );
-               if ( action !== null ) {
-                       return action;
-               }
-
-               actionPaths = mw.config.get( 'wgActionPaths' );
-               for ( key in actionPaths ) {
-                       if ( actionPaths.hasOwnProperty( key ) ) {
-                               parts = actionPaths[ key ].split( '$1' );
-                               for ( i = 0; i < parts.length; i++ ) {
-                                       parts[ i ] = mw.RegExp.escape( parts[ i ] );
-                               }
-                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
-                               if ( m && m[ 1 ] ) {
-                                       return key;
-                               }
-
-                       }
-               }
-
-               return 'view';
-       }
-
-       // Expose public methods
-       mw.page.watch = {
-               updateWatchLink: updateWatchLink
-       };
-
-       $( function () {
-               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
-                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
-                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
-
-               // Allowing people to add inline animated links is a little scary
-               $links = $links.filter( ':not( #bodyContent *, #content * )' );
-
-               $links.click( function ( e ) {
-                       var action, api, $link;
-
-                       // Start preloading the notification module (normally loaded by mw.notify())
-                       mw.loader.load( 'mediawiki.notification' );
-
-                       action = mwUriGetAction( this.href );
-
-                       if ( action !== 'watch' && action !== 'unwatch' ) {
-                               // Could not extract target action from link url,
-                               // let native browsing handle it further
-                               return true;
-                       }
-                       e.preventDefault();
-                       e.stopPropagation();
-
-                       $link = $( this );
-
-                       if ( $link.hasClass( 'loading' ) ) {
-                               return;
-                       }
-
-                       updateWatchLink( $link, action, 'loading' );
-
-                       api = new mw.Api();
-
-                       api[ action ]( title )
-                               .done( function ( watchResponse ) {
-                                       var otherAction = action === 'watch' ? 'unwatch' : 'watch';
-
-                                       mw.notify( $.parseHTML( watchResponse.message ), {
-                                               tag: 'watch-self'
-                                       } );
-
-                                       // Set link to opposite
-                                       updateWatchLink( $link, otherAction );
-
-                                       // Update the "Watch this page" checkbox on action=edit when the
-                                       // page is watched or unwatched via the tab (bug 12395).
-                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched !== undefined );
-                               } )
-                               .fail( function () {
-                                       var cleanTitle, msg, link;
-
-                                       // Reset link to non-loading mode
-                                       updateWatchLink( $link, action );
-
-                                       // Format error message
-                                       cleanTitle = title.replace( /_/g, ' ' );
-                                       link = mw.html.element(
-                                               'a', {
-                                                       href: mw.util.getUrl( title ),
-                                                       title: cleanTitle
-                                               }, cleanTitle
-                                       );
-                                       msg = mw.message( 'watcherrortext', link );
-
-                                       // Report to user about the error
-                                       mw.notify( msg, {
-                                               tag: 'watch-self',
-                                               type: 'error'
-                                       } );
-                               } );
-               } );
-       } );
-
-}( mediaWiki, jQuery ) );
index a13ec3c..60544d3 100644 (file)
@@ -39,6 +39,9 @@ ul.mw-allpages-chunk li {
        vertical-align: top;
        width: 31%;
 }
+.allpagesredirect {
+       font-style: italic;
+}
 
 /* Special:BlockList */
 table.mw-blocklist span.mw-usertoollinks,
@@ -52,6 +55,11 @@ span.mw-blocklist-actions {
        font-weight: bold;
 }
 
+/* Special:EditWatchlist */
+.watchlistredir {
+       font-style: italic;
+}
+
 /* Special:EmailUser */
 td#mw-emailuser-sender,
 td#mw-emailuser-recipient {
index bad1c08..9b790e0 100644 (file)
@@ -51,8 +51,8 @@ jQuery( function ( $ ) {
         * It uses document.getElementById for security reasons (HTML injections in $()).
         *
         * @ignore
-        * @param {String} name the name of a tab without the prefix ("mw-prefsection-")
-        * @param {String} [mode] A hash will be set according to the current
+        * @param {string} name the name of a tab without the prefix ("mw-prefsection-")
+        * @param {string} [mode] A hash will be set according to the current
         *  open section. Set mode 'noHash' to surpress this.
         */
        function switchPrefTab( name, mode ) {
index 677d26d..7693340 100644 (file)
@@ -68,7 +68,7 @@
                                titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
                                prop: 'imageinfo',
                                iiprop: 'uploadwarning',
-                               indexpageids: ''
+                               indexpageids: true
                        } ).done( function ( result ) {
                                var resultOut = '';
                                if ( result.query ) {
                                text: '{{' + license + '}}',
                                title: $( '#wpDestFile' ).val() || 'File:Sample.jpg',
                                prop: 'text',
-                               pst: ''
+                               pst: true
                        } ).done( function ( result ) {
                                $spinnerLicense.remove();
                                uploadLicense.processResult( result, license );
                 *
                 * TODO: Is there a way we can ask the browser what's supported in `<img>`s?
                 *
-                * TODO: Put SVG back after working around Firefox 7 bug <https://bugzilla.wikimedia.org/show_bug.cgi?id=31643>
+                * TODO: Put SVG back after working around Firefox 7 bug <https://phabricator.wikimedia.org/T33643>
                 *
                 * @param {File} file
                 * @return {boolean}
index 0469cc5..bb26c0f 100644 (file)
                 *     addButtons( [ { .. }, { .. }, { .. } ] );
                 *     addButtons( { .. }, { .. } );
                 *
-                * @param {Object|Array...} [buttons] An array of button objects or the first
+                * @param {...Object|Array} [buttons] An array of button objects or the first
                 *  button object in a list of variadic arguments.
                 */
                addButtons: function ( buttons ) {
index d65b284..f86a41d 100644 (file)
@@ -40,3 +40,8 @@
 #mw-editbutton-hr {
        .background-image("images/@{button-hr}");
 }
+
+// Awful workaround for T113868, while it awaits a better fix.
+#mw-t113868 {
+       background-image: url(images/ar/button_bold.png), url(images/ar/button_headline.png), url(images/ar/button_italic.png), url(images/ar/button_link.png), url(images/ar/button_nowiki.png), url(images/be-tarask/button_bold.png), url(images/be-tarask/button_italic.png), url(images/be-tarask/button_link.png), url(images/de/button_bold.png), url(images/de/button_italic.png), url(images/en/button_bold.png), url(images/en/button_extlink.png), url(images/en/button_headline.png), url(images/en/button_hr.png), url(images/en/button_image.png), url(images/en/button_italic.png), url(images/en/button_link.png), url(images/en/button_media.png), url(images/en/button_nowiki.png), url(images/en/button_sig.png), url(images/fa/button_bold.png), url(images/fa/button_headline.png), url(images/fa/button_italic.png), url(images/fa/button_link.png), url(images/fa/button_nowiki.png), url(images/ksh/button_italic.png), url(images/ru/button_bold.png), url(images/ru/button_italic.png), url(images/ru/button_link.png);
+}
index 49acfef..d5e5b96 100644 (file)
@@ -15,6 +15,7 @@
         * @class
         * @extends OO.ui.Widget
         * @mixins OO.ui.mixin.TabIndexedElement
+        * @mixins OO.ui.mixin.FloatableElement
         *
         * @constructor
         * @param {Object} [config] Configuration options
@@ -32,6 +33,7 @@
 
                // Mixin constructors
                OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$element } ) );
+               OO.ui.mixin.FloatableElement.call( this, config );
 
                // Properties
                this.precision = config.precision || 'day';
 
        OO.inheritClass( mw.widgets.CalendarWidget, OO.ui.Widget );
        OO.mixinClass( mw.widgets.CalendarWidget, OO.ui.mixin.TabIndexedElement );
+       OO.mixinClass( mw.widgets.CalendarWidget, OO.ui.mixin.FloatableElement );
 
        /* Events */
 
         * @param {string|null} [fade=null] Direction in which to fade out current calendar contents,
         *     'previous', 'next', 'up' or 'down'; or 'auto', which has the same result as 'previous' or
         *     'next' depending on whether the current date is later or earlier than the previous.
-        * @returns {string} Format
         */
        mw.widgets.CalendarWidget.prototype.updateUI = function ( fade ) {
                var items, today, selected, currentMonth, currentYear, currentDay, i, needsFade,
                }
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CalendarWidget.prototype.toggle = function ( visible ) {
+               // Parent method
+               mw.widgets.CalendarWidget.parent.prototype.toggle.call( this, visible );
+
+               if ( this.$floatableContainer ) {
+                       this.togglePositioning( this.isVisible() );
+               }
+
+               return this;
+       };
+
 }( jQuery, mediaWiki ) );
index 21a9019..9d30eb8 100644 (file)
        // 7x7 grid
        width: @calendarWidth / 7;
        line-height: @calendarHeight / 7;
-       // Don't overlap the hacked-up fake box-shadow border we get inside DateInputWidget when focussed
+       // Don't overlap the hacked-up fake box-shadow border we get when focussed
        &:nth-child(7n) {
                width: @calendarWidth / 7 - 0.2em;
                margin-right: 0.2em;
        // 2x6 grid
        width: @calendarWidth / 2;
        line-height: @calendarHeight / 6;
-       // Don't overlap the hacked-up fake box-shadow border we get inside DateInputWidget when focussed
+       // Don't overlap the hacked-up fake box-shadow border we get when focussed
        &:nth-child(2n) {
                width: @calendarWidth / 2 - 0.2em;
                margin-right: 0.2em;
        // 5x4 grid
        width: @calendarWidth / 5;
        line-height: @calendarHeight / 4;
-       // Don't overlap the hacked-up fake box-shadow border we get inside DateInputWidget when focussed
+       // Don't overlap the hacked-up fake box-shadow border we get when focussed
        &:nth-child(5n) {
                width: @calendarWidth / 5 - 0.2em;
                margin-right: 0.2em;
 }
 
 /* Theme-specific */
+.mw-widget-calendarWidget {
+       box-shadow: inset 0 0 0 1px #ccc;
+}
+
+.mw-widget-calendarWidget:focus {
+       outline: none;
+       box-shadow: inset 0 0 0 2px #347bff;
+}
+
 .mw-widget-calendarWidget-day {
        color: #444;
+       border-radius: 0.1em;
 }
 
 .mw-widget-calendarWidget-day-heading {
 
 .mw-widget-calendarWidget-day-today {
        box-shadow: inset 0 0 0 1px #3787fb;
-       border-radius: ((@calendarHeight / 7) / 2);
 }
 
 .mw-widget-calendarWidget-item-selected {
        background-color: #d8e6fe;
        color: #3787fb;
-
-       &.mw-widget-calendarWidget-day,
-       &.mw-widget-calendarWidget-day-heading {
-               border-radius: ((@calendarHeight / 7) / 2);
-       }
-
-       &.mw-widget-calendarWidget-month {
-               border-radius: ((@calendarHeight / 6) / 2);
-       }
-
-       &.mw-widget-calendarWidget-year {
-               border-radius: ((@calendarHeight / 4) / 2);
-       }
 }
 
 .mw-widget-calendarWidget-item:hover {
        background-color: #eee;
-
-       &.mw-widget-calendarWidget-day,
-       &.mw-widget-calendarWidget-day-heading {
-               border-radius: ((@calendarHeight / 7) / 4);
-               // Hide the border from .mw-widget-calendarWidget-day-today
-               box-shadow: none;
-       }
-
-       &.mw-widget-calendarWidget-month {
-               border-radius: ((@calendarHeight / 6) / 4);
-       }
-
-       &.mw-widget-calendarWidget-year {
-               border-radius: ((@calendarHeight / 4) / 4);
-       }
 }
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js b/resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js
new file mode 100644 (file)
index 0000000..f1c4f6f
--- /dev/null
@@ -0,0 +1,139 @@
+/*!
+ * MediaWiki Widgets - CategoryCapsuleItemWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * @class mw.widgets.CategoryCapsuleItemWidget
+        */
+
+       var processExistenceCheckQueueDebounced,
+               api = new mw.Api(),
+               currentRequest = null,
+               existenceCache = {},
+               existenceCheckQueue = {};
+
+       // The existence checking code really could be refactored into a separate class.
+
+       /**
+        * @private
+        */
+       function processExistenceCheckQueue() {
+               var queue, titles;
+               if ( currentRequest ) {
+                       // Don't fire off a million requests at the same time
+                       currentRequest.always( function () {
+                               currentRequest = null;
+                               processExistenceCheckQueueDebounced();
+                       } );
+                       return;
+               }
+               queue = existenceCheckQueue;
+               existenceCheckQueue = {};
+               titles = Object.keys( queue ).filter( function ( title ) {
+                       if ( existenceCache.hasOwnProperty( title ) ) {
+                               queue[ title ].resolve( existenceCache[ title ] );
+                       }
+                       return !existenceCache.hasOwnProperty( title );
+               } );
+               if ( !titles.length ) {
+                       return;
+               }
+               currentRequest = api.get( {
+                       action: 'query',
+                       prop: [ 'info' ],
+                       titles: titles
+               } ).done( function ( response ) {
+                       var index, curr, title;
+                       for ( index in response.query.pages ) {
+                               curr = response.query.pages[ index ];
+                               title = mw.Title.newFromText( curr.title ).getPrefixedText();
+                               existenceCache[ title ] = curr.missing === undefined;
+                               queue[ title ].resolve( existenceCache[ title ] );
+                       }
+               } );
+       }
+
+       processExistenceCheckQueueDebounced = OO.ui.debounce( processExistenceCheckQueue );
+
+       /**
+        * Register a request to check whether a page exists.
+        *
+        * @private
+        * @param {mw.Title} title
+        * @return {jQuery.Promise} Promise resolved with true if the page exists or false otherwise
+        */
+       function checkPageExistence( title ) {
+               var key = title.getPrefixedText();
+               if ( !existenceCheckQueue[ key ] ) {
+                       existenceCheckQueue[ key ] = $.Deferred();
+               }
+               processExistenceCheckQueueDebounced();
+               return existenceCheckQueue[ key ].promise();
+       }
+
+       /**
+        * Category selector capsule item widget. Extends OO.ui.CapsuleItemWidget with the ability to link
+        * to the given page, and to show its existence status (i.e., whether it is a redlink).
+        *
+        * @uses mw.Api
+        * @extends OO.ui.CapsuleItemWidget
+        *
+        * @constructor
+        * @param {Object} config Configuration options
+        * @cfg {mw.Title} title Page title to use (required)
+        */
+       mw.widgets.CategoryCapsuleItemWidget = function MWWCategoryCapsuleItemWidget( config ) {
+               // Parent constructor
+               mw.widgets.CategoryCapsuleItemWidget.parent.call( this, $.extend( {
+                       data: config.title.getMainText(),
+                       label: config.title.getMainText()
+               }, config ) );
+
+               // Properties
+               this.title = config.title;
+               this.$link = $( '<a>' )
+                       .text( this.label )
+                       .attr( 'target', '_blank' )
+                       .on( 'click', function ( e ) {
+                               // CapsuleMultiSelectWidget really wants to prevent you from clicking the link, don't let it
+                               e.stopPropagation();
+                       } );
+
+               // Initialize
+               this.setMissing( false );
+               this.$label.replaceWith( this.$link );
+               this.setLabelElement( this.$link );
+               checkPageExistence( this.title ).done( function ( exists ) {
+                       this.setMissing( !exists );
+               }.bind( this ) );
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.CategoryCapsuleItemWidget, OO.ui.CapsuleItemWidget );
+
+       /* Methods */
+
+       /**
+        * Update label link href and CSS classes to reflect page existence status.
+        *
+        * @private
+        * @param {boolean} missing Whether the page is missing (does not exist)
+        */
+       mw.widgets.CategoryCapsuleItemWidget.prototype.setMissing = function ( missing ) {
+               if ( !missing ) {
+                       this.$link
+                               .attr( 'href', this.title.getUrl() )
+                               .removeClass( 'new' );
+               } else {
+                       this.$link
+                               .attr( 'href', this.title.getUrl( { action: 'edit', redlink: 1 } ) )
+                               .addClass( 'new' );
+               }
+       };
+
+}( jQuery, mediaWiki ) );
index 8d6452c..e40caaa 100644 (file)
@@ -5,34 +5,67 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 ( function ( $, mw ) {
+       var CSP,
+               NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
 
        /**
         * Category selector widget. Displays an OO.ui.CapsuleMultiSelectWidget
         * and autocompletes with available categories.
         *
-        * @class
+        *     var selector = new mw.widgets.CategorySelector( {
+        *       searchTypes: [
+        *         mw.widgets.CategorySelector.SearchType.OpenSearch,
+        *         mw.widgets.CategorySelector.SearchType.InternalSearch
+        *       ]
+        *     } );
+        *
+        *     $( '#content' ).append( selector.$element );
+        *
+        *     selector.setSearchType( [ mw.widgets.CategorySelector.SearchType.SubCategories ] );
+        *
+        *
+        * @class mw.widgets.CategorySelector
         * @uses mw.Api
         * @extends OO.ui.CapsuleMultiSelectWidget
         *
         * @constructor
         * @param {Object} [config] Configuration options
         * @cfg {number} [limit=10] Maximum number of results to load
+        * @cfg {mw.widgets.CategorySelector.SearchType[]} [searchTypes=[mw.widgets.CategorySelector.SearchType.OpenSearch]]
+        *   Default search API to use when searching.
         */
-       mw.widgets.CategorySelector = function ( config ) {
+       function CategorySelector( config ) {
                // Config initialization
-               config = $.extend( { limit: 10 }, config );
+               config = $.extend( {
+                       limit: 10,
+                       searchTypes: [ CategorySelector.SearchType.OpenSearch ]
+               }, config );
                this.limit = config.limit;
+               this.searchTypes = config.searchTypes;
+               this.validateSearchTypes();
 
                // Parent constructor
-               mw.widgets.CategorySelector.parent.call( this, config );
+               mw.widgets.CategorySelector.parent.call( this, $.extend( true, {}, config, {
+                       menu: {
+                               filterFromInput: false
+                       },
+                       // This allows the user to both select non-existent categories, and prevents the selector from
+                       // being wiped from #onMenuItemsChange when we change the available options in the dropdown
+                       allowArbitrary: true
+               } ) );
 
                // Event handler to call the autocomplete methods
                this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
-       };
+
+               // Initialize
+               this.api = new mw.Api();
+
+       }
 
        /* Setup */
 
-       OO.inheritClass( mw.widgets.CategorySelector, OO.ui.CapsuleMultiSelectWidget );
+       OO.inheritClass( CategorySelector, OO.ui.CapsuleMultiSelectWidget );
+       CSP = CategorySelector.prototype;
 
        /* Methods */
 
@@ -44,7 +77,8 @@
         * @private
         * @method
         */
-       mw.widgets.CategorySelector.prototype.updateMenuItems = function () {
+       CSP.updateMenuItems = function () {
+               this.getMenu().clearItems();
                this.getNewMenuItems( this.$input.val() ).then( function ( items ) {
                        var existingItems, filteredItems,
                                menu = this.getMenu();
                                } );
                        } );
 
-                       menu.addItems( filteredItems ).updateItemVisibility();
+                       menu.addItems( filteredItems ).toggle( true );
                }.bind( this ) );
        };
 
         * @param {string} input The input used to prefix search categories
         * @return {jQuery.Promise} Resolves with an array of categories
         */
-       mw.widgets.CategorySelector.prototype.getNewMenuItems = function ( input ) {
-               var deferred = new $.Deferred(),
-                       catNsId = mw.config.get( 'wgNamespaceIds' ).category,
-                       api = new mw.Api();
-
-               api.get( {
-                       action: 'opensearch',
-                       namespace: catNsId,
-                       limit: this.limit,
-                       search: input
-               } ).done( function ( res ) {
-                       var categoryNames = res[ 1 ].map( function ( name ) {
-                               return mw.Title.newFromText( name, catNsId ).getMainText();
+       CSP.getNewMenuItems = function ( input ) {
+               var i,
+                       promises = [],
+                       deferred = new $.Deferred();
+
+               for ( i = 0; i < this.searchTypes.length; i++ ) {
+                       promises.push( this.searchCategories( input, this.searchTypes[ i ] ) );
+               }
+
+               $.when.apply( $, promises ).done( function () {
+                       var categories, categoryNames,
+                               allData = [],
+                               dataSets = Array.prototype.slice.apply( arguments );
+
+                       // Collect values from all results
+                       allData = allData.concat.apply( allData, dataSets );
+
+                       // Remove duplicates
+                       categories = allData.filter( function ( value, index, self ) {
+                               return self.indexOf( value ) === index;
+                       } );
+
+                       // Get titles
+                       categoryNames = categories.map( function ( name ) {
+                               return mw.Title.newFromText( name, NS_CATEGORY ).getMainText();
                        } );
 
                        deferred.resolve( categoryNames );
+
                } );
 
                return deferred.promise();
        };
+
+       /**
+        * @inheritdoc
+        */
+       CSP.createItemWidget = function ( data ) {
+               return new mw.widgets.CategoryCapsuleItemWidget( {
+                       title: mw.Title.newFromText( data, NS_CATEGORY )
+               } );
+       };
+
+       /**
+        * Validates the values in `this.searchType`.
+        *
+        * @private
+        * @return {boolean}
+        */
+       CSP.validateSearchTypes = function () {
+               var validSearchTypes = false,
+                       searchTypeEnumCount = Object.keys( CategorySelector.SearchType ).length;
+
+               // Check if all values are in the SearchType enum
+               validSearchTypes = this.searchTypes.every( function ( searchType ) {
+                       return searchType > -1 && searchType < searchTypeEnumCount;
+               } );
+
+               if ( validSearchTypes === false ) {
+                       throw new Error( 'Unknown searchType in searchTypes' );
+               }
+
+               // If the searchTypes has CategorySelector.SearchType.SubCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( CategorySelector.SearchType.SubCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.SubCategories' );
+               }
+
+               // If the searchTypes has CategorySelector.SearchType.ParentCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( CategorySelector.SearchType.ParentCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.ParentCategories' );
+               }
+
+               return true;
+       };
+
+       /**
+        * Sets and validates the value of `this.searchType`.
+        *
+        * @param {mw.widgets.CategorySelector.SearchType[]} searchTypes
+        */
+       CSP.setSearchTypes = function ( searchTypes ) {
+               this.searchTypes = searchTypes;
+               this.validateSearchTypes();
+       };
+
+       /**
+        * Searches categories based on input and searchType.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @param {mw.widgets.CategorySelector.SearchType} searchType
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       CSP.searchCategories = function ( input, searchType ) {
+               var deferred = new $.Deferred();
+
+               switch ( searchType ) {
+                       case CategorySelector.SearchType.OpenSearch:
+                               this.api.get( {
+                                       action: 'opensearch',
+                                       namespace: NS_CATEGORY,
+                                       limit: this.limit,
+                                       search: input
+                               } ).done( function ( res ) {
+                                       var categories = res[ 1 ];
+                                       deferred.resolve( categories );
+                               } );
+                               break;
+
+                       case CategorySelector.SearchType.InternalSearch:
+                               this.api.get( {
+                                       action: 'query',
+                                       list: 'allpages',
+                                       apnamespace: NS_CATEGORY,
+                                       aplimit: this.limit,
+                                       apfrom: input,
+                                       apprefix: input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.allpages.map( function ( page ) {
+                                               return page.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } );
+                               break;
+
+                       case CategorySelector.SearchType.Exists:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       action: 'query',
+                                       prop: 'info',
+                                       titles: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var page,
+                                               categories = [];
+
+                                       for ( page in res.query.pages ) {
+                                               if ( parseInt( page, 10 ) > -1 ) {
+                                                       categories.push( res.query.pages[ page ].title );
+                                               }
+                                       }
+
+                                       deferred.resolve( categories );
+                               } );
+                               break;
+
+                       case CategorySelector.SearchType.SubCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       action: 'query',
+                                       list: 'categorymembers',
+                                       cmtype: 'subcat',
+                                       cmlimit: this.limit,
+                                       cmtitle: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.categorymembers.map( function ( category ) {
+                                               return category.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } );
+                               break;
+
+                       case CategorySelector.SearchType.ParentCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       action: 'query',
+                                       prop: 'categories',
+                                       cllimit: this.limit,
+                                       titles: 'Category:' + input
+                               } ).done( function ( res )  {
+                                       var page,
+                                               categories = [];
+
+                                       for ( page in res.query.pages ) {
+                                               if ( parseInt( page, 10 ) > -1 ) {
+                                                       if ( $.isArray( res.query.pages[ page ].categories ) ) {
+                                                               categories.push.apply( categories, res.query.pages[ page ].categories.map( function ( category ) {
+                                                                       return category.title;
+                                                               } ) );
+                                                       }
+                                               }
+                                       }
+
+                                       deferred.resolve( categories );
+                               } );
+                               break;
+
+                       default:
+                               throw new Error( 'Unknown searchType' );
+               }
+
+               return deferred.promise();
+       };
+
+       /**
+        * @enum mw.widgets.CategorySelector.SearchType
+        * Types of search available.
+        */
+       CategorySelector.SearchType = {
+               /** Search using action=opensearch */
+               OpenSearch: 0,
+
+               /** Search using action=query */
+               InternalSearch: 1,
+
+               /** Search for existing categories with the exact title */
+               Exists: 2,
+
+               /** Search only subcategories  */
+               SubCategories: 3,
+
+               /** Search only parent categories */
+               ParentCategories: 4
+       };
+
+       mw.widgets.CategorySelector = CategorySelector;
 }( jQuery, mediaWiki ) );
index 657d9c5..9231fcc 100644 (file)
@@ -57,6 +57,7 @@
         *
         * @class
         * @extends OO.ui.InputWidget
+        * @mixins OO.ui.mixin.IndicatorElement
         *
         * @constructor
         * @param {Object} [config] Configuration options
         * @cfg {boolean} [required=false] Mark the field as required. Implies `indicator: 'required'`.
         * @cfg {string} [mustBeAfter] Validates the date to be after this. In the 'YYYY-MM-DD' format.
         * @cfg {string} [mustBeBefore] Validates the date to be before this. In the 'YYYY-MM-DD' format.
+        * @cfg {jQuery} [$overlay] Render the calendar into a separate layer. This configuration is
+        *     useful in cases where the expanded calendar is larger than its container. The specified
+        *     overlay layer is usually on top of the container and has a larger area. By default, the
+        *     calendar uses relative positioning.
         */
        mw.widgets.DateInputWidget = function MWWDateInputWidget( config ) {
                // Config initialization
-               config = $.extend( { precision: 'day' }, config );
+               config = $.extend( { precision: 'day', required: false }, config );
                if ( config.required ) {
                        if ( config.indicator === undefined ) {
                                config.indicator = 'required';
                }
 
                // Properties (must be set before parent constructor, which calls #setValue)
-               this.handle = new OO.ui.LabelWidget();
+               this.$handle = $( '<div>' );
+               this.label = new OO.ui.LabelWidget();
                this.textInput = new OO.ui.TextInputWidget( {
+                       required: config.required,
                        placeholder: placeholder,
                        validate: this.validateDate.bind( this )
                } );
                this.calendar = new mw.widgets.CalendarWidget( {
+                       // Can't pass `$floatableContainer: this.$element` here, the latter is not set yet.
+                       // Instead we call setFloatableContainer() below.
                        precision: config.precision
                } );
                this.inCalendar = 0;
                this.inTextInput = 0;
                this.inputFormat = config.inputFormat;
                this.displayFormat = config.displayFormat;
+               this.required = config.required;
 
                // Validate and set min and max dates as properties
                mustBeAfter = moment( config.mustBeAfter, 'YYYY-MM-DD' );
                // Parent constructor
                mw.widgets.DateInputWidget.parent.call( this, config );
 
+               // Mixin constructors
+               OO.ui.mixin.IndicatorElement.call( this, config );
+
                // Events
                this.calendar.connect( this, {
                        change: 'onCalendarChange'
                this.calendar.$element.on( {
                        keypress: this.onCalendarKeyPress.bind( this )
                } );
-               this.handle.$element.on( {
+               this.$handle.on( {
                        click: this.onClick.bind( this ),
                        keypress: this.onKeyPress.bind( this )
                } );
 
                // Initialization
-               if ( config.required ) {
-                       this.$input.attr( 'required', 'required' );
-                       this.$input.attr( 'aria-required', 'true' );
-               }
                // Move 'tabindex' from this.$input (which is invisible) to the visible handle
-               this.setTabIndexedElement( this.handle.$element );
-               this.handle.$element
+               this.setTabIndexedElement( this.$handle );
+               this.$handle
+                       .append( this.label.$element, this.$indicator )
                        .addClass( 'mw-widget-dateInputWidget-handle' );
+               this.calendar.$element
+                       .addClass( 'mw-widget-dateInputWidget-calendar' );
                this.$element
                        .addClass( 'mw-widget-dateInputWidget' )
-                       .append( this.handle.$element, this.textInput.$element, this.calendar.$element );
+                       .append( this.$handle, this.textInput.$element, this.calendar.$element );
+
+               if ( config.$overlay ) {
+                       this.calendar.setFloatableContainer( this.$element );
+                       config.$overlay.append( this.calendar.$element );
+
+                       // The text input and calendar are not in DOM order, so fix up focus transitions.
+                       this.textInput.$input.on( 'keydown', function ( e ) {
+                               if ( e.which === OO.ui.Keys.TAB ) {
+                                       if ( e.shiftKey ) {
+                                               // Tabbing backward from text input: normal browser behavior
+                                               $.noop();
+                                       } else {
+                                               // Tabbing forward from text input: just focus the calendar
+                                               this.calendar.$element.focus();
+                                               return false;
+                                       }
+                               }
+                       }.bind( this ) );
+                       this.calendar.$element.on( 'keydown', function ( e ) {
+                               if ( e.which === OO.ui.Keys.TAB ) {
+                                       if ( e.shiftKey ) {
+                                               // Tabbing backward from calendar: just focus the text input
+                                               this.textInput.$input.focus();
+                                               return false;
+                                       } else {
+                                               // Tabbing forward from calendar: focus the text input, then allow normal browser
+                                               // behavior to move focus to next focusable after it
+                                               this.textInput.$input.focus();
+                                       }
+                               }
+                       }.bind( this ) );
+               }
+
                // Set handle label and hide stuff
                this.updateUI();
-               this.deactivate();
+               this.textInput.toggle( false );
+               this.calendar.toggle( false );
        };
 
        /* Inheritance */
 
        OO.inheritClass( mw.widgets.DateInputWidget, OO.ui.InputWidget );
+       OO.mixinClass( mw.widgets.DateInputWidget, OO.ui.mixin.IndicatorElement );
 
        /* Methods */
 
 
                if ( this.value !== oldValue ) {
                        this.updateUI();
+                       this.setValidityFlag();
                }
 
                return this;
                setTimeout( function () {
                        var $focussed = $( ':focus' );
                        // Deactivate unless the focus moved to something else inside this widget
-                       if ( !OO.ui.contains( widget.$element[ 0 ], $focussed[ 0 ], true ) ) {
+                       if (
+                               !OO.ui.contains( widget.$element[ 0 ], $focussed[ 0 ], true ) &&
+                               // Calendar might be in an $overlay
+                               !OO.ui.contains( widget.calendar.$element[ 0 ], $focussed[ 0 ], true )
+                       ) {
                                widget.deactivate();
                        }
                }, 0 );
                if ( this.getValue() === '' ) {
                        this.textInput.setValue( '' );
                        this.calendar.setDate( null );
-                       this.handle.setLabel( mw.msg( 'mw-widgets-dateinput-no-date' ) );
+                       this.label.setLabel( mw.msg( 'mw-widgets-dateinput-no-date' ) );
                        this.$element.addClass( 'mw-widget-dateInputWidget-empty' );
                } else {
                        if ( !this.inTextInput ) {
                        if ( !this.inCalendar ) {
                                this.calendar.setDate( this.getValue() );
                        }
-                       this.handle.setLabel( this.getMoment().format( this.getDisplayFormat() ) );
+                       this.label.setLabel( this.getMoment().format( this.getDisplayFormat() ) );
                        this.$element.removeClass( 'mw-widget-dateInputWidget-empty' );
                }
        };
         */
        mw.widgets.DateInputWidget.prototype.deactivate = function () {
                this.$element.removeClass( 'mw-widget-dateInputWidget-active' );
-               this.handle.toggle( true );
+               this.$handle.show();
                this.textInput.toggle( false );
                this.calendar.toggle( false );
+               this.setValidityFlag();
        };
 
        /**
        mw.widgets.DateInputWidget.prototype.activate = function () {
                this.calendar.resetUI();
                this.$element.addClass( 'mw-widget-dateInputWidget-active' );
-               this.handle.toggle( false );
+               this.$handle.hide();
                this.textInput.toggle( true );
                this.calendar.toggle( true );
 
        mw.widgets.DateInputWidget.prototype.onCalendarKeyPress = function ( e ) {
                if ( !this.isDisabled() && e.which === OO.ui.Keys.ENTER ) {
                        this.deactivate();
-                       this.handle.$element.focus();
+                       this.$handle.focus();
                        return false;
                }
        };
         */
        mw.widgets.DateInputWidget.prototype.onEnter = function () {
                this.deactivate();
-               this.handle.$element.focus();
+               this.$handle.focus();
        };
 
        /**
         * @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
+        * @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}
         */
        mw.widgets.DateInputWidget.prototype.validateDate = function ( date ) {
+               var isValid;
                if ( date === '' ) {
-                       return true;
+                       isValid = !this.required;
+               } else {
+                       isValid = this.isValidDate( date ) && this.isInRange( date );
                }
-
-               var isValid = this.isValidDate( date ) && this.isInRange( date );
-               this.setValidityFlag( isValid );
                return isValid;
        };
 
        /**
         * @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
+        * @param {string} date Date string, to be valid, must be in 'YYYY-MM-DD' or 'YYYY-MM' format
         * @returns {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
                // is okay, but 2015-01 isn't, and neither is 2015-01-foo. Use Moment's "fuzzy" mode and check
-               // parsing flags for the details (stoled from implementation of #isValid).
+               // parsing flags for the details (stoled from implementation of moment#isValid).
                var
                        mom = moment( date, this.getInputFormat() ),
                        flags = mom.parsingFlags();
index f78a18d..873cca1 100644 (file)
@@ -26,6 +26,8 @@
        }
 }
 
+@indicator-size: unit(12 / 16 / 0.8, em);
+
 .mw-widget-dateInputWidget {
        display: inline-block;
        position: relative;
                width: 100%;
                display: inline-block;
                cursor: pointer;
+               position: relative;
 
                .oo-ui-unselectable();
                .oo-ui-box-sizing(border-box);
+
+               > .oo-ui-indicatorElement-indicator {
+                       display: none;
+               }
+       }
+
+       &.oo-ui-indicatorElement .mw-widget-dateInputWidget-handle > .oo-ui-indicatorElement-indicator {
+               display: block;
+               position: absolute;
+               top: 0;
+               right: 0;
+               height: 100%;
        }
 
        &.oo-ui-widget-disabled .mw-widget-dateInputWidget-handle {
                cursor: default;
        }
 
-       > .mw-widget-calendarWidget {
+       &-calendar {
                position: absolute;
                z-index: 1;
        }
                background-color: white;
        }
 
+       &.oo-ui-indicatorElement .mw-widget-dateInputWidget-handle > .oo-ui-indicatorElement-indicator {
+               width: @indicator-size;
+               margin: 0 0.775em;
+       }
+
        > .oo-ui-textInputWidget input {
                padding-left: 1em;
        }
 
-       > .mw-widget-calendarWidget {
-               background-color: white;
+       > .oo-ui-textInputWidget {
+               z-index: 2;
        }
 
-       &-active > .mw-widget-calendarWidget {
+       &-calendar {
+               background-color: white;
                margin-top: -2px;
-               // Immitate focussed input styles
-               // First shadow generates bottom and right "border", second shadow generates bottom and left,
-               // resulting in no "border" at the top. Note that this generates a 2px-wide "border", not 1px.
-               // It makes sense when you think about it long enough and look up what each value means. Enjoy.
-               // (This is symmetrical anyway, and CSSJanus can't flip it correctly. T62805)
-               /* @noflip */
-               box-shadow: inset -1px -1px 0 1px #347bff, inset 1px -1px 0 1px #347bff;
-               border-top: 1px solid #ccc;
 
                &:focus {
-                       outline: none;
-                       // Add border at the top on focus
-                       margin-top: -3px;
-                       border-top: 2px solid #347bff;
+                       z-index: 3;
                }
        }
 
                        text-shadow: 0 1px 1px #fff;
                        border-color: #ddd;
                        background-color: #f3f3f3;
+
+                       > .oo-ui-indicatorElement-indicator {
+                               opacity: 0.2;
+                       }
                }
+
        }
 
        &.oo-ui-flaggedElement-invalid {
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css b/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css
deleted file mode 100644 (file)
index 2c24b2b..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*!
- * MediaWiki Widgets - TitleInputWidget styles.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-.mw-widget-titleInputWidget-menu-withImages .mw-widget-titleOptionWidget {
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       min-height: 3.75em;
-       margin-left: 3.75em;
-}
-
-.mw-widget-titleInputWidget-menu-withImages .mw-widget-titleOptionWidget:not(:last-child) {
-       margin-bottom: 1px;
-}
-
-.mw-widget-titleInputWidget-menu-withImages .oo-ui-iconElement .oo-ui-iconElement-icon {
-       display: block;
-       width: 3.75em;
-       height: 3.75em;
-       left: -3.75em;
-       background-color: #ccc;
-       opacity: 0.4;
-}
-
-.mw-widget-titleInputWidget-menu-withImages .oo-ui-iconElement .mw-widget-titleOptionWidget-hasImage {
-       border: 0;
-       background-size: cover;
-       opacity: 1;
-}
-
-.mw-widget-titleInputWidget-menu-withImages .mw-widget-titleOptionWidget .oo-ui-labelElement-label {
-       line-height: 2.8em;
-}
-
-.mw-widget-titleOptionWidget-description {
-       display: none;
-}
-
-.mw-widget-titleInputWidget-menu-withDescriptions .mw-widget-titleOptionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
-}
-
-.mw-widget-titleInputWidget-menu-withDescriptions .mw-widget-titleOptionWidget-description {
-       display: block;
-       white-space: nowrap;
-       text-overflow: ellipsis;
-       overflow: hidden;
-}
-
-.oo-ui-menuOptionWidget:not(.oo-ui-optionWidget-selected) .mw-widget-titleOptionWidget-description,
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted .mw-widget-titleOptionWidget-description {
-       color: #888;
-}
index d5a7abc..fc1007e 100644 (file)
         *
         * @class
         * @extends OO.ui.TextInputWidget
+        * @mixins mw.widgets.TitleWidget
         * @mixins OO.ui.mixin.LookupElement
         *
         * @constructor
-        * @param {Object} [config] Configuration options
-        * @cfg {number} [limit=10] Number of results to show
-        * @cfg {number} [namespace] Namespace to prepend to queries
-        * @cfg {boolean} [relative=true] If a namespace is set, return a title 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 {Object} [cache] Result cache which implements a 'set' method, taking keyed values as an argument
         */
        mw.widgets.TitleInputWidget = function MwWidgetsTitleInputWidget( config ) {
-               var widget = this;
-
-               // Config initialization
-               config = $.extend( {
-                       maxLength: 255,
-                       limit: 10
-               }, config );
+               config = config || {};
 
                // Parent constructor
-               mw.widgets.TitleInputWidget.parent.call( this, $.extend( {}, config, { autocomplete: false } ) );
+               mw.widgets.TitleInputWidget.parent.call( this, $.extend( {}, config, {
+                       validate: this.isQueryValid.bind( this ),
+                       autocomplete: false
+               } ) );
 
                // Mixin constructors
+               mw.widgets.TitleWidget.call( this, config );
                OO.ui.mixin.LookupElement.call( this, config );
 
                // Properties
-               this.limit = config.limit;
-               this.maxLength = config.maxLength;
-               this.namespace = config.namespace !== undefined ? config.namespace : null;
-               this.relative = config.relative !== undefined ? config.relative : true;
                this.suggestions = config.suggestions !== undefined ? config.suggestions : true;
-               this.showRedirectTargets = config.showRedirectTargets !== false;
-               this.showRedlink = !!config.showRedlink;
-               this.showImages = !!config.showImages;
-               this.showDescriptions = !!config.showDescriptions;
-               this.cache = config.cache;
 
                // Initialization
                this.$element.addClass( 'mw-widget-titleInputWidget' );
-               this.lookupMenu.$element.addClass( 'mw-widget-titleInputWidget-menu' );
+               this.lookupMenu.$element.addClass( 'mw-widget-titleWidget-menu' );
                if ( this.showImages ) {
-                       this.lookupMenu.$element.addClass( 'mw-widget-titleInputWidget-menu-withImages' );
+                       this.lookupMenu.$element.addClass( 'mw-widget-titleWidget-menu-withImages' );
                }
                if ( this.showDescriptions ) {
-                       this.lookupMenu.$element.addClass( 'mw-widget-titleInputWidget-menu-withDescriptions' );
+                       this.lookupMenu.$element.addClass( 'mw-widget-titleWidget-menu-withDescriptions' );
                }
                this.setLookupsDisabled( !this.suggestions );
-
-               this.interwikiPrefixes = [];
-               this.interwikiPrefixesPromise = new mw.Api().get( {
-                       action: 'query',
-                       meta: 'siteinfo',
-                       siprop: 'interwikimap'
-               } ).done( function ( data ) {
-                       $.each( data.query.interwikimap, function ( index, interwiki ) {
-                               widget.interwikiPrefixes.push( interwiki.prefix );
-                       } );
-               } );
        };
 
        /* Setup */
 
        OO.inheritClass( mw.widgets.TitleInputWidget, OO.ui.TextInputWidget );
+       OO.mixinClass( mw.widgets.TitleInputWidget, mw.widgets.TitleWidget );
        OO.mixinClass( mw.widgets.TitleInputWidget, OO.ui.mixin.LookupElement );
 
        /* Methods */
 
        /**
-        * Get the namespace to prepend to titles in suggestions, if any.
-        *
-        * @return {number|null} Namespace number
+        * @inheritdoc mw.widgets.TitleWidget
         */
-       mw.widgets.TitleInputWidget.prototype.getNamespace = function () {
-               return this.namespace;
+       mw.widgets.TitleInputWidget.prototype.getQueryValue = function () {
+               return this.getValue();
        };
 
        /**
-        * Set the namespace to prepend to titles in suggestions, if any.
-        *
-        * @param {number|null} namespace Namespace number
+        * @inheritdoc mw.widgets.TitleWidget
         */
        mw.widgets.TitleInputWidget.prototype.setNamespace = function ( namespace ) {
-               this.namespace = namespace;
+               // Mixin method
+               mw.widgets.TitleWidget.prototype.setNamespace.call( this, namespace );
+
                this.lookupCache = {};
                this.closeLookupMenu();
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.TitleInputWidget.prototype.getLookupRequest = function () {
+               return this.getSuggestionsPromise();
+       };
+
+       /**
+        * @inheritdoc OO.ui.mixin.LookupElement
+        */
+       mw.widgets.TitleInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {
+               return response.query || {};
+       };
+
+       /**
+        * @inheritdoc OO.ui.mixin.LookupElement
+        */
+       mw.widgets.TitleInputWidget.prototype.getLookupMenuOptionsFromData = function ( response ) {
+               return this.getOptionsFromData( response );
+       };
+
        /**
         * @inheritdoc
         */
                return retval;
        };
 
-       /**
-        * @inheritdoc
-        */
-       mw.widgets.TitleInputWidget.prototype.getLookupRequest = function () {
-               var req,
-                       widget = this,
-                       promiseAbortObject = { abort: function () {
-                               // Do nothing. This is just so OOUI doesn't break due to abort being undefined.
-                       } };
-
-               if ( mw.Title.newFromText( this.value ) ) {
-                       return this.interwikiPrefixesPromise.then( function () {
-                               var params, props,
-                                       interwiki = widget.value.substring( 0, widget.value.indexOf( ':' ) );
-                               if (
-                                       interwiki && interwiki !== '' &&
-                                       widget.interwikiPrefixes.indexOf( interwiki ) !== -1
-                               ) {
-                                       return $.Deferred().resolve( { query: {
-                                               pages: [ {
-                                                       title: widget.value
-                                               } ]
-                                       } } ).promise( promiseAbortObject );
-                               } else {
-                                       params = {
-                                               action: 'query',
-                                               generator: 'prefixsearch',
-                                               gpssearch: widget.value,
-                                               gpsnamespace: widget.namespace !== null ? widget.namespace : undefined,
-                                               gpslimit: widget.limit,
-                                               ppprop: 'disambiguation'
-                                       };
-                                       props = [ 'info', 'pageprops' ];
-                                       if ( widget.showRedirectTargets ) {
-                                               params.redirects = '1';
-                                       }
-                                       if ( widget.showImages ) {
-                                               props.push( 'pageimages' );
-                                               params.pithumbsize = 80;
-                                               params.pilimit = widget.limit;
-                                       }
-                                       if ( widget.showDescriptions ) {
-                                               props.push( 'pageterms' );
-                                               params.wbptterms = 'description';
-                                       }
-                                       params.prop = props.join( '|' );
-                                       req = new mw.Api().get( params );
-                                       promiseAbortObject.abort = req.abort.bind( req ); // todo: ew
-                                       return req;
-                               }
-                       } ).promise( promiseAbortObject );
-               } else {
-                       // Don't send invalid titles to the API.
-                       // Just pretend it returned nothing so we can show the 'invalid title' section
-                       return $.Deferred().resolve( {} ).promise( promiseAbortObject );
-               }
-       };
-
-       /**
-        * Get lookup cache item from server response data.
-        *
-        * @method
-        * @param {Mixed} response Response from server
-        */
-       mw.widgets.TitleInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {
-               return response.query || {};
-       };
-
-       /**
-        * Get list of menu items from a server response.
-        *
-        * @param {Object} data Query result
-        * @returns {OO.ui.MenuOptionWidget[]} Menu items
-        */
-       mw.widgets.TitleInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {
-               var i, len, index, pageExists, pageExistsExact, suggestionPage, page, redirect, redirects,
-                       items = [],
-                       titles = [],
-                       titleObj = mw.Title.newFromText( this.value ),
-                       redirectsTo = {},
-                       pageData = {};
-
-               if ( data.redirects ) {
-                       for ( i = 0, len = data.redirects.length; i < len; i++ ) {
-                               redirect = data.redirects[ i ];
-                               redirectsTo[ redirect.to ] = redirectsTo[ redirect.to ] || [];
-                               redirectsTo[ redirect.to ].push( redirect.from );
-                       }
-               }
-
-               for ( index in data.pages ) {
-                       suggestionPage = data.pages[ index ];
-                       pageData[ suggestionPage.title ] = {
-                               missing: suggestionPage.missing !== undefined,
-                               redirect: suggestionPage.redirect !== undefined,
-                               disambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,
-                               imageUrl: OO.getProp( suggestionPage, 'thumbnail', 'source' ),
-                               description: OO.getProp( suggestionPage, 'terms', 'description' )
-                       };
-
-                       // Throw away pages from wrong namespaces. This can happen when 'showRedirectTargets' is true
-                       // and we encounter a cross-namespace redirect.
-                       if ( this.namespace === null || this.namespace === suggestionPage.ns ) {
-                               titles.push( suggestionPage.title );
-                       }
-
-                       redirects = redirectsTo[ suggestionPage.title ] || [];
-                       for ( i = 0, len = redirects.length; i < len; i++ ) {
-                               pageData[ redirects[ i ] ] = {
-                                       missing: false,
-                                       redirect: true,
-                                       disambiguation: false,
-                                       description: mw.msg( 'mw-widgets-titleinput-description-redirect', suggestionPage.title )
-                               };
-                               titles.push( redirects[ i ] );
-                       }
-               }
-
-               // If not found, run value through mw.Title to avoid treating a match as a
-               // mismatch where normalisation would make them matching (bug 48476)
-
-               pageExistsExact = titles.indexOf( this.value ) !== -1;
-               pageExists = pageExistsExact || (
-                       titleObj && titles.indexOf( titleObj.getPrefixedText() ) !== -1
-               );
-
-               if ( !pageExists ) {
-                       pageData[ this.value ] = {
-                               missing: true, redirect: false, disambiguation: false,
-                               description: mw.msg( 'mw-widgets-titleinput-description-new-page' )
-                       };
-               }
-
-               if ( this.cache ) {
-                       this.cache.set( pageData );
-               }
-
-               // Offer the exact text as a suggestion if the page exists
-               if ( pageExists && !pageExistsExact ) {
-                       titles.unshift( this.value );
-               }
-               // Offer the exact text as a new page if the title is valid
-               if ( this.showRedlink && !pageExists && titleObj ) {
-                       titles.push( this.value );
-               }
-               for ( i = 0, len = titles.length; i < len; i++ ) {
-                       page = pageData[ titles[ i ] ] || {};
-                       items.push( new mw.widgets.TitleOptionWidget( this.getOptionWidgetData( titles[ i ], page ) ) );
-               }
-
-               return items;
-       };
-
-       /**
-        * Get menu option widget data from the title and page data
-        *
-        * @param {mw.Title} title Title object
-        * @param {Object} data Page data
-        * @return {Object} Data for option widget
-        */
-       mw.widgets.TitleInputWidget.prototype.getOptionWidgetData = function ( title, data ) {
-               var mwTitle = new mw.Title( title );
-               return {
-                       data: this.namespace !== null && this.relative
-                               ? mwTitle.getRelativeText( this.namespace )
-                               : title,
-                       title: mwTitle,
-                       imageUrl: this.showImages ? data.imageUrl : null,
-                       description: this.showDescriptions ? data.description : null,
-                       missing: data.missing,
-                       redirect: data.redirect,
-                       disambiguation: data.disambiguation,
-                       query: this.value
-               };
-       };
-
-       /**
-        * Get title object corresponding to given value, or #getValue if not given.
-        *
-        * @param {string} [value] Value to get a title for
-        * @returns {mw.Title|null} Title object, or null if value is invalid
-        */
-       mw.widgets.TitleInputWidget.prototype.getTitle = function ( value ) {
-               var title = value !== undefined ? value : this.getValue(),
-                       // mw.Title doesn't handle null well
-                       titleObj = mw.Title.newFromText( title, this.namespace !== null ? this.namespace : undefined );
-
-               return titleObj;
-       };
-
        /**
         * @inheritdoc
         */
        mw.widgets.TitleInputWidget.prototype.cleanUpValue = function ( value ) {
                var widget = this;
+
+               // Parent method
                value = mw.widgets.TitleInputWidget.parent.prototype.cleanUpValue.call( this, value );
+
                return $.trimByteLength( this.value, value, this.maxLength, function ( value ) {
                        var title = widget.getTitle( value );
                        return title ? title.getMain() : value;
                } ).newVal;
        };
 
-       /**
-        * @inheritdoc
-        */
-       mw.widgets.TitleInputWidget.prototype.isValid = function () {
-               return $.Deferred().resolve( !!this.getTitle() ).promise();
-       };
-
 }( jQuery, mediaWiki ) );
index ec0c935..46960f5 100644 (file)
@@ -13,9 +13,9 @@
         * @extends OO.ui.MenuOptionWidget
         *
         * @constructor
-        * @param {Object} [config] Configuration options
-        * @cfg {string} [data] Label to display
-        * @cfg {mw.Title} [title] Page title object
+        * @param {Object} config Configuration options
+        * @cfg {string} data Label to display
+        * @cfg {string} url URL of page
         * @cfg {string} [imageUrl] Thumbnail image URL with URL encoding
         * @cfg {string} [description] Page description
         * @cfg {boolean} [missing] Page doesn't exist
                config = $.extend( {
                        icon: icon,
                        label: config.data,
-                       href: config.title.getUrl(),
-                       autoFitLabel: false
+                       autoFitLabel: false,
+                       $label: $( '<a>' )
                }, config );
 
                // Parent constructor
                mw.widgets.TitleOptionWidget.parent.call( this, config );
 
                // Initialization
-               this.$label.wrap( '<a>' );
-               this.$link = this.$label.parent();
-               this.$link.attr( 'href', config.href );
+               this.$label.attr( 'href', config.url );
                this.$element.addClass( 'mw-widget-titleOptionWidget' );
 
+               // Allow opening the link in new tab, but not regular navigation.
+               this.$label.on( 'click', function ( e ) {
+                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
+                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+                               e.preventDefault();
+                       }
+               } );
+
                // Highlight matching parts of link suggestion
                this.$label.autoEllipsis( { hasSpan: false, tooltip: true, matchText: config.query } );
 
                if ( config.missing ) {
-                       this.$link.addClass( 'new' );
+                       this.$label.addClass( 'new' );
                }
 
                if ( config.imageUrl ) {
@@ -71,6 +77,7 @@
                                $( '<span>' )
                                        .addClass( 'mw-widget-titleOptionWidget-description' )
                                        .text( config.description )
+                                       .attr( 'title', config.description )
                        );
                }
        };
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js
new file mode 100644 (file)
index 0000000..c37c723
--- /dev/null
@@ -0,0 +1,87 @@
+/*!
+ * MediaWiki Widgets - TitleSearchWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Creates an mw.widgets.TitleSearchWidget object.
+        *
+        * @class
+        * @extends OO.ui.SearchWidget
+        * @mixins mw.widgets.TitleWidget
+        *
+        * @constructor
+        */
+       mw.widgets.TitleSearchWidget = function MwWidgetsTitleSearchWidget( config ) {
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.TitleSearchWidget.parent.call( this, config );
+
+               // Mixin constructors
+               mw.widgets.TitleWidget.call( this, config );
+
+               this.query.setValidation( this.isQueryValid.bind( this ) );
+
+               // Events
+               this.results.connect( this, { choose: 'onTitleSearchResultsChoose' } );
+
+               // Initialization
+               this.$element.addClass( 'mw-widget-titleSearchWidget' );
+               this.results.$element.addClass( 'mw-widget-titleWidget-menu' );
+               if ( this.showImages ) {
+                       this.results.$element.addClass( 'mw-widget-titleWidget-menu-withImages' );
+               }
+               if ( this.showDescriptions ) {
+                       this.results.$element.addClass( 'mw-widget-titleWidget-menu-withDescriptions' );
+               }
+               if ( this.maxLength !== undefined ) {
+                       this.getQuery().$input.attr( 'maxlength', this.maxLength );
+               }
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.TitleSearchWidget, OO.ui.SearchWidget );
+       OO.mixinClass( mw.widgets.TitleSearchWidget, mw.widgets.TitleWidget );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc mw.widgets.TitleWidget
+        */
+       mw.widgets.TitleSearchWidget.prototype.getQueryValue = function () {
+               return this.getQuery().getValue();
+       };
+
+       /**
+        * Handle choose events from the result widget
+        *
+        * @param {OO.ui.OptionWidget} item Chosen item
+        */
+       mw.widgets.TitleSearchWidget.prototype.onTitleSearchResultsChoose = function ( item ) {
+               // TOOD: Pressing enter can incorrectly trigger 'choose' with null.
+               // Remove this check when oojs-ui 0.12.10 lands.
+               if ( item ) {
+                       this.getQuery().setValue( item.getData() );
+               }
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.TitleSearchWidget.prototype.onQueryChange = function () {
+               var widget = this;
+
+               this.getSuggestionsPromise().done( function ( response ) {
+                       // Parent method
+                       mw.widgets.TitleSearchWidget.parent.prototype.onQueryChange.call( widget );
+
+                       widget.results.addItems( widget.getOptionsFromData( response.query || {} ) );
+               } );
+       };
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
new file mode 100644 (file)
index 0000000..5732aa5
--- /dev/null
@@ -0,0 +1,285 @@
+/*!
+ * MediaWiki Widgets - TitleWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Mixin for title widgets
+        *
+        * @class
+        * @abstract
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @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} [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 {Object} [cache] Result cache which implements a 'set' method, taking keyed values as an argument
+        */
+       mw.widgets.TitleWidget = function MwWidgetsTitleWidget( config ) {
+               var widget = this;
+
+               // Config initialization
+               config = $.extend( {
+                       maxLength: 255,
+                       limit: 10
+               }, config );
+
+               // Properties
+               this.limit = config.limit;
+               this.maxLength = config.maxLength;
+               this.namespace = config.namespace !== undefined ? config.namespace : null;
+               this.relative = config.relative !== undefined ? config.relative : true;
+               this.suggestions = config.suggestions !== undefined ? config.suggestions : true;
+               this.showRedirectTargets = config.showRedirectTargets !== false;
+               this.showRedlink = !!config.showRedlink;
+               this.showImages = !!config.showImages;
+               this.showDescriptions = !!config.showDescriptions;
+               this.cache = config.cache;
+
+               // Initialization
+               this.$element.addClass( 'mw-widget-titleWidget' );
+               this.interwikiPrefixes = [];
+               this.interwikiPrefixesPromise = new mw.Api().get( {
+                       action: 'query',
+                       meta: 'siteinfo',
+                       siprop: 'interwikimap'
+               } ).done( function ( data ) {
+                       $.each( data.query.interwikimap, function ( index, interwiki ) {
+                               widget.interwikiPrefixes.push( interwiki.prefix );
+                       } );
+               } );
+       };
+
+       /* Setup */
+
+       OO.initClass( mw.widgets.TitleWidget );
+
+       /* Methods */
+
+       /**
+        * Get the current value of the search query
+        *
+        * @abstract
+        * @return {string} Search query
+        */
+       mw.widgets.TitleWidget.prototype.getQueryValue = null;
+
+       /**
+        * Get the namespace to prepend to titles in suggestions, if any.
+        *
+        * @return {number|null} Namespace number
+        */
+       mw.widgets.TitleWidget.prototype.getNamespace = function () {
+               return this.namespace;
+       };
+
+       /**
+        * Set the namespace to prepend to titles in suggestions, if any.
+        *
+        * @param {number|null} namespace Namespace number
+        */
+       mw.widgets.TitleWidget.prototype.setNamespace = function ( namespace ) {
+               this.namespace = namespace;
+       };
+
+       /**
+        * Get a promise which resolves with an API repsonse for suggested
+        * links for the current query.
+        */
+       mw.widgets.TitleWidget.prototype.getSuggestionsPromise = function () {
+               var req,
+                       query = this.getQueryValue(),
+                       widget = this,
+                       promiseAbortObject = { abort: function () {
+                               // Do nothing. This is just so OOUI doesn't break due to abort being undefined.
+                       } };
+
+               if ( mw.Title.newFromText( query ) ) {
+                       return this.interwikiPrefixesPromise.then( function () {
+                               var params,
+                                       interwiki = query.substring( 0, query.indexOf( ':' ) );
+                               if (
+                                       interwiki && interwiki !== '' &&
+                                       widget.interwikiPrefixes.indexOf( interwiki ) !== -1
+                               ) {
+                                       return $.Deferred().resolve( { query: {
+                                               pages: [ {
+                                                       title: query
+                                               } ]
+                                       } } ).promise( promiseAbortObject );
+                               } else {
+                                       params = {
+                                               action: 'query',
+                                               prop: [ 'info', 'pageprops' ],
+                                               generator: 'prefixsearch',
+                                               gpssearch: query,
+                                               gpsnamespace: widget.namespace !== null ? widget.namespace : undefined,
+                                               gpslimit: widget.limit,
+                                               ppprop: 'disambiguation'
+                                       };
+                                       if ( widget.showRedirectTargets ) {
+                                               params.redirects = true;
+                                       }
+                                       if ( widget.showImages ) {
+                                               params.prop.push( 'pageimages' );
+                                               params.pithumbsize = 80;
+                                               params.pilimit = widget.limit;
+                                       }
+                                       if ( widget.showDescriptions ) {
+                                               params.prop.push( 'pageterms' );
+                                               params.wbptterms = 'description';
+                                       }
+                                       req = new mw.Api().get( params );
+                                       promiseAbortObject.abort = req.abort.bind( req ); // todo: ew
+                                       return req;
+                               }
+                       } ).promise( promiseAbortObject );
+               } else {
+                       // Don't send invalid titles to the API.
+                       // Just pretend it returned nothing so we can show the 'invalid title' section
+                       return $.Deferred().resolve( {} ).promise( promiseAbortObject );
+               }
+       };
+
+       /**
+        * Get option widgets from the server response
+        *
+        * @param {Object} data Query result
+        * @returns {OO.ui.OptionWidget[]} Menu items
+        */
+       mw.widgets.TitleWidget.prototype.getOptionsFromData = function ( data ) {
+               var i, len, index, pageExists, pageExistsExact, suggestionPage, page, redirect, redirects,
+                       items = [],
+                       titles = [],
+                       titleObj = mw.Title.newFromText( this.getQueryValue() ),
+                       redirectsTo = {},
+                       pageData = {};
+
+               if ( data.redirects ) {
+                       for ( i = 0, len = data.redirects.length; i < len; i++ ) {
+                               redirect = data.redirects[ i ];
+                               redirectsTo[ redirect.to ] = redirectsTo[ redirect.to ] || [];
+                               redirectsTo[ redirect.to ].push( redirect.from );
+                       }
+               }
+
+               for ( index in data.pages ) {
+                       suggestionPage = data.pages[ index ];
+                       pageData[ suggestionPage.title ] = {
+                               missing: suggestionPage.missing !== undefined,
+                               redirect: suggestionPage.redirect !== undefined,
+                               disambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,
+                               imageUrl: OO.getProp( suggestionPage, 'thumbnail', 'source' ),
+                               description: OO.getProp( suggestionPage, 'terms', 'description' )
+                       };
+
+                       // Throw away pages from wrong namespaces. This can happen when 'showRedirectTargets' is true
+                       // and we encounter a cross-namespace redirect.
+                       if ( this.namespace === null || this.namespace === suggestionPage.ns ) {
+                               titles.push( suggestionPage.title );
+                       }
+
+                       redirects = redirectsTo[ suggestionPage.title ] || [];
+                       for ( i = 0, len = redirects.length; i < len; i++ ) {
+                               pageData[ redirects[ i ] ] = {
+                                       missing: false,
+                                       redirect: true,
+                                       disambiguation: false,
+                                       description: mw.msg( 'mw-widgets-titleinput-description-redirect', suggestionPage.title )
+                               };
+                               titles.push( redirects[ i ] );
+                       }
+               }
+
+               // If not found, run value through mw.Title to avoid treating a match as a
+               // mismatch where normalisation would make them matching (bug 48476)
+
+               pageExistsExact = titles.indexOf( this.getQueryValue() ) !== -1;
+               pageExists = pageExistsExact || (
+                       titleObj && titles.indexOf( titleObj.getPrefixedText() ) !== -1
+               );
+
+               if ( !pageExists ) {
+                       pageData[ this.getQueryValue() ] = {
+                               missing: true, redirect: false, disambiguation: false,
+                               description: mw.msg( 'mw-widgets-titleinput-description-new-page' )
+                       };
+               }
+
+               if ( this.cache ) {
+                       this.cache.set( pageData );
+               }
+
+               // Offer the exact text as a suggestion if the page exists
+               if ( pageExists && !pageExistsExact ) {
+                       titles.unshift( this.getQueryValue() );
+               }
+               // Offer the exact text as a new page if the title is valid
+               if ( this.showRedlink && !pageExists && titleObj ) {
+                       titles.push( this.getQueryValue() );
+               }
+               for ( i = 0, len = titles.length; i < len; i++ ) {
+                       page = pageData[ titles[ i ] ] || {};
+                       items.push( new mw.widgets.TitleOptionWidget( this.getOptionWidgetData( titles[ i ], page ) ) );
+               }
+
+               return items;
+       };
+
+       /**
+        * Get menu option widget data from the title and page data
+        *
+        * @param {string} title Title object
+        * @param {Object} data Page data
+        * @return {Object} Data for option widget
+        */
+       mw.widgets.TitleWidget.prototype.getOptionWidgetData = function ( title, data ) {
+               var mwTitle = new mw.Title( title );
+               return {
+                       data: this.namespace !== null && this.relative
+                               ? mwTitle.getRelativeText( this.namespace )
+                               : title,
+                       url: mwTitle.getUrl(),
+                       imageUrl: this.showImages ? data.imageUrl : null,
+                       description: this.showDescriptions ? data.description : null,
+                       missing: data.missing,
+                       redirect: data.redirect,
+                       disambiguation: data.disambiguation,
+                       query: this.getQueryValue()
+               };
+       };
+
+       /**
+        * 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
+        */
+       mw.widgets.TitleWidget.prototype.getTitle = function ( value ) {
+               var title = value !== undefined ? value : this.getQueryValue(),
+                       // mw.Title doesn't handle null well
+                       titleObj = mw.Title.newFromText( title, this.namespace !== null ? this.namespace : undefined );
+
+               return titleObj;
+       };
+
+       /**
+        * Check if the query is valid
+        *
+        * @return {boolean} The query is valid
+        */
+       mw.widgets.TitleWidget.prototype.isQueryValid = function () {
+               return !!this.getTitle();
+       };
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less
new file mode 100644 (file)
index 0000000..2eb8c55
--- /dev/null
@@ -0,0 +1,78 @@
+/*!
+ * MediaWiki Widgets - TitleWidget styles.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-titleWidget-menu {
+       .mw-widget-titleOptionWidget {
+               line-height: normal;
+
+               &-description {
+                       color: #888;
+               }
+       }
+
+       &-withImages {
+               .mw-widget-titleOptionWidget {
+                       -webkit-box-sizing: border-box;
+                       -moz-box-sizing: border-box;
+                       box-sizing: border-box;
+                       min-height: 3.75em;
+                       padding-left: 4.75em;
+
+                       &:not(:last-child) {
+                               margin-bottom: 2px;
+                       }
+
+                       > .oo-ui-labelElement-label {
+                               line-height: 2.8em;
+                       }
+
+                       &.oo-ui-iconElement {
+                               >.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;
+                               }
+                       }
+               }
+
+               &.oo-ui-optionWidget-highlighted, &.oo-ui-optionWidget-selected {
+                       &.oo-ui-iconElement > .mw-widget-titleOptionWidget-hasImage {
+                               opacity: 1;
+                       }
+               }
+       }
+
+       &-withDescriptions {
+               .mw-widget-titleOptionWidget {
+                       > .oo-ui-labelElement-label {
+                               line-height: 1.5em;
+                       }
+
+                       &-description {
+                               display: block;
+                               white-space: nowrap;
+                               text-overflow: ellipsis;
+                               overflow: hidden;
+                       }
+               }
+       }
+
+       &:not(&-withDescriptions) {
+               .mw-widget-titleOptionWidget-description {
+                       display: none;
+               }
+       }
+}
diff --git a/resources/src/mediawiki.widgets/mw.widgets.js b/resources/src/mediawiki.widgets/mw.widgets.js
deleted file mode 100644 (file)
index dc8b0cf..0000000
+++ /dev/null
@@ -1 +0,0 @@
-mediaWiki.widgets = {};
diff --git a/resources/src/mediawiki/ForeignApi.js b/resources/src/mediawiki/ForeignApi.js
new file mode 100644 (file)
index 0000000..b8cc059
--- /dev/null
@@ -0,0 +1,109 @@
+( function ( mw, $ ) {
+
+       /**
+        * Create an object like mw.Api, but automatically handling everything required to communicate
+        * with another MediaWiki wiki via cross-origin requests (CORS).
+        *
+        * The foreign wiki must be configured to accept requests from the current wiki. See
+        * <https://www.mediawiki.org/wiki/Manual:$wgCrossSiteAJAXdomains> for details.
+        *
+        *     var api = new mw.ForeignApi( 'https://commons.wikimedia.org/w/api.php' );
+        *     api.get( {
+        *         action: 'query',
+        *         meta: 'userinfo'
+        *     } ).done( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * To ensure that the user at the foreign wiki is logged in, pass the `assert: 'user'` parameter
+        * to #get/#post (since MW 1.23): if they are not, the API request will fail. (Note that this
+        * doesn't guarantee that it's the same user.)
+        *
+        * Authentication-related MediaWiki extensions may extend this class to ensure that the user
+        * authenticated on the current wiki will be automatically authenticated on the foreign one. These
+        * extension modules should be registered using the ResourceLoaderForeignApiModules hook. See
+        * CentralAuth for a practical example. The general pattern to extend and override the name is:
+        *
+        *     function MyForeignApi() {};
+        *     OO.inheritClass( MyForeignApi, mw.ForeignApi );
+        *     mw.ForeignApi = MyForeignApi;
+        *
+        * @class mw.ForeignApi
+        * @extends mw.Api
+        * @since 1.26
+        *
+        * @constructor
+        * @param {string|mw.Uri} url URL pointing to another wiki's `api.php` endpoint.
+        * @param {Object} [options] See mw.Api.
+        *
+        * @author Bartosz Dziewoński
+        * @author Jon Robson
+        */
+       function CoreForeignApi( url, options ) {
+               if ( !url || $.isPlainObject( url ) ) {
+                       throw new Error( 'mw.ForeignApi() requires a `url` parameter' );
+               }
+
+               this.apiUrl = String( url );
+
+               options = $.extend( /*deep=*/ true,
+                       {
+                               ajax: {
+                                       url: this.apiUrl,
+                                       xhrFields: {
+                                               withCredentials: true
+                                       }
+                               },
+                               parameters: {
+                                       // Add 'origin' query parameter to all requests.
+                                       origin: this.getOrigin()
+                               }
+                       },
+                       options
+               );
+
+               // Call parent constructor
+               CoreForeignApi.parent.call( this, options );
+       }
+
+       OO.inheritClass( CoreForeignApi, mw.Api );
+
+       /**
+        * Return the origin to use for API requests, in the required format (protocol, host and port, if
+        * any).
+        *
+        * @protected
+        * @return {string}
+        */
+       CoreForeignApi.prototype.getOrigin = function () {
+               var origin = location.protocol + '//' + location.hostname;
+               if ( location.port ) {
+                       origin += ':' + location.port;
+               }
+               return origin;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       CoreForeignApi.prototype.ajax = function ( parameters, ajaxOptions ) {
+               var url, origin, newAjaxOptions;
+
+               // 'origin' query parameter must be part of the request URI, and not just POST request body
+               if ( ajaxOptions.type === 'POST' ) {
+                       url = ( ajaxOptions && ajaxOptions.url ) || this.defaults.ajax.url;
+                       origin = ( parameters && parameters.origin ) || this.defaults.parameters.origin;
+                       url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) +
+                               'origin=' + encodeURIComponent( origin );
+                       newAjaxOptions = $.extend( {}, ajaxOptions, { url: url } );
+               } else {
+                       newAjaxOptions = ajaxOptions;
+               }
+
+               return CoreForeignApi.parent.prototype.ajax.call( this, parameters, newAjaxOptions );
+       };
+
+       // Expose
+       mw.ForeignApi = CoreForeignApi;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api.js b/resources/src/mediawiki/api.js
new file mode 100644 (file)
index 0000000..43b20b8
--- /dev/null
@@ -0,0 +1,416 @@
+( function ( mw, $ ) {
+
+       /**
+        * @class mw.Api
+        */
+
+       /**
+        * @property {Object} defaultOptions Default options for #ajax calls. Can be overridden by passing
+        *     `options` to mw.Api constructor.
+        * @property {Object} defaultOptions.parameters Default query parameters for API requests.
+        * @property {Object} defaultOptions.ajax Default options for jQuery#ajax.
+        * @private
+        */
+       var defaultOptions = {
+                       parameters: {
+                               action: 'query',
+                               format: 'json'
+                       },
+                       ajax: {
+                               url: mw.util.wikiScript( 'api' ),
+                               timeout: 30 * 1000, // 30 seconds
+                               dataType: 'json'
+                       }
+               },
+
+               // Keyed by ajax url and symbolic name for the individual request
+               promises = {};
+
+       // 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 ] = {};
+       $.each( mw.user.tokens.get(), function ( key, value ) {
+               // This requires #getToken to use the same key as user.tokens.
+               // Format: token-type + "Token" (eg. editToken, patrolToken, watchToken).
+               promises[ defaultOptions.ajax.url ][ key ] = $.Deferred()
+                       .resolve( value )
+                       .promise( { abort: function () {} } );
+       } );
+
+       /**
+        * Constructor to create an object to interact with the API of a particular MediaWiki server.
+        * mw.Api objects represent the API of a particular MediaWiki server.
+        *
+        *     var api = new mw.Api();
+        *     api.get( {
+        *         action: 'query',
+        *         meta: 'userinfo'
+        *     } ).done( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * Since MW 1.25, multiple values for a parameter can be specified using an array:
+        *
+        *     var api = new mw.Api();
+        *     api.get( {
+        *         action: 'query',
+        *         meta: [ 'userinfo', 'siteinfo' ] // same effect as 'userinfo|siteinfo'
+        *     } ).done( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * Since MW 1.26, boolean values for a parameter can be specified directly. If the value is
+        * `false` or `undefined`, the parameter will be omitted from the request, as required by the API.
+        *
+        * @constructor
+        * @param {Object} [options] See #defaultOptions documentation above. Can also be overridden for
+        *  each individual request by passing them to #get or #post (or directly #ajax) later on.
+        */
+       mw.Api = function ( options ) {
+               // TODO: Share API objects with exact same config.
+               options = options || {};
+
+               // Force a string if we got a mw.Uri object
+               if ( options.ajax && options.ajax.url !== undefined ) {
+                       options.ajax.url = String( options.ajax.url );
+               }
+
+               options.parameters = $.extend( {}, defaultOptions.parameters, options.parameters );
+               options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
+
+               this.defaults = options;
+       };
+
+       mw.Api.prototype = {
+
+               /**
+                * Perform API get request
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise}
+                */
+               get: function ( parameters, ajaxOptions ) {
+                       ajaxOptions = ajaxOptions || {};
+                       ajaxOptions.type = 'GET';
+                       return this.ajax( parameters, ajaxOptions );
+               },
+
+               /**
+                * Perform API post request
+                *
+                * TODO: Post actions for non-local hostnames will need proxy.
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise}
+                */
+               post: function ( parameters, ajaxOptions ) {
+                       ajaxOptions = ajaxOptions || {};
+                       ajaxOptions.type = 'POST';
+                       return this.ajax( parameters, ajaxOptions );
+               },
+
+               /**
+                * Massage parameters from the nice format we accept into a format suitable for the API.
+                *
+                * @private
+                * @param {Object} parameters (modified in-place)
+                */
+               preprocessParameters: function ( parameters ) {
+                       var key;
+                       // Handle common MediaWiki API idioms for passing parameters
+                       for ( key in parameters ) {
+                               // Multiple values are pipe-separated
+                               if ( $.isArray( parameters[ key ] ) ) {
+                                       parameters[ key ] = parameters[ key ].join( '|' );
+                               }
+                               // Boolean values are only false when not given at all
+                               if ( parameters[ key ] === false || parameters[ key ] === undefined ) {
+                                       delete parameters[ key ];
+                               }
+                       }
+               },
+
+               /**
+                * Perform the API call.
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} Done: API response data and the jqXHR object.
+                *  Fail: Error code
+                */
+               ajax: function ( parameters, ajaxOptions ) {
+                       var token,
+                               apiDeferred = $.Deferred(),
+                               xhr, key, formData;
+
+                       parameters = $.extend( {}, this.defaults.parameters, parameters );
+                       ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
+
+                       // Ensure that token parameter is last (per [[mw:API:Edit#Token]]).
+                       if ( parameters.token ) {
+                               token = parameters.token;
+                               delete parameters.token;
+                       }
+
+                       this.preprocessParameters( parameters );
+
+                       // If multipart/form-data has been requested and emulation is possible, emulate it
+                       if (
+                               ajaxOptions.type === 'POST' &&
+                               window.FormData &&
+                               ajaxOptions.contentType === 'multipart/form-data'
+                       ) {
+
+                               formData = new FormData();
+
+                               for ( key in parameters ) {
+                                       formData.append( key, parameters[ key ] );
+                               }
+                               // If we extracted a token parameter, add it back in.
+                               if ( token ) {
+                                       formData.append( 'token', token );
+                               }
+
+                               ajaxOptions.data = formData;
+
+                               // Prevent jQuery from mangling our FormData object
+                               ajaxOptions.processData = false;
+                               // Prevent jQuery from overriding the Content-Type header
+                               ajaxOptions.contentType = false;
+                       } else {
+                               // Some deployed MediaWiki >= 1.17 forbid periods in URLs, due to an IE XSS bug
+                               // So let's escape them here. See bug #28235
+                               // This works because jQuery accepts data as a query string or as an Object
+                               ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
+
+                               // If we extracted a token parameter, add it back in.
+                               if ( token ) {
+                                       ajaxOptions.data += '&token=' + encodeURIComponent( token );
+                               }
+
+                               if ( ajaxOptions.contentType === 'multipart/form-data' ) {
+                                       // We were asked to emulate but can't, so drop the Content-Type header, otherwise
+                                       // it'll be wrong and the server will fail to decode the POST body
+                                       delete ajaxOptions.contentType;
+                               }
+                       }
+
+                       // Make the AJAX request
+                       xhr = $.ajax( ajaxOptions )
+                               // If AJAX fails, reject API call with error code 'http'
+                               // and details in second argument.
+                               .fail( function ( xhr, textStatus, exception ) {
+                                       apiDeferred.reject( 'http', {
+                                               xhr: xhr,
+                                               textStatus: textStatus,
+                                               exception: exception
+                                       } );
+                               } )
+                               // AJAX success just means "200 OK" response, also check API error codes
+                               .done( function ( result, textStatus, jqXHR ) {
+                                       if ( result === undefined || result === null || result === '' ) {
+                                               apiDeferred.reject( 'ok-but-empty',
+                                                       'OK response but empty result (check HTTP headers?)'
+                                               );
+                                       } else if ( result.error ) {
+                                               var code = result.error.code === undefined ? 'unknown' : result.error.code;
+                                               apiDeferred.reject( code, result );
+                                       } else {
+                                               apiDeferred.resolve( result, jqXHR );
+                                       }
+                               } );
+
+                       // Return the Promise
+                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
+                               if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) {
+                                       mw.log( 'mw.Api error: ', code, details );
+                               }
+                       } );
+               },
+
+               /**
+                * Post to API with specified type of token. If we have no token, get one and try to post.
+                * If we have a cached token try using that, and if it fails, blank out the
+                * cached token and start over. For example to change an user option you could do:
+                *
+                *     new mw.Api().postWithToken( 'options', {
+                *         action: 'options',
+                *         optionname: 'gender',
+                *         optionvalue: 'female'
+                *     } );
+                *
+                * @param {string} tokenType The name of the token, like options or edit.
+                * @param {Object} params API parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} See #post
+                * @since 1.22
+                */
+               postWithToken: function ( tokenType, params, ajaxOptions ) {
+                       var api = this;
+
+                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                               params.token = token;
+                               return api.post( params, ajaxOptions ).then(
+                                       // If no error, return to caller as-is
+                                       null,
+                                       // Error handler
+                                       function ( code ) {
+                                               if ( code === 'badtoken' ) {
+                                                       api.badToken( tokenType );
+                                                       // Try again, once
+                                                       params.token = undefined;
+                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                                                               params.token = token;
+                                                               return api.post( params, ajaxOptions );
+                                                       } );
+                                               }
+
+                                               // Different error, pass on to let caller handle the error code
+                                               return this;
+                                       }
+                               );
+                       } );
+               },
+
+               /**
+                * Get a token for a certain action from the API.
+                *
+                * 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
+                */
+               getToken: function ( type, assert ) {
+                       var apiPromise,
+                               promiseGroup = promises[ this.defaults.ajax.url ],
+                               d = promiseGroup && promiseGroup[ type + 'Token' ];
+
+                       if ( !d ) {
+                               apiPromise = this.get( { action: 'tokens', type: type, assert: assert } );
+
+                               d = apiPromise
+                                       .then( function ( data ) {
+                                               if ( data.tokens && data.tokens[ type + 'token' ] ) {
+                                                       return data.tokens[ type + 'token' ];
+                                               }
+
+                                               // 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 );
+                                       }, function () {
+                                               // Clear promise. Do not cache errors.
+                                               delete promiseGroup[ type + 'Token' ];
+                                               // Pass on to allow the caller to handle the error
+                                               return this;
+                                       } )
+                                       // Attach abort handler
+                                       .promise( { abort: apiPromise.abort } );
+
+                               // Store deferred now so that we can use it again even if it isn't ready yet
+                               if ( !promiseGroup ) {
+                                       promiseGroup = promises[ this.defaults.ajax.url ] = {};
+                               }
+                               promiseGroup[ type + 'Token' ] = d;
+                       }
+
+                       return d;
+               },
+
+               /**
+                * Indicate that the cached token for a certain action of the API is bad.
+                *
+                * Call this if you get a 'badtoken' error when using the token returned by #getToken.
+                * You may also want to use #postWithToken instead, which invalidates bad cached tokens
+                * automatically.
+                *
+                * @param {string} type Token type
+                * @since 1.26
+                */
+               badToken: function ( type ) {
+                       var promiseGroup = promises[ this.defaults.ajax.url ];
+                       if ( promiseGroup ) {
+                               delete promiseGroup[ type + 'Token' ];
+                       }
+               }
+       };
+
+       /**
+        * @static
+        * @property {Array}
+        * List of errors we might receive from the API.
+        * For now, this just documents our expectation that there should be similar messages
+        * available.
+        */
+       mw.Api.errors = [
+               // occurs when POST aborted
+               // jQuery 1.4 can't distinguish abort or lost connection from 200 OK + empty result
+               'ok-but-empty',
+
+               // timeout
+               'timeout',
+
+               // really a warning, but we treat it like an error
+               'duplicate',
+               'duplicate-archive',
+
+               // upload succeeded, but no image info.
+               // this is probably impossible, but might as well check for it
+               'noimageinfo',
+               // remote errors, defined in API
+               'uploaddisabled',
+               'nomodule',
+               'mustbeposted',
+               'badaccess-groups',
+               'missingresult',
+               'missingparam',
+               'invalid-file-key',
+               'copyuploaddisabled',
+               'mustbeloggedin',
+               'empty-file',
+               'file-too-large',
+               'filetype-missing',
+               'filetype-banned',
+               'filetype-banned-type',
+               'filename-tooshort',
+               'illegal-filename',
+               'verification-error',
+               'hookaborted',
+               'unknown-error',
+               'internal-error',
+               'overwrite',
+               'badtoken',
+               'fetchfileerror',
+               'fileexists-shared-forbidden',
+               'invalidtitle',
+               'notloggedin',
+
+               // Stash-specific errors - expanded
+               'stashfailed',
+               'stasherror',
+               'stashedfilenotfound',
+               'stashpathinvalid',
+               'stashfilestorage',
+               'stashzerolength',
+               'stashnotloggedin',
+               'stashwrongowner',
+               'stashnosuchfilekey'
+       ];
+
+       /**
+        * @static
+        * @property {Array}
+        * List of warnings we might receive from the API.
+        * For now, this just documents our expectation that there should be similar messages
+        * available.
+        */
+       mw.Api.warnings = [
+               'duplicate',
+               'exists'
+       ];
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/category.js b/resources/src/mediawiki/api/category.js
new file mode 100644 (file)
index 0000000..14077e0
--- /dev/null
@@ -0,0 +1,108 @@
+/**
+ * @class mw.Api.plugin.category
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Determine if a category exists.
+                *
+                * @param {mw.Title|string} title
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean} return.done.isCategory Whether the category exists.
+                */
+               isCategory: function ( title ) {
+                       var apiPromise = this.get( {
+                               prop: 'categoryinfo',
+                               titles: String( title )
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var exists = false;
+                                       if ( data.query && data.query.pages ) {
+                                               $.each( data.query.pages, function ( id, page ) {
+                                                       if ( page.categoryinfo ) {
+                                                               exists = true;
+                                                       }
+                                               } );
+                                       }
+                                       return exists;
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               },
+
+               /**
+                * Get a list of categories that match a certain prefix.
+                *
+                * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables"...
+                *
+                * @param {string} prefix Prefix to match.
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string[]} return.done.categories Matched categories
+                */
+               getCategoriesByPrefix: function ( prefix ) {
+                       // Fetch with allpages to only get categories that have a corresponding description page.
+                       var apiPromise = this.get( {
+                               list: 'allpages',
+                               apprefix: prefix,
+                               apnamespace: mw.config.get( 'wgNamespaceIds' ).category
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var texts = [];
+                                       if ( data.query && data.query.allpages ) {
+                                               $.each( data.query.allpages, function ( i, category ) {
+                                                       texts.push( new mw.Title( category.title ).getMainText() );
+                                               } );
+                                       }
+                                       return texts;
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               },
+
+               /**
+                * Get the categories that a particular page on the wiki belongs to.
+                *
+                * @param {mw.Title|string} title
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
+                *  if title was not found.
+                */
+               getCategories: function ( title ) {
+                       var apiPromise = this.get( {
+                               prop: 'categories',
+                               titles: String( title )
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var titles = false;
+                                       if ( data.query && data.query.pages ) {
+                                               $.each( data.query.pages, function ( id, page ) {
+                                                       if ( page.categories ) {
+                                                               if ( titles === false ) {
+                                                                       titles = [];
+                                                               }
+                                                               $.each( page.categories, function ( i, cat ) {
+                                                                       titles.push( new mw.Title( cat.title ) );
+                                                               } );
+                                                       }
+                                               } );
+                                       }
+                                       return titles;
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.category
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/edit.js b/resources/src/mediawiki/api/edit.js
new file mode 100644 (file)
index 0000000..22affb1
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * @class mw.Api.plugin.edit
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Post to API with edit token. If we have no token, get one and try to post.
+                * If we have a cached token try using that, and if it fails, blank out the
+                * cached token and start over.
+                *
+                * @param {Object} params API parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} See #post
+                */
+               postWithEditToken: function ( params, ajaxOptions ) {
+                       return this.postWithToken( 'edit', params, ajaxOptions );
+               },
+
+               /**
+                * API helper to grab an edit token.
+                *
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.token Received token.
+                */
+               getEditToken: function () {
+                       return this.getToken( 'edit' );
+               },
+
+               /**
+                * Post a new section to the page.
+                *
+                * @see #postWithEditToken
+                * @param {mw.Title|string} title Target page
+                * @param {string} header
+                * @param {string} message wikitext message
+                * @param {Object} [additionalParams] Additional API parameters, e.g. `{ redirect: true }`
+                * @return {jQuery.Promise}
+                */
+               newSection: function ( title, header, message, additionalParams ) {
+                       return this.postWithEditToken( $.extend( {
+                               action: 'edit',
+                               section: 'new',
+                               title: String( title ),
+                               summary: header,
+                               text: message
+                       }, additionalParams ) );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.edit
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/login.js b/resources/src/mediawiki/api/login.js
new file mode 100644 (file)
index 0000000..2b709aa
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * Make the two-step login easier.
+ *
+ * @author Niklas Laxström
+ * @class mw.Api.plugin.login
+ * @since 1.22
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * @param {string} username
+                * @param {string} password
+                * @return {jQuery.Promise} See mw.Api#post
+                */
+               login: function ( username, password ) {
+                       var params, apiPromise, innerPromise,
+                               api = this;
+
+                       params = {
+                               action: 'login',
+                               lgname: username,
+                               lgpassword: password
+                       };
+
+                       apiPromise = api.post( params );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       params.lgtoken = data.login.token;
+                                       innerPromise = api.post( params )
+                                               .then( function ( data ) {
+                                                       var code;
+                                                       if ( data.login.result !== 'Success' ) {
+                                                               // Set proper error code whenever possible
+                                                               code = data.error && data.error.code || 'unknown';
+                                                               return $.Deferred().reject( code, data );
+                                                       }
+                                                       return data;
+                                               } );
+                                       return innerPromise;
+                               } )
+                               .promise( {
+                                       abort: function () {
+                                               apiPromise.abort();
+                                               if ( innerPromise ) {
+                                                       innerPromise.abort();
+                                               }
+                                       }
+                               } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.login
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/options.js b/resources/src/mediawiki/api/options.js
new file mode 100644 (file)
index 0000000..9dd276d
--- /dev/null
@@ -0,0 +1,89 @@
+/**
+ * @class mw.Api.plugin.options
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Asynchronously save the value of a single user option using the API. See #saveOptions.
+                *
+                * @param {string} name
+                * @param {string|null} value
+                * @return {jQuery.Promise}
+                */
+               saveOption: function ( name, value ) {
+                       var param = {};
+                       param[ name ] = value;
+                       return this.saveOptions( param );
+               },
+
+               /**
+                * Asynchronously save the values of user options using the API.
+                *
+                * If a value of `null` is provided, the given option will be reset to the default value.
+                *
+                * Any warnings returned by the API, including warnings about invalid option names or values,
+                * are ignored. However, do not rely on this behavior.
+                *
+                * If necessary, the options will be saved using several parallel API requests. Only one promise
+                * is always returned that will be resolved when all requests complete.
+                *
+                * @param {Object} options Options as a `{ name: value, … }` object
+                * @return {jQuery.Promise}
+                */
+               saveOptions: function ( options ) {
+                       var name, value, bundleable,
+                               grouped = [],
+                               deferreds = [];
+
+                       for ( name in options ) {
+                               value = options[ name ] === null ? null : String( options[ name ] );
+
+                               // Can we bundle this option, or does it need a separate request?
+                               bundleable =
+                                       ( value === null || value.indexOf( '|' ) === -1 ) &&
+                                       ( name.indexOf( '|' ) === -1 && name.indexOf( '=' ) === -1 );
+
+                               if ( bundleable ) {
+                                       if ( value !== null ) {
+                                               grouped.push( name + '=' + value );
+                                       } else {
+                                               // Omitting value resets the option
+                                               grouped.push( name );
+                                       }
+                               } else {
+                                       if ( value !== null ) {
+                                               deferreds.push( this.postWithToken( 'options', {
+                                                       action: 'options',
+                                                       optionname: name,
+                                                       optionvalue: value
+                                               } ) );
+                                       } else {
+                                               // Omitting value resets the option
+                                               deferreds.push( this.postWithToken( 'options', {
+                                                       action: 'options',
+                                                       optionname: name
+                                               } ) );
+                                       }
+                               }
+                       }
+
+                       if ( grouped.length ) {
+                               deferreds.push( this.postWithToken( 'options', {
+                                       action: 'options',
+                                       change: grouped
+                               } ) );
+                       }
+
+                       return $.when.apply( $, deferreds );
+               }
+
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.options
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/parse.js b/resources/src/mediawiki/api/parse.js
new file mode 100644 (file)
index 0000000..bc3d44f
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ * @class mw.Api.plugin.parse
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for 'action=parse'.
+                *
+                * @param {string} wikitext
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.data Parsed HTML of `wikitext`.
+                */
+               parse: function ( wikitext ) {
+                       var apiPromise = this.get( {
+                               action: 'parse',
+                               contentmodel: 'wikitext',
+                               text: wikitext
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       return data.parse.text[ '*' ];
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.parse
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/upload.js b/resources/src/mediawiki/api/upload.js
new file mode 100644 (file)
index 0000000..4d6b34c
--- /dev/null
@@ -0,0 +1,368 @@
+/**
+ * Provides an interface for uploading files to MediaWiki.
+ *
+ * @class mw.Api.plugin.upload
+ * @singleton
+ */
+( function ( mw, $ ) {
+       var nonce = 0,
+               fieldsAllowed = {
+                       stash: true,
+                       filekey: true,
+                       filename: true,
+                       comment: true,
+                       text: true,
+                       watchlist: true,
+                       ignorewarnings: true
+               };
+
+       /**
+        * @private
+        * Get nonce for iframe IDs on the page.
+        *
+        * @return {number}
+        */
+       function getNonce() {
+               return nonce++;
+       }
+
+       /**
+        * @private
+        * Get new iframe object for an upload.
+        *
+        * @return {HTMLIframeElement}
+        */
+       function getNewIframe( id ) {
+               var frame = document.createElement( 'iframe' );
+               frame.id = id;
+               frame.name = id;
+               return frame;
+       }
+
+       /**
+        * @private
+        * Shortcut for getting hidden inputs
+        *
+        * @return {jQuery}
+        */
+       function getHiddenInput( name, val ) {
+               return $( '<input type="hidden" />' )
+                       .attr( 'name', name )
+                       .val( val );
+       }
+
+       /**
+        * Process the result of the form submission, returned to an iframe.
+        * This is the iframe's onload event.
+        *
+        * @param {HTMLIframeElement} iframe Iframe to extract result from
+        * @return {Object} Response from the server. The return value may or may
+        *   not be an XMLDocument, this code was copied from elsewhere, so if you
+        *   see an unexpected return type, please file a bug.
+        */
+       function processIframeResult( iframe ) {
+               var json,
+                       doc = iframe.contentDocument || frames[ iframe.id ].document;
+
+               if ( doc.XMLDocument ) {
+                       // The response is a document property in IE
+                       return doc.XMLDocument;
+               }
+
+               if ( doc.body ) {
+                       // Get the json string
+                       // We're actually searching through an HTML doc here --
+                       // according to mdale we need to do this
+                       // because IE does not load JSON properly in an iframe
+                       json = $( doc.body ).find( 'pre' ).text();
+
+                       return JSON.parse( json );
+               }
+
+               // Response is a xml document
+               return doc;
+       }
+
+       function formDataAvailable() {
+               return window.FormData !== undefined &&
+                       window.File !== undefined &&
+                       window.File.prototype.slice !== undefined;
+       }
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Upload a file to MediaWiki.
+                *
+                * The file will be uploaded using AJAX and FormData, if the browser supports it, or via an
+                * iframe if it doesn't.
+                *
+                * Caveats of iframe upload:
+                * - The returned jQuery.Promise will not receive `progress` notifications during the upload
+                * - It is incompatible with uploads to a foreign wiki using mw.ForeignApi
+                * - You must pass a HTMLInputElement and not a File for it to be possible
+                *
+                * @param {HTMLInputElement|File} file HTML input type=file element with a file already inside
+                *  of it, or a File object.
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               upload: function ( file, data ) {
+                       var isFileInput, canUseFormData;
+
+                       isFileInput = file && file.nodeType === Node.ELEMENT_NODE;
+
+                       if ( formDataAvailable() && isFileInput && file.files ) {
+                               file = file.files[ 0 ];
+                       }
+
+                       if ( !file ) {
+                               return $.Deferred().reject( 'No file' );
+                       }
+
+                       canUseFormData = formDataAvailable() && file instanceof window.File;
+
+                       if ( !isFileInput && !canUseFormData ) {
+                               return $.Deferred().reject( 'Unsupported argument type passed to mw.Api.upload' );
+                       }
+
+                       if ( canUseFormData ) {
+                               return this.uploadWithFormData( file, data );
+                       }
+
+                       return this.uploadWithIframe( file, data );
+               },
+
+               /**
+                * Upload a file to MediaWiki with an iframe and a form.
+                *
+                * This method is necessary for browsers without the File/FormData
+                * APIs, and continues to work in browsers with those APIs.
+                *
+                * The rough sketch of how this method works is as follows:
+                * 1. An iframe is loaded with no content.
+                * 2. A form is submitted with the passed-in file input and some extras.
+                * 3. The MediaWiki API receives that form data, and sends back a response.
+                * 4. The response is sent to the iframe, because we set target=(iframe id)
+                * 5. The response is parsed out of the iframe's document, and passed back
+                *    through the promise.
+                *
+                * @private
+                * @param {HTMLInputElement} file The file input with a file in it.
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               uploadWithIframe: function ( file, data ) {
+                       var key,
+                               tokenPromise = $.Deferred(),
+                               api = this,
+                               deferred = $.Deferred(),
+                               nonce = getNonce(),
+                               id = 'uploadframe-' + nonce,
+                               $form = $( '<form>' ),
+                               iframe = getNewIframe( id ),
+                               $iframe = $( iframe );
+
+                       for ( key in data ) {
+                               if ( !fieldsAllowed[ key ] ) {
+                                       delete data[ key ];
+                               }
+                       }
+
+                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
+                       $form.addClass( 'mw-api-upload-form' );
+
+                       $form.css( 'display', 'none' )
+                               .attr( {
+                                       action: this.defaults.ajax.url,
+                                       method: 'POST',
+                                       target: id,
+                                       enctype: 'multipart/form-data'
+                               } );
+
+                       $iframe.one( 'load', function () {
+                               $iframe.one( 'load', function () {
+                                       var result = processIframeResult( iframe );
+
+                                       if ( !result ) {
+                                               deferred.reject( 'No response from API on upload attempt.' );
+                                       } else if ( result.error || result.warnings ) {
+                                               if ( result.error && result.error.code === 'badtoken' ) {
+                                                       api.badToken( 'edit' );
+                                               }
+
+                                               deferred.reject( result.error || result.warnings );
+                                       } else {
+                                               deferred.notify( 1 );
+                                               deferred.resolve( result );
+                                       }
+                               } );
+                               tokenPromise.done( function () {
+                                       $form.submit();
+                               } );
+                       } );
+
+                       $iframe.error( function ( error ) {
+                               deferred.reject( 'iframe failed to load: ' + error );
+                       } );
+
+                       $iframe.prop( 'src', 'about:blank' ).hide();
+
+                       file.name = 'file';
+
+                       $.each( data, function ( key, val ) {
+                               $form.append( getHiddenInput( key, val ) );
+                       } );
+
+                       if ( !data.filename && !data.stash ) {
+                               return $.Deferred().reject( 'Filename not included in file data.' );
+                       }
+
+                       if ( this.needToken() ) {
+                               this.getEditToken().then( function ( token ) {
+                                       $form.append( getHiddenInput( 'token', token ) );
+                                       tokenPromise.resolve();
+                               }, tokenPromise.reject );
+                       } else {
+                               tokenPromise.resolve();
+                       }
+
+                       $( 'body' ).append( $form, $iframe );
+
+                       deferred.always( function () {
+                               $form.remove();
+                               $iframe.remove();
+                       } );
+
+                       return deferred.promise();
+               },
+
+               /**
+                * Uploads a file using the FormData API.
+                *
+                * @private
+                * @param {File} file
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               uploadWithFormData: function ( file, data ) {
+                       var key,
+                               deferred = $.Deferred();
+
+                       for ( key in data ) {
+                               if ( !fieldsAllowed[ key ] ) {
+                                       delete data[ key ];
+                               }
+                       }
+
+                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
+                       data.file = file;
+
+                       if ( !data.filename && !data.stash ) {
+                               return $.Deferred().reject( 'Filename not included in file data.' );
+                       }
+
+                       // Use this.postWithEditToken() or this.post()
+                       this[ this.needToken() ? 'postWithEditToken' : 'post' ]( data, {
+                               // Use FormData (if we got here, we know that it's available)
+                               contentType: 'multipart/form-data',
+                               // Provide upload progress notifications
+                               xhr: function () {
+                                       var xhr = $.ajaxSettings.xhr();
+                                       if ( xhr.upload ) {
+                                               // need to bind this event before we open the connection (see note at
+                                               // https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest#Monitoring_progress)
+                                               xhr.upload.addEventListener( 'progress', function ( ev ) {
+                                                       if ( ev.lengthComputable ) {
+                                                               deferred.notify( ev.loaded / ev.total );
+                                                       }
+                                               } );
+                                       }
+                                       return xhr;
+                               }
+                       } )
+                               .done( function ( result ) {
+                                       if ( result.error || result.warnings ) {
+                                               deferred.reject( result.error || result.warnings );
+                                       } else {
+                                               deferred.notify( 1 );
+                                               deferred.resolve( result );
+                                       }
+                               } )
+                               .fail( function ( result ) {
+                                       deferred.reject( result );
+                               } );
+
+                       return deferred.promise();
+               },
+
+               /**
+                * Upload a file to the stash.
+                *
+                * This function will return a promise, which when resolved, will pass back a function
+                * to finish the stash upload. You can call that function with an argument containing
+                * more, or conflicting, data to pass to the server. For example:
+                *
+                *     // upload a file to the stash with a placeholder filename
+                *     api.uploadToStash( file, { filename: 'testing.png' } ).done( function ( finish ) {
+                *         // finish is now the function we can use to finalize the upload
+                *         // pass it a new filename from user input to override the initial value
+                *         finish( { filename: getFilenameFromUser() } ).done( function ( data ) {
+                *             // the upload is complete, data holds the API response
+                *         } );
+                *     } );
+                *
+                * @param {File|HTMLInputElement} file
+                * @param {Object} [data]
+                * @return {jQuery.Promise}
+                * @return {Function} return.finishStashUpload Call this function to finish the upload.
+                * @return {Object} return.finishStashUpload.data Additional data for the upload.
+                * @return {jQuery.Promise} return.finishStashUpload.return API promise for the final upload
+                * @return {Object} return.finishStashUpload.return.data API return value for the final upload
+                */
+               uploadToStash: function ( file, data ) {
+                       var filekey,
+                               api = this;
+
+                       if ( !data.filename ) {
+                               return $.Deferred().reject( 'Filename not included in file data.' );
+                       }
+
+                       function finishUpload( moreData ) {
+                               data = $.extend( data, moreData );
+                               data.filekey = filekey;
+                               data.action = 'upload';
+                               data.format = 'json';
+
+                               if ( !data.filename ) {
+                                       return $.Deferred().reject( 'Filename not included in file data.' );
+                               }
+
+                               return api.postWithEditToken( data ).then( function ( result ) {
+                                       if ( result.upload && ( result.upload.error || result.upload.warnings ) ) {
+                                               return $.Deferred().reject( result.upload.error || result.upload.warnings ).promise();
+                                       }
+                                       return result;
+                               } );
+                       }
+
+                       return this.upload( file, { stash: true, filename: data.filename } ).then( function ( result ) {
+                               if ( result && result.upload && result.upload.filekey ) {
+                                       filekey = result.upload.filekey;
+                               } else if ( result && ( result.error || result.warning ) ) {
+                                       return $.Deferred().reject( result );
+                               }
+
+                               return finishUpload;
+                       } );
+               },
+
+               needToken: function () {
+                       return true;
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.upload
+        */
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/watch.js b/resources/src/mediawiki/api/watch.js
new file mode 100644 (file)
index 0000000..a2ff129
--- /dev/null
@@ -0,0 +1,70 @@
+/**
+ * @class mw.Api.plugin.watch
+ * @since 1.19
+ */
+( function ( mw, $ ) {
+
+       /**
+        * @private
+        * @static
+        * @context mw.Api
+        *
+        * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
+        *  array thereof. If an array is passed, the return value passed to the promise will also be an
+        *  array of appropriate objects.
+        * @return {jQuery.Promise}
+        * @return {Function} return.done
+        * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
+        *  parameter)
+        * @return {string} return.done.watch.title Full pagename
+        * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
+        * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
+        */
+       function doWatchInternal( pages, addParams ) {
+               // XXX: Parameter addParams is undocumented because we inherit this
+               // documentation in the public method...
+               var apiPromise = this.postWithToken( 'watch',
+                       $.extend(
+                               {
+                                       action: 'watch',
+                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
+                                       uselang: mw.config.get( 'wgUserLanguage' )
+                               },
+                               addParams
+                       )
+               );
+
+               return apiPromise
+                       .then( function ( data ) {
+                               // If a single page was given (not an array) respond with a single item as well.
+                               return $.isArray( pages ) ? data.watch : data.watch[ 0 ];
+                       } )
+                       .promise( { abort: apiPromise.abort } );
+       }
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for `action=watch`.
+                *
+                * @inheritdoc #doWatchInternal
+                */
+               watch: function ( pages ) {
+                       return doWatchInternal.call( this, pages );
+               },
+
+               /**
+                * Convenience method for `action=watch&unwatch=1`.
+                *
+                * @inheritdoc #doWatchInternal
+                */
+               unwatch: function ( pages ) {
+                       return doWatchInternal.call( this, pages, { unwatch: 1 } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.watch
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
new file mode 100644 (file)
index 0000000..3051d52
--- /dev/null
@@ -0,0 +1,196 @@
+/*global moment */
+( function ( $, mw ) {
+
+       /**
+        * mw.ForeignStructuredUpload.BookletLayout encapsulates the process
+        * of uploading a file to MediaWiki using the mw.ForeignStructuredUpload model.
+        *
+        *     var uploadDialog = new mw.Upload.Dialog( {
+        *         bookletClass: mw.ForeignStructuredUpload.BookletLayout,
+        *         booklet: {
+        *             targetHost: 'localhost:8080'
+        *         }
+        *     } );
+        *     var windowManager = new OO.ui.WindowManager();
+        *     $( 'body' ).append( windowManager.$element );
+        *     windowManager.addWindows( [ uploadDialog ] );
+        *
+        * @class mw.ForeignStructuredUpload.BookletLayout
+        * @uses mw.ForeignStructuredUpload
+        * @extends mw.Upload.BookletLayout
+        * @cfg {string} [targetHost] Used to set up the target wiki.
+        *     If nothing is passed, the {@link mw.ForeignUpload#property-targetHost default} is used.
+        */
+       mw.ForeignStructuredUpload.BookletLayout = function ( config ) {
+               config = config || {};
+               // Parent constructor
+               mw.ForeignStructuredUpload.BookletLayout.parent.call( this, config );
+
+               this.targetHost = config.targetHost;
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.ForeignStructuredUpload.BookletLayout, mw.Upload.BookletLayout );
+
+       /* Uploading */
+
+       /**
+        * Returns a {@link mw.ForeignStructuredUpload mw.ForeignStructuredUpload}
+        * with the {@link #cfg-targetHost targetHost} specified in config.
+        *
+        * @protected
+        * @return {mw.Upload}
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.createUpload = function () {
+               return new mw.ForeignStructuredUpload( this.targetHost );
+       };
+
+       /* Form renderers */
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm = function () {
+               var fieldset,
+                       target = mw.config.get( 'wgRemoteUploadTarget' ),
+                       $ownWorkMessage = $( '<p>' ).html(
+                               mw.message( 'foreign-structured-upload-form-label-own-work-message-' + target ).parse()
+                       ),
+                       $notOwnWorkMessage = $( '<div>' ).append(
+                               $( '<p>' ).html(
+                                       mw.message( 'foreign-structured-upload-form-label-not-own-work-message-' + target ).parse()
+                               ),
+                               $( '<p>' ).html(
+                                       mw.message( 'foreign-structured-upload-form-label-not-own-work-local-' + target ).parse()
+                               )
+                       ),
+                       layout = this;
+
+               this.selectFileWidget = new OO.ui.SelectFileWidget();
+               this.messageLabel = new OO.ui.LabelWidget( {
+                       label: $notOwnWorkMessage
+               } );
+               this.ownWorkCheckbox = new OO.ui.CheckboxInputWidget().on( 'change', function ( on ) {
+                       if ( on ) {
+                               layout.messageLabel.setLabel( $ownWorkMessage );
+                       } else {
+                               layout.messageLabel.setLabel( $notOwnWorkMessage );
+                       }
+               } );
+
+               fieldset = new OO.ui.FieldsetLayout();
+               fieldset.addItems( [
+                       new OO.ui.FieldLayout( this.selectFileWidget, {
+                               align: 'top',
+                               label: mw.msg( 'upload-form-label-select-file' )
+                       } ),
+                       new OO.ui.FieldLayout( this.ownWorkCheckbox, {
+                               align: 'inline',
+                               label: mw.msg( 'foreign-structured-upload-form-label-own-work' )
+                       } ),
+                       this.messageLabel
+               ] );
+               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               // Validation
+               this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );
+               this.ownWorkCheckbox.on( 'change', this.onUploadFormChange.bind( this ) );
+
+               return this.uploadForm;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.onUploadFormChange = function () {
+               var file = this.selectFileWidget.getValue(),
+                       ownWork = this.ownWorkCheckbox.isSelected(),
+                       valid = !!file && ownWork;
+               this.emit( 'uploadValid', valid );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.renderInfoForm = function () {
+               var fieldset;
+
+               this.filenameWidget = new OO.ui.TextInputWidget( {
+                       required: true,
+                       validate: /.+/
+               } );
+               this.descriptionWidget = new OO.ui.TextInputWidget( {
+                       required: true,
+                       validate: /.+/,
+                       multiline: true,
+                       autosize: true
+               } );
+               this.dateWidget = new mw.widgets.DateInputWidget( {
+                       $overlay: this.$overlay,
+                       required: true,
+                       mustBeBefore: moment().add( 1, 'day' ).locale( 'en' ).format( 'YYYY-MM-DD' ) // Tomorrow
+               } );
+               this.categoriesWidget = new mw.widgets.CategorySelector( {
+                       $overlay: this.$overlay
+               } );
+
+               fieldset = new OO.ui.FieldsetLayout( {
+                       label: mw.msg( 'upload-form-label-infoform-title' )
+               } );
+               fieldset.addItems( [
+                       new OO.ui.FieldLayout( this.filenameWidget, {
+                               label: mw.msg( 'upload-form-label-infoform-name' ),
+                               align: 'top'
+                       } ),
+                       new OO.ui.FieldLayout( this.categoriesWidget, {
+                               label: mw.msg( 'foreign-structured-upload-form-label-infoform-categories' ),
+                               align: 'top'
+                       } ),
+                       new OO.ui.FieldLayout( this.descriptionWidget, {
+                               label: mw.msg( 'upload-form-label-infoform-description' ),
+                               align: 'top'
+                       } ),
+                       new OO.ui.FieldLayout( this.dateWidget, {
+                               label: mw.msg( 'foreign-structured-upload-form-label-infoform-date' ),
+                               align: 'top'
+                       } )
+               ] );
+               this.infoForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               // Validation
+               this.filenameWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+               this.descriptionWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+               this.dateWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+
+               return this.infoForm;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.onInfoFormChange = function () {
+               var layout = this;
+               $.when(
+                       this.filenameWidget.getValidity(),
+                       this.descriptionWidget.getValidity(),
+                       this.dateWidget.getValidity()
+               ).done( function () {
+                       layout.emit( 'infoValid', true );
+               } ).fail( function () {
+                       layout.emit( 'infoValid', false );
+               } );
+       };
+
+       /* Getters */
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.getText = function () {
+               this.upload.addDescription( 'en', this.descriptionWidget.getValue() );
+               this.upload.setDate( this.dateWidget.getValue() );
+               this.upload.addCategories( this.categoriesWidget.getItemsData() );
+               return this.upload.getText();
+       };
+}( jQuery, mediaWiki ) );
index fe8520b..3a70a66 100644 (file)
@@ -11,8 +11,8 @@
         * See <https://commons.wikimedia.org/wiki/Commons:Structured_data> for
         * a more detailed description of how that system works.
         *
-        * TODO this currently only supports uploads under CC-BY-SA 4.0,
-        *     and should really have support for more licenses.
+        * **TODO: This currently only supports uploads under CC-BY-SA 4.0,
+        * and should really have support for more licenses.**
         *
         * @inheritdoc
         */
diff --git a/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js b/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
new file mode 100644 (file)
index 0000000..b574a5d
--- /dev/null
@@ -0,0 +1,481 @@
+( function ( $, mw ) {
+
+       /**
+        * mw.Upload.BookletLayout encapsulates the process of uploading a file
+        * to MediaWiki using the {@link mw.Upload upload model}.
+        * The booklet emits events that can be used to get the stashed
+        * upload and the final file. It can be extended to accept
+        * additional fields from the user for specific scenarios like
+        * for Commons, or campaigns.
+        *
+        * ## Structure
+        *
+        * The {@link OO.ui.BookletLayout booklet layout} has three steps:
+        *
+        *  - **Upload**: Has a {@link OO.ui.SelectFileWidget field} to get the file object.
+        *
+        * - **Information**: Has a {@link OO.ui.FormLayout form} to collect metadata. This can be
+        *   extended.
+        *
+        * - **Insert**: Has details on how to use the file that was uploaded.
+        *
+        * Each step has a form associated with it defined in
+        * {@link #renderUploadForm renderUploadForm},
+        * {@link #renderInfoForm renderInfoForm}, and
+        * {@link #renderInsertForm renderInfoForm}. The
+        * {@link #getFile getFile},
+        * {@link #getFilename getFilename}, and
+        * {@link #getText getText} methods are used to get
+        * the information filled in these forms, required to call
+        * {@link mw.Upload mw.Upload}.
+        *
+        * ## Usage
+        *
+        * See the {@link mw.Upload.Dialog upload dialog}.
+        *
+        * The {@link #event-fileUploaded fileUploaded},
+        * and {@link #event-fileSaved fileSaved} events can
+        * be used to get details of the upload.
+        *
+        * ## Extending
+        *
+        * To extend using {@link mw.Upload mw.Upload}, override
+        * {@link #renderInfoForm renderInfoForm} to render
+        * the form required for the specific use-case. Update the
+        * {@link #getFilename getFilename}, and
+        * {@link #getText getText} methods to return data
+        * from your newly created form. If you added new fields you'll also have
+        * to update the {@link #clear} method.
+        *
+        * If you plan to use a different upload model, apart from what is mentioned
+        * above, you'll also have to override the
+        * {@link #createUpload createUpload} method to
+        * return the new model. The {@link #saveFile saveFile}, and
+        * the {@link #uploadFile uploadFile} methods need to be
+        * overriden to use the new model and data returned from the forms.
+        *
+        * @class
+        * @extends OO.ui.BookletLayout
+        *
+        * @constructor
+        * @param {Object} config Configuration options
+        * @cfg {jQuery} [$overlay] Overlay to use for widgets in the booklet
+        */
+       mw.Upload.BookletLayout = function ( config ) {
+               // Parent constructor
+               mw.Upload.BookletLayout.parent.call( this, config );
+
+               this.$overlay = config.$overlay;
+
+               this.renderUploadForm();
+               this.renderInfoForm();
+               this.renderInsertForm();
+
+               this.addPages( [
+                       new OO.ui.PageLayout( 'upload', {
+                               scrollable: true,
+                               padded: true,
+                               content: [ this.uploadForm ]
+                       } ),
+                       new OO.ui.PageLayout( 'info', {
+                               scrollable: true,
+                               padded: true,
+                               content: [ this.infoForm ]
+                       } ),
+                       new OO.ui.PageLayout( 'insert', {
+                               scrollable: true,
+                               padded: true,
+                               content: [ this.insertForm ]
+                       } )
+               ] );
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.Upload.BookletLayout, OO.ui.BookletLayout );
+
+       /* Events */
+
+       /**
+        * The file has finished uploading
+        *
+        * @event fileUploaded
+        */
+
+       /**
+        * The file has been saved to the database
+        *
+        * @event fileSaved
+        */
+
+       /**
+        * The upload form has changed
+        *
+        * @event uploadValid
+        * @param {boolean} isValid The form is valid
+        */
+
+       /**
+        * The info form has changed
+        *
+        * @event infoValid
+        * @param {boolean} isValid The form is valid
+        */
+
+       /* Properties */
+
+       /**
+        * @property {OO.ui.FormLayout} uploadForm
+        * The form rendered in the first step to get the file object.
+        * Rendered in {@link #renderUploadForm renderUploadForm}.
+        */
+
+       /**
+        * @property {OO.ui.FormLayout} infoForm
+        * The form rendered in the second step to get metadata.
+        * Rendered in {@link #renderInfoForm renderInfoForm}
+        */
+
+       /**
+        * @property {OO.ui.FormLayout} insertForm
+        * The form rendered in the third step to show usage
+        * Rendered in {@link #renderInsertForm renderInsertForm}
+        */
+
+       /* Methods */
+
+       /**
+        * Initialize for a new upload
+        */
+       mw.Upload.BookletLayout.prototype.initialize = function () {
+               this.clear();
+               this.upload = this.createUpload();
+               this.setPage( 'upload' );
+       };
+
+       /**
+        * Create a new upload model
+        *
+        * @protected
+        * @return {mw.Upload} Upload model
+        */
+       mw.Upload.BookletLayout.prototype.createUpload = function () {
+               return new mw.Upload();
+       };
+
+       /* Uploading */
+
+       /**
+        * Uploads the file that was added in the upload form. Uses
+        * {@link #getFile getFile} to get the HTML5
+        * file object.
+        *
+        * @protected
+        * @fires fileUploaded
+        * @return {jQuery.Promise}
+        */
+       mw.Upload.BookletLayout.prototype.uploadFile = function () {
+               var deferred = $.Deferred(),
+                       layout = this,
+                       file = this.getFile();
+
+               this.filenameWidget.setValue( file.name );
+               this.setPage( 'info' );
+
+               this.upload.setFile( file );
+               // Explicitly set the filename so that the old filename isn't used in case of retry
+               this.upload.setFilenameFromFile();
+
+               this.uploadPromise = this.upload.uploadToStash();
+               this.uploadPromise.then( function () {
+                       deferred.resolve();
+                       layout.emit( 'fileUploaded' );
+               }, function () {
+                       // These errors will be thrown while the user is on the info page
+                       if ( layout.upload.getState() === mw.Upload.State.ERROR ) {
+                               deferred.reject( new OO.ui.Error( layout.upload.getStateDetails(), {
+                                       recoverable: false
+                               } ) );
+                               return false;
+                       }
+                       if ( layout.upload.getState() === mw.Upload.State.WARNING ) {
+                               deferred.reject( new OO.ui.Error( layout.upload.getStateDetails(), {
+                                       recoverable: false
+                               } ) );
+                               return false;
+                       }
+               } );
+
+               // If there is an error in uploading, come back to the upload page
+               deferred.fail( function () {
+                       layout.setPage( 'upload' );
+               } );
+
+               return deferred;
+       };
+
+       /**
+        * Saves the stash finalizes upload. Uses
+        * {@link #getFilename getFilename}, and
+        * {@link #getText getText} to get details from
+        * the form.
+        *
+        * @protected
+        * @fires fileSaved
+        * @returns {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 () {
+               var layout = this,
+                       deferred = $.Deferred();
+
+               this.upload.setFilename( this.getFilename() );
+               this.upload.setText( this.getText() );
+
+               this.uploadPromise.then( function () {
+                       layout.upload.finishStashUpload().then( function () {
+                               var name;
+
+                               // Normalize page name and localise the 'File:' prefix
+                               name = new mw.Title( 'File:' + layout.upload.getFilename() ).toString();
+                               layout.filenameUsageWidget.setValue( '[[' + name + ']]' );
+                               layout.setPage( 'insert' );
+
+                               deferred.resolve();
+                               layout.emit( 'fileSaved' );
+                       }, function () {
+                               var stateDetails = layout.upload.getStateDetails();
+
+                               if ( layout.upload.getState() === mw.Upload.State.ERROR ) {
+                                       deferred.reject( new OO.ui.Error( stateDetails, {
+                                               recoverable: false
+                                       } ) );
+                                       return false;
+                               }
+
+                               if ( layout.upload.getState() === mw.Upload.State.WARNING ) {
+                                       if ( stateDetails.exists !== undefined ) {
+                                               deferred.reject( new OO.ui.Error(
+                                                       $( '<p>' ).html(
+                                                               mw.message( 'filepageexists', stateDetails.exists ).parse()
+                                                       ),
+                                                       { recoverable: false }
+                                               ) );
+                                       } else if ( stateDetails.duplicate !== undefined ) {
+                                               deferred.reject( new OO.ui.Error(
+                                                       $( '<p>' ).html(
+                                                               mw.message( 'fileexists', stateDetails.duplicate[ 0 ] ).parse()
+                                                       ),
+                                                       { recoverable: false }
+                                               ) );
+                                       } else if ( stateDetails[ 'thumb-name' ] !== undefined ) {
+                                               deferred.reject( new OO.ui.Error(
+                                                       $( '<p>' ).html(
+                                                               mw.message( 'filename-thumb-name' ).parse()
+                                                       ),
+                                                       { recoverable: false }
+                                               ) );
+                                       } else if ( stateDetails[ 'bad-prefix' ] !== undefined ) {
+                                               deferred.reject( new OO.ui.Error(
+                                                       $( '<p>' ).html(
+                                                               mw.message( 'filename-bad-prefix', stateDetails[ 'bad-prefix' ] ).parse()
+                                                       ),
+                                                       { recoverable: false }
+                                               ) );
+                                       } else if ( stateDetails[ 'duplicate-archive' ] !== undefined ) {
+                                               deferred.reject( new OO.ui.Error(
+                                                       $( '<p>' ).html(
+                                                               mw.message( 'api-error-duplicate-archive', stateDetails[ 'duplicate-archive' ] ).parse()
+                                                       ),
+                                                       { recoverable: false }
+                                               ) );
+                                       } else if ( stateDetails.badfilename !== undefined ) {
+                                               // Change the name if the current name isn't acceptable
+                                               layout.filenameWidget.setValue( stateDetails.badfilename );
+                                               deferred.reject( new OO.ui.Error(
+                                                       $( '<p>' ).html(
+                                                               mw.message( 'badfilename', stateDetails.badfilename ).parse()
+                                                       )
+                                               ) );
+                                       }
+
+                                       return false;
+                               }
+                       } );
+               } );
+
+               return deferred.promise();
+       };
+
+       /* Form renderers */
+
+       /**
+        * Renders and returns the upload form and sets the
+        * {@link #uploadForm uploadForm} property.
+        *
+        * @protected
+        * @fires selectFile
+        * @returns {OO.ui.FormLayout}
+        */
+       mw.Upload.BookletLayout.prototype.renderUploadForm = function () {
+               var fieldset;
+
+               this.selectFileWidget = new OO.ui.SelectFileWidget();
+               fieldset = new OO.ui.FieldsetLayout( { label: mw.msg( 'upload-form-label-select-file' ) } );
+               fieldset.addItems( [ this.selectFileWidget ] );
+               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               // Validation
+               this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );
+
+               return this.uploadForm;
+       };
+
+       /**
+        * Handle change events to the upload form
+        *
+        * @protected
+        * @fires uploadValid
+        */
+       mw.Upload.BookletLayout.prototype.onUploadFormChange = function () {
+               this.emit( 'uploadValid', !!this.selectFileWidget.getValue() );
+       };
+
+       /**
+        * Renders and returns the information form for collecting
+        * metadata and sets the {@link #infoForm infoForm}
+        * property.
+        *
+        * @protected
+        * @returns {OO.ui.FormLayout}
+        */
+       mw.Upload.BookletLayout.prototype.renderInfoForm = function () {
+               var fieldset;
+
+               this.filenameWidget = new OO.ui.TextInputWidget( {
+                       indicator: 'required',
+                       required: true,
+                       validate: /.+/
+               } );
+               this.descriptionWidget = new OO.ui.TextInputWidget( {
+                       indicator: 'required',
+                       required: true,
+                       validate: /.+/,
+                       multiline: true,
+                       autosize: true
+               } );
+
+               fieldset = new OO.ui.FieldsetLayout( {
+                       label: mw.msg( 'upload-form-label-infoform-title' )
+               } );
+               fieldset.addItems( [
+                       new OO.ui.FieldLayout( this.filenameWidget, {
+                               label: mw.msg( 'upload-form-label-infoform-name' ),
+                               align: 'top'
+                       } ),
+                       new OO.ui.FieldLayout( this.descriptionWidget, {
+                               label: mw.msg( 'upload-form-label-infoform-description' ),
+                               align: 'top'
+                       } )
+               ] );
+               this.infoForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               this.filenameWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+               this.descriptionWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+
+               return this.infoForm;
+       };
+
+       /**
+        * Handle change events to the info form
+        *
+        * @protected
+        * @fires infoValid
+        */
+       mw.Upload.BookletLayout.prototype.onInfoFormChange = function () {
+               var layout = this;
+               $.when(
+                       this.filenameWidget.getValidity(),
+                       this.descriptionWidget.getValidity()
+               ).done( function () {
+                       layout.emit( 'infoValid', true );
+               } ).fail( function () {
+                       layout.emit( 'infoValid', false );
+               } );
+       };
+
+       /**
+        * Renders and returns the insert form to show file usage and
+        * sets the {@link #insertForm insertForm} property.
+        *
+        * @protected
+        * @returns {OO.ui.FormLayout}
+        */
+       mw.Upload.BookletLayout.prototype.renderInsertForm = function () {
+               var fieldset;
+
+               this.filenameUsageWidget = new OO.ui.TextInputWidget();
+               fieldset = new OO.ui.FieldsetLayout( {
+                       label: mw.msg( 'upload-form-label-usage-title' )
+               } );
+               fieldset.addItems( [
+                       new OO.ui.FieldLayout( this.filenameUsageWidget, {
+                               label: mw.msg( 'upload-form-label-usage-filename' ),
+                               align: 'top'
+                       } )
+               ] );
+               this.insertForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               return this.insertForm;
+       };
+
+       /* Getters */
+
+       /**
+        * Gets the file object from the
+        * {@link #uploadForm upload form}.
+        *
+        * @protected
+        * @returns {File|null}
+        */
+       mw.Upload.BookletLayout.prototype.getFile = function () {
+               return this.selectFileWidget.getValue();
+       };
+
+       /**
+        * Gets the file name from the
+        * {@link #infoForm information form}.
+        *
+        * @protected
+        * @returns {string}
+        */
+       mw.Upload.BookletLayout.prototype.getFilename = function () {
+               return this.filenameWidget.getValue();
+       };
+
+       /**
+        * Gets the page text from the
+        * {@link #infoForm information form}.
+        *
+        * @protected
+        * @returns {string}
+        */
+       mw.Upload.BookletLayout.prototype.getText = function () {
+               return this.descriptionWidget.getValue();
+       };
+
+       /* Setters */
+
+       /**
+        * Clear the values of all fields
+        *
+        * @protected
+        */
+       mw.Upload.BookletLayout.prototype.clear = function () {
+               this.selectFileWidget.setValue( null );
+               this.filenameWidget.setValue( null ).setValidityFlag( true );
+               this.descriptionWidget.setValue( null ).setValidityFlag( true );
+               this.filenameUsageWidget.setValue( null );
+       };
+
+}( jQuery, mediaWiki ) );
index 36fbd46..03e3971 100644 (file)
@@ -1,33 +1,7 @@
 ( function ( $, mw ) {
 
        /**
-        * mw.Upload.Dialog encapsulates the process of uploading a file
-        * to MediaWiki using the {@link mw.Upload mw.Upload} model.
-        * The dialog emits events that can be used to get the stashed
-        * upload and the final file. It can be extended to accept
-        * additional fields from the user for specific scenarios like
-        * for Commons, or campaigns.
-        *
-        * ## Structure
-        *
-        * The {@link OO.ui.ProcessDialog dialog} has three steps:
-        *
-        *  - **Upload**: Has a {@link OO.ui.SelectFileWidget field} to get the file object.
-        *
-        * - **Information**: Has a {@link OO.ui.FormLayout form} to collect metadata. This can be
-        *   extended.
-        *
-        * - **Insert**: Has details on how to use the file that was uploaded.
-        *
-        * Each step has a form associated with it defined in
-        * {@link mw.Upload.Dialog#renderUploadForm renderUploadForm},
-        * {@link mw.Upload.Dialog#renderInfoForm renderInfoForm}, and
-        * {@link mw.Upload.Dialog#renderInsertForm renderInfoForm}. The
-        * {@link mw.Upload.Dialog#getFile getFile},
-        * {@link mw.Upload.Dialog#getFilename getFilename}, and
-        * {@link mw.Upload.Dialog#getText getText} methods are used to get
-        * the information filled in these forms, required to call
-        * {@link mw.Upload mw.Upload}.
+        * mw.Upload.Dialog controls a {@link mw.Upload.BookletLayout BookletLayout}.
         *
         * ## Usage
         *
         *     windowManager.addWindows( [ uploadDialog ] );
         *     windowManager.openWindow( uploadDialog );
         *
-        * The dialog's closing promise,
-        * {@link mw.Upload.Dialog#event-fileUploaded fileUploaded},
-        * and {@link mw.Upload.Dialog#event-fileSaved fileSaved} events can
-        * be used to get details of the upload.
-        *
-        * ## Extending
-        *
-        * To extend using {@link mw.Upload mw.Upload}, override
-        * {@link mw.Upload.Dialog#renderInfoForm renderInfoForm} to render
-        * the form required for the specific use-case. Update the
-        * {@link mw.Upload.Dialog#getFilename getFilename}, and
-        * {@link mw.Upload.Dialog#getText getText} methods to return data
-        * from your newly created form. If you added new fields you'll also have
-        * to update the {@link #getTeardownProcess} method.
-        *
-        * If you plan to use a different upload model, apart from what is mentioned
-        * above, you'll also have to override the
-        * {@link mw.Upload.Dialog#getUploadObject getUploadObject} method to
-        * return the new model. The {@link mw.Upload.Dialog#saveFile saveFile}, and
-        * the {@link mw.Upload.Dialog#uploadFile uploadFile} methods need to be
-        * overriden to use the new model and data returned from the forms.
+        * The dialog's closing promise can be used to get details of the upload.
         *
         * @class mw.Upload.Dialog
         * @uses mw.Upload
         * @extends OO.ui.ProcessDialog
+        * @cfg {Function} [bookletClass=mw.Upload.BookletLayout] Booklet class to be
+        *     used for the steps
+        * @cfg {Object} [booklet] Booklet constructor configuration
         */
        mw.Upload.Dialog = function ( config ) {
+               // Config initialization
+               config = $.extend( {
+                       bookletClass: mw.Upload.BookletLayout
+               }, config );
+
                // Parent constructor
                mw.Upload.Dialog.parent.call( this, config );
+
+               // Initialize
+               this.bookletClass = config.bookletClass;
+               this.bookletConfig = config.booklet;
        };
 
        /* Setup */
@@ -93,7 +59,7 @@
                        flags: 'safe',
                        action: 'cancel',
                        label: mw.msg( 'upload-dialog-button-cancel' ),
-                       modes: [ 'upload', 'insert', 'save' ]
+                       modes: [ 'upload', 'insert', 'info' ]
                },
                {
                        flags: [ 'primary', 'progressive' ],
                        flags: [ 'primary', 'constructive' ],
                        label: mw.msg( 'upload-dialog-button-save' ),
                        action: 'save',
-                       modes: 'save'
+                       modes: 'info'
                },
                {
                        flags: [ 'primary', 'progressive' ],
                        modes: 'upload'
                }
        ];
-       /*jshint +W024*/
 
-       /* Properties */
+       /*jshint +W024*/
 
-       /**
-        * @property {OO.ui.FormLayout} uploadForm
-        * The form rendered in the first step to get the file object.
-        * Rendered in {@link mw.Upload.Dialog#renderUploadForm renderUploadForm}.
-        */
+       /* Methods */
 
        /**
-        * @property {OO.ui.FormLayout} infoForm
-        * The form rendered in the second step to get metadata.
-        * Rendered in {@link mw.Upload.Dialog#renderInfoForm renderInfoForm}
+        * @inheritdoc
         */
+       mw.Upload.Dialog.prototype.initialize = function () {
+               // Parent method
+               mw.Upload.Dialog.parent.prototype.initialize.call( this );
 
-       /**
-        * @property {OO.ui.FormLayout} insertForm
-        * The form rendered in the third step to show usage
-        * Rendered in {@link mw.Upload.Dialog#renderInsertForm renderInsertForm}
-        */
+               this.uploadBooklet = this.createUploadBooklet();
+               this.uploadBooklet.connect( this, {
+                       set: 'onUploadBookletSet',
+                       uploadValid: 'onUploadValid',
+                       infoValid: 'onInfoValid'
+               } );
 
-       /* Events */
+               this.$body.append( this.uploadBooklet.$element );
+       };
 
        /**
-        * A `fileUploaded` event is emitted from the
-        * {@link mw.Upload.Dialog#uploadFile uploadFile} method.
+        * Create an upload booklet
         *
-        * @event fileUploaded
+        * @protected
+        * @return {mw.Upload.BookletLayout} An upload booklet
         */
+       mw.Upload.Dialog.prototype.createUploadBooklet = function () {
+               return new this.bookletClass( $.extend( {
+                       $overlay: this.$overlay
+               }, this.bookletConfig ) );
+       };
 
        /**
-        * A `fileSaved` event is emitted from the
-        * {@link mw.Upload.Dialog#saveFile saveFile} method.
-        *
-        * @event fileSaved
+        * @inheritdoc
         */
-
-       /* Methods */
+       mw.Upload.Dialog.prototype.getBodyHeight = function () {
+               return 300;
+       };
 
        /**
-        * @inheritdoc
+        * Handle panelNameSet events from the upload booklet
+        *
+        * @protected
+        * @param {OO.ui.PageLayout} page Current page
         */
-       mw.Upload.Dialog.prototype.initialize = function () {
-               mw.Upload.Dialog.parent.prototype.initialize.call( this );
-
-               this.renderUploadForm();
-               this.renderInfoForm();
-               this.renderInsertForm();
-
-               this.uploadFormPanel = new OO.ui.PanelLayout( {
-                       scrollable: true,
-                       padded: true,
-                       content: [ this.uploadForm ]
-               } );
-               this.infoFormPanel = new OO.ui.PanelLayout( {
-                       scrollable: true,
-                       padded: true,
-                       content: [ this.infoForm ]
-               } );
-               this.insertFormPanel = new OO.ui.PanelLayout( {
-                       scrollable: true,
-                       padded: true,
-                       content: [ this.insertForm ]
-               } );
-
-               this.panels = new OO.ui.StackLayout();
-               this.panels.addItems( [
-                       this.uploadFormPanel,
-                       this.infoFormPanel,
-                       this.insertFormPanel
-               ] );
-
-               this.$body.append( this.panels.$element );
+       mw.Upload.Dialog.prototype.onUploadBookletSet = function ( page ) {
+               this.actions.setMode( page.getName() );
+               this.actions.setAbilities( { upload: false, save: false } );
        };
 
        /**
-        * @inheritdoc
+        * Handle uploadValid events
+        *
+        * {@link OO.ui.ActionSet#setAbilities Sets abilities}
+        * for the dialog accordingly.
+        *
+        * @protected
+        * @param {boolean} isValid The panel is complete and valid
         */
-       mw.Upload.Dialog.prototype.getBodyHeight = function () {
-               return 300;
+       mw.Upload.Dialog.prototype.onUploadValid = function ( isValid ) {
+               this.actions.setAbilities( { upload: isValid } );
        };
 
        /**
-        * Switch between the panels.
+        * Handle infoValid events
+        *
+        * {@link OO.ui.ActionSet#setAbilities Sets abilities}
+        * for the dialog accordingly.
         *
-        * @param {string} panel Panel name: 'upload', 'info', 'insert'
+        * @protected
+        * @param {boolean} isValid The panel is complete and valid
         */
-       mw.Upload.Dialog.prototype.switchPanels = function ( panel ) {
-               switch ( panel ) {
-               case 'upload':
-                       this.panels.setItem( this.uploadFormPanel );
-                       this.actions.setMode( 'upload' );
-                       break;
-               case 'info':
-                       this.panels.setItem( this.infoFormPanel );
-                       this.actions.setMode( 'save' );
-                       break;
-               case 'insert':
-                       this.panels.setItem( this.insertFormPanel );
-                       this.actions.setMode( 'insert' );
-                       break;
-               }
+       mw.Upload.Dialog.prototype.onInfoValid = function ( isValid ) {
+               this.actions.setAbilities( { save: isValid } );
        };
 
        /**
        mw.Upload.Dialog.prototype.getSetupProcess = function ( data ) {
                return mw.Upload.Dialog.parent.prototype.getSetupProcess.call( this, data )
                        .next( function () {
-                               this.upload = this.getUploadObject();
-                               this.switchPanels( 'upload' );
-                               this.actions.setAbilities( { upload: false } );
+                               this.uploadBooklet.initialize();
                        }, this );
        };
 
                var dialog = this;
 
                if ( action === 'upload' ) {
-                       return new OO.ui.Process( function () {
-                               dialog.filenameWidget.setValue( dialog.getFile().name );
-                               dialog.switchPanels( 'info' );
-                               dialog.actions.setAbilities( { save: false } );
-                               return dialog.uploadFile();
-                       } );
+                       return new OO.ui.Process( this.uploadBooklet.uploadFile() );
                }
                if ( action === 'save' ) {
-                       return new OO.ui.Process( dialog.saveFile() );
+                       return new OO.ui.Process( this.uploadBooklet.saveFile() );
                }
                if ( action === 'insert' ) {
                        return new OO.ui.Process( function () {
                        } );
                }
                if ( action === 'cancel' ) {
-                       return new OO.ui.Process( dialog.close() );
+                       return new OO.ui.Process( this.close() );
                }
 
                return mw.Upload.Dialog.parent.prototype.getActionProcess.call( this, action );
        mw.Upload.Dialog.prototype.getTeardownProcess = function ( data ) {
                return mw.Upload.Dialog.parent.prototype.getTeardownProcess.call( this, data )
                        .next( function () {
-                               // Clear the values of all fields
-                               this.selectFileWidget.setValue( null );
-                               this.filenameWidget.setValue( null ).setValidityFlag( true );
-                               this.descriptionWidget.setValue( null ).setValidityFlag( true );
-                               this.filenameUsageWidget.setValue( null );
+                               this.uploadBooklet.clear();
                        }, this );
        };
 
-       /* Uploading */
-
-       /**
-        * Get the upload model object required for this dialog. Can be
-        * extended to different models.
-        *
-        * @return {mw.Upload}
-        */
-       mw.Upload.Dialog.prototype.getUploadObject = function () {
-               return new mw.Upload();
-       };
-
-       /**
-        * Uploads the file that was added in the upload form. Uses
-        * {@link mw.Upload.Dialog#getFile getFile} to get the HTML5
-        * file object.
-        *
-        * @protected
-        * @fires fileUploaded
-        * @return {jQuery.Promise}
-        */
-       mw.Upload.Dialog.prototype.uploadFile = function () {
-               var dialog = this,
-                       file = this.getFile();
-               this.upload.setFile( file );
-               this.uploadPromise = this.upload.uploadToStash();
-               this.uploadPromise.then( function () {
-                       dialog.emit( 'fileUploaded' );
-               } );
-
-               return this.uploadPromise;
-       };
-
-       /**
-        * Saves the stash finalizes upload. Uses
-        * {@link mw.Upload.Dialog#getFilename getFilename}, and
-        * {@link mw.Upload.Dialog#getText getText} to get details from
-        * the form.
-        *
-        * @protected
-        * @fires fileSaved
-        * @returns {jQuery.Promise} Rejects the promise with an
-        * {@link OO.ui.Error error}, or resolves if the upload was successful.
-        */
-       mw.Upload.Dialog.prototype.saveFile = function () {
-               var dialog = this,
-                       promise = $.Deferred();
-
-               this.upload.setFilename( this.getFilename() );
-               this.upload.setText( this.getText() );
-
-               this.uploadPromise.always( function () {
-
-                       if ( dialog.upload.getState() === mw.Upload.State.ERROR ) {
-                               promise.reject( new OO.ui.Error( mw.msg( 'upload-dialog-error' )  ) );
-                               return false;
-                       }
-
-                       if ( dialog.upload.getState() === mw.Upload.State.WARNING ) {
-                               promise.reject( new OO.ui.Error( mw.msg( 'upload-dialog-error' )  ) );
-                               return false;
-                       }
-
-                       dialog.upload.finishStashUpload().always( function () {
-                               var name;
-
-                               if ( dialog.upload.getState() === mw.Upload.State.ERROR ) {
-                                       promise.reject( new OO.ui.Error( mw.msg( 'upload-dialog-error' ) ) );
-                                       return false;
-                               }
-
-                               if ( dialog.upload.getState() === mw.Upload.State.WARNING ) {
-                                       promise.reject( new OO.ui.Error( mw.msg( 'upload-dialog-warning' ) ) );
-                                       return false;
-                               }
-
-                               // Normalize page name and localise the 'File:' prefix
-                               name = new mw.Title( 'File:' + dialog.upload.getFilename() ).toString();
-                               dialog.filenameUsageWidget.setValue( '[[' + name + ']]' );
-                               dialog.switchPanels( 'insert' );
-
-                               promise.resolve();
-                               dialog.emit( 'fileSaved' );
-                       } );
-               } );
-
-               return promise.promise();
-       };
-
-       /* Form renderers */
-
-       /**
-        * Renders and returns the upload form and sets the
-        * {@link mw.Upload.Dialog#uploadForm uploadForm} property.
-        * Validates the form and
-        * {@link OO.ui.ActionSet#setAbilities sets abilities}
-        * for the dialog accordingly.
-        *
-        * @protected
-        * @returns {OO.ui.FormLayout}
-        */
-       mw.Upload.Dialog.prototype.renderUploadForm = function () {
-               var fieldset,
-                       dialog = this;
-
-               this.selectFileWidget = new OO.ui.SelectFileWidget();
-               fieldset = new OO.ui.FieldsetLayout( { label: mw.msg( 'upload-dialog-label-select-file' ) } );
-               fieldset.addItems( [ this.selectFileWidget ] );
-               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
-
-               // Validation
-               this.selectFileWidget.on( 'change', function ( value ) {
-                       dialog.actions.setAbilities( { upload: !!value } );
-               } );
-
-               return this.uploadForm;
-       };
-
-       /**
-        * Renders and returns the information form for collecting
-        * metadata and sets the {@link mw.Upload.Dialog#infoForm infoForm}
-        * property.
-        * Validates the form and
-        * {@link OO.ui.ActionSet#setAbilities sets abilities}
-        * for the dialog accordingly.
-        *
-        * @protected
-        * @returns {OO.ui.FormLayout}
-        */
-       mw.Upload.Dialog.prototype.renderInfoForm = function () {
-               var fieldset,
-                       dialog = this;
-
-               this.filenameWidget = new OO.ui.TextInputWidget( {
-                       indicator: 'required',
-                       required: true,
-                       validate: /.+/
-               } );
-               this.descriptionWidget = new OO.ui.TextInputWidget( {
-                       indicator: 'required',
-                       required: true,
-                       validate: /.+/,
-                       multiline: true,
-                       autosize: true
-               } );
-
-               fieldset = new OO.ui.FieldsetLayout( {
-                       label: mw.msg( 'upload-dialog-label-infoform-title' )
-               } );
-               fieldset.addItems( [
-                       new OO.ui.FieldLayout( this.filenameWidget, {
-                               label: mw.msg( 'upload-dialog-label-infoform-name' ),
-                               align: 'top'
-                       } ),
-                       new OO.ui.FieldLayout( this.descriptionWidget, {
-                               label: mw.msg( 'upload-dialog-label-infoform-description' ),
-                               align: 'top'
-                       } )
-               ] );
-               this.infoForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
-
-               // Validation
-               function checkValidity() {
-                       $.when(
-                               dialog.filenameWidget.getValidity(),
-                               dialog.descriptionWidget.getValidity()
-                       ).done( function () {
-                               dialog.actions.setAbilities( { save: true } );
-                       } ).fail( function () {
-                               dialog.actions.setAbilities( { save: false } );
-                       } );
-               }
-               this.filenameWidget.on( 'change', checkValidity );
-               this.descriptionWidget.on( 'change', checkValidity );
-
-               return this.infoForm;
-       };
-
-       /**
-        * Renders and returns the insert form to show file usage and
-        * sets the {@link mw.Upload.Dialog#insertForm insertForm} property.
-        *
-        * @protected
-        * @returns {OO.ui.FormLayout}
-        */
-       mw.Upload.Dialog.prototype.renderInsertForm = function () {
-               var fieldset;
-
-               this.filenameUsageWidget = new OO.ui.TextInputWidget();
-               fieldset = new OO.ui.FieldsetLayout( {
-                       label: mw.msg( 'upload-dialog-label-usage-title' )
-               } );
-               fieldset.addItems( [
-                       new OO.ui.FieldLayout( this.filenameUsageWidget, {
-                               label: mw.msg( 'upload-dialog-label-usage-filename' ),
-                               align: 'top'
-                       } )
-               ] );
-               this.insertForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
-
-               return this.insertForm;
-       };
-
-       /* Getters */
-
-       /**
-        * Gets the file object from the
-        * {@link mw.Upload.Dialog#uploadForm upload form}.
-        *
-        * @protected
-        * @returns {File|null}
-        */
-       mw.Upload.Dialog.prototype.getFile = function () {
-               return this.selectFileWidget.getValue();
-       };
-
-       /**
-        * Gets the file name from the
-        * {@link mw.Upload.Dialog#infoForm information form}.
-        *
-        * @protected
-        * @returns {string}
-        */
-       mw.Upload.Dialog.prototype.getFilename = function () {
-               return this.filenameWidget.getValue();
-       };
-
-       /**
-        * Gets the page text from the
-        * {@link mw.Upload.Dialog#infoForm information form}.
-        *
-        * @protected
-        * @returns {string}
-        */
-       mw.Upload.Dialog.prototype.getText = function () {
-               return this.descriptionWidget.getValue();
-       };
 }( jQuery, mediaWiki ) );
index 79628de..007c855 100644 (file)
@@ -55,7 +55,7 @@
                this.comment = '';
                this.filename = null;
                this.file = null;
-               this.state = Upload.State.NEW;
+               this.setState( Upload.State.NEW );
 
                this.imageinfo = undefined;
        }
                );
        };
 
+       /**
+        * Sets the state and state details (if any) of the upload.
+        *
+        * @param {mw.Upload.State} state
+        * @param {string|Object} stateDetails
+        */
+       UP.setState = function ( state, stateDetails ) {
+               this.state = state;
+               this.stateDetails = stateDetails;
+       };
+
        /**
         * Gets the state of the upload.
         *
                return this.state;
        };
 
+       /**
+        * Gets details of the current state.
+        *
+        * @return {string}
+        */
+       UP.getStateDetails = function () {
+               return this.stateDetails;
+       };
+
        /**
         * Get the imageinfo object for the finished upload.
         * Only available once the upload is finished! Don't try to get it
                        return $.Deferred().reject( 'No filename set. Call setFilename to add one.' );
                }
 
-               this.state = Upload.State.UPLOADING;
+               this.setState( Upload.State.UPLOADING );
 
                return this.api.upload( this.getFile(), {
                        watchlist: ( this.getWatchlist() ) ? 1 : undefined,
                        filename: this.getFilename(),
                        text: this.getText()
                } ).then( function ( result ) {
-                       upload.state = Upload.State.UPLOADED;
+                       upload.setState( Upload.State.UPLOADED );
                        upload.imageinfo = result.upload.imageinfo;
                        return result;
                }, function () {
-                       upload.state = Upload.State.ERROR;
+                       upload.setState( Upload.State.ERROR );
                } );
        };
 
                        this.setFilenameFromFile();
                }
 
-               this.state = Upload.State.UPLOADING;
+               this.setState( Upload.State.UPLOADING );
 
                this.stashPromise = this.api.uploadToStash( this.getFile(), {
                        filename: this.getFilename()
                } ).then( function ( finishStash ) {
-                       upload.state = Upload.State.STASHED;
+                       upload.setState( Upload.State.STASHED );
                        return finishStash;
-               }, function () {
-                       upload.state = Upload.State.ERROR;
+               }, function ( result ) {
+                       upload.setState( Upload.State.ERROR, mw.message( 'api-error-' + result ) );
                } );
 
                return this.stashPromise;
                }
 
                return this.stashPromise.then( function ( finishStash ) {
-                       upload.state = Upload.State.UPLOADING;
+                       upload.setState( Upload.State.UPLOADING );
 
                        return finishStash( {
                                watchlist: ( upload.getWatchlist() ) ? 1 : undefined,
                                comment: upload.getComment(),
                                filename: upload.getFilename(),
                                text: upload.getText()
-                       } ).then( function () {
-                               upload.state = Upload.State.UPLOADED;
-                       }, function () {
-                               upload.state = Upload.State.ERROR;
+                       } ).then( function ( result ) {
+                               upload.setState( Upload.State.UPLOADED );
+                               upload.imageinfo = result.upload.imageinfo;
+                               return result;
+                       }, function ( result ) {
+                               // Errors are strings that can be used to get error message
+                               if ( typeof result === 'string' ) {
+                                       upload.setState( Upload.State.ERROR, mw.message( 'api-error-' + result ) );
+                                       return;
+                               }
+
+                               // Warnings come in the form of objects
+                               if ( $.isPlainObject( result ) ) {
+                                       upload.setState( Upload.State.WARNING, result );
+                                       return;
+                               }
+
+                               // Throw an empty error if we can't figure it out
+                               upload.setState( Upload.State.ERROR );
                        } );
                } );
        };
index 29b224e..9d29b4c 100644 (file)
                         */
                        parse: function ( str, options ) {
                                var q, matches,
-                                       uri = this;
+                                       uri = this,
+                                       hasOwn = Object.prototype.hasOwnProperty;
 
                                // Apply parser regex and set all properties based on the result
                                matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
 
                                                        // If overrideKeys, always (re)set top level value.
                                                        // If not overrideKeys but this key wasn't set before, then we set it as well.
-                                                       if ( options.overrideKeys || q[ k ] === undefined ) {
+                                                       if ( options.overrideKeys || !hasOwn.call( q, k ) ) {
                                                                q[ k ] = v;
 
                                                        // Use arrays if overrideKeys is false and key was already seen before
index 75b1f80..b62e8d1 100644 (file)
@@ -9,8 +9,8 @@
         *
         * @see http://en.wikipedia.org/wiki/Jenkins_hash_function
         *
-        * @param {String} string String to hash
-        * @return {Number} The hash as a 32-bit unsigned integer
+        * @param {string} string String to hash
+        * @return {number} The hash as a 32-bit unsigned integer
         * @ignore
         *
         * @author Ori Livneh <ori@wikimedia.org>
                 * This function is based on the deprecated `mw.user.bucket` function.
                 *
                 * @param {Object} experiment
-                * @param {String} experiment.name The name of the experiment
-                * @param {Boolean} experiment.enabled Whether or not the experiment is
+                * @param {string} experiment.name The name of the experiment
+                * @param {boolean} experiment.enabled Whether or not the experiment is
                 *  enabled. If the experiment is disabled, then the user is always assigned
                 *  to the control bucket
                 * @param {Object} experiment.buckets A map of bucket name to probability
                 *  that the user will be assigned to that bucket
-                * @param {String} token A token that uniquely identifies the user for the
+                * @param {string} token A token that uniquely identifies the user for the
                 *  duration of the experiment
-                * @returns {String} The bucket
+                * @returns {string} The bucket
                 */
                getBucket: function ( experiment, token ) {
                        var buckets = experiment.buckets,
index 8c6f3ab..4cc7f09 100644 (file)
@@ -16,7 +16,7 @@
         * "foo[bar][baz]").
         *
         * @private
-        * @param {jQuery} element
+        * @param {jQuery} $el
         * @param {string} name
         * @return {jQuery|null}
         */
@@ -44,8 +44,8 @@
         * dependent fields for a hide-if specification.
         *
         * @private
-        * @param {jQuery} element
-        * @param {Array} hide-if spec
+        * @param {jQuery} $el
+        * @param {Array} spec
         * @return {Array}
         * @return {jQuery} return.0 Dependent fields
         * @return {Function} return.1 Test function
         * @param {Function} callback
         * @param {boolean|jQuery.Event} callback.immediate True when the event is called immediately,
         *  an event object when triggered from an event.
-        * @return {jQuery}
         * @chainable
+        * @return {jQuery}
         */
        mw.log.deprecate( $.fn, 'liveAndTestAtStart', function ( callback ) {
-               this
+               return this
                        // Can't really migrate to .on() generically, needs knowledge of
                        // calling code to know the correct selector. Fix callers and
                        // get rid of this .liveAndTestAtStart() hack.
index 4859953..514a3dd 100644 (file)
                 * Generate and print one more reports. When invoked with no arguments,
                 * print all reports.
                 *
-                * @param {string...} [reports] Report names to run, or unset to print
+                * @param {...string} [reports] Report names to run, or unset to print
                 *  all available reports.
                 */
                runReports: function () {
index ce92423..7dd9ade 100644 (file)
@@ -60,6 +60,9 @@
         * Wrapper around jQuery append that converts all non-objects to TextNode so append will not
         * convert what it detects as an htmlString to an element.
         *
+        * If our own htmlEmitter jQuery object is given, its children will be unwrapped and appended to
+        * new parent.
+        *
         * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
         *
         * @private
@@ -78,6 +81,9 @@
                        if ( typeof children[ i ] !== 'object' ) {
                                children[ i ] = document.createTextNode( children[ i ] );
                        }
+                       if ( children[ i ] instanceof jQuery && children[ i ].hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                               children[ i ] = children[ i ].contents();
+                       }
                }
 
                return $parent.append( children );
                        .replace( /&amp;/g, '&' );
        }
 
+       /**
+        * Turn input into a string.
+        *
+        * @private
+        * @param {string|jQuery} input
+        * @return {string} Textual value of input
+        */
+       function textify( input ) {
+               if ( input instanceof jQuery ) {
+                       input = input.text();
+               }
+               return String( input );
+       }
+
        /**
         * Given parser options, return a function that parses a key and replacements, returning jQuery object
         *
 
                return function () {
                        var $target = this.empty();
-                       // TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
-                       // or Simply appendWithoutParsing( $target, failableParserFn( arguments ) )
-                       $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
-                               appendWithoutParsing( $target, node );
-                       } );
+                       appendWithoutParsing( $target, failableParserFn( arguments ) );
                        return $target;
                };
        };
                                escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
                                whitespace, dollar, digits, htmlDoubleQuoteAttributeValue, htmlSingleQuoteAttributeValue,
                                htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
-                               openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
+                               openExtlink, closeExtlink, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
                                templateContents, openTemplate, closeTemplate,
                                nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result,
                                settings = this.settings,
                                return result === null ? null : result.join( '' );
                        }
 
-                       // Used for wikilink page names.  Like literalWithoutBar, but
-                       // without allowing escapes.
-                       function unescapedLiteralWithoutBar() {
-                               var result = nOrMore( 1, regularLiteralWithoutBar )();
-                               return result === null ? null : result.join( '' );
-                       }
-
                        function literal() {
                                var result = nOrMore( 1, escapedOrRegularLiteral )();
                                return result === null ? null : result.join( '' );
                        closeExtlink = makeStringParser( ']' );
                        // this extlink MUST have inner contents, e.g. [foo] not allowed; [foo bar] [foo <i>bar</i>], etc. are allowed
                        function extlink() {
-                               var result, parsedResult;
+                               var result, parsedResult, target;
                                result = null;
                                parsedResult = sequence( [
                                        openExtlink,
-                                       nonWhitespaceExpression,
+                                       nOrMore( 1, nonWhitespaceExpression ),
                                        whitespace,
                                        nOrMore( 1, expression ),
                                        closeExtlink
                                ] );
                                if ( parsedResult !== null ) {
-                                       result = [ 'EXTLINK', parsedResult[ 1 ] ];
-                                       // TODO (mattflaschen, 2013-03-22): Clean this up if possible.
-                                       // It's avoiding CONCAT for single nodes, so they at least doesn't get the htmlEmitter span.
-                                       if ( parsedResult[ 3 ].length === 1 ) {
-                                               result.push( parsedResult[ 3 ][ 0 ] );
-                                       } else {
-                                               result.push( [ 'CONCAT' ].concat( parsedResult[ 3 ] ) );
-                                       }
+                                       // When the entire link target is a single parameter, we can't use CONCAT, as we allow
+                                       // passing fancy parameters (like a whole jQuery object or a function) to use for the
+                                       // link. Check only if it's a single match, since we can either do CONCAT or not for
+                                       // singles with the same effect.
+                                       target = parsedResult[ 1 ].length === 1 ?
+                                               parsedResult[ 1 ][ 0 ] :
+                                               [ 'CONCAT' ].concat( parsedResult[ 1 ] );
+                                       result = [
+                                               'EXTLINK',
+                                               target,
+                                               [ 'CONCAT' ].concat( parsedResult[ 3 ] )
+                                       ];
                                }
                                return result;
                        }
-                       // this is the same as the above extlink, except that the url is being passed on as a parameter
-                       function extLinkParam() {
-                               var result = sequence( [
-                                       openExtlink,
-                                       dollar,
-                                       digits,
-                                       whitespace,
-                                       expression,
-                                       closeExtlink
-                               ] );
-                               if ( result === null ) {
-                                       return null;
-                               }
-                               return [ 'EXTLINKPARAM', parseInt( result[ 2 ], 10 ) - 1, result[ 4 ] ];
-                       }
                        openWikilink = makeStringParser( '[[' );
                        closeWikilink = makeStringParser( ']]' );
                        pipe = makeStringParser( '|' );
                                return result === null ? null : result[ 1 ];
                        }
 
-                       wikilinkPage = choice( [
-                               unescapedLiteralWithoutBar,
-                               template
-                       ] );
-
                        function pipedWikilink() {
                                var result = sequence( [
-                                       wikilinkPage,
+                                       nOrMore( 1, paramExpression ),
                                        pipe,
-                                       expression
+                                       nOrMore( 1, expression )
                                ] );
-                               return result === null ? null : [ result[ 0 ], result[ 2 ] ];
+                               return result === null ? null : [
+                                       [ 'CONCAT' ].concat( result[ 0 ] ),
+                                       [ 'CONCAT' ].concat( result[ 2 ] )
+                               ];
+                       }
+
+                       function unpipedWikilink() {
+                               var result = sequence( [
+                                       nOrMore( 1, paramExpression )
+                               ] );
+                               return result === null ? null : [
+                                       [ 'CONCAT' ].concat( result[ 0 ] )
+                               ];
                        }
 
                        wikilinkContents = choice( [
                                pipedWikilink,
-                               wikilinkPage // unpiped link
+                               unpipedWikilink
                        ] );
 
                        function wikilink() {
                        nonWhitespaceExpression = choice( [
                                template,
                                wikilink,
-                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutSpace
                        paramExpression = choice( [
                                template,
                                wikilink,
-                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutBar
                        expression = choice( [
                                template,
                                wikilink,
-                               extLinkParam,
                                extlink,
                                replacement,
                                html,
                concat: function ( nodes ) {
                        var $span = $( '<span>' ).addClass( 'mediaWiki_htmlEmitter' );
                        $.each( nodes, function ( i, node ) {
-                               if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
-                                       $.each( node.contents(), function ( j, childNode ) {
-                                               appendWithoutParsing( $span, childNode );
-                                       } );
-                               } else {
-                                       // Let jQuery append nodes, arrays of nodes and jQuery objects
-                                       // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
-                                       appendWithoutParsing( $span, node );
-                               }
+                               // Let jQuery append nodes, arrays of nodes and jQuery objects
+                               // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
+                               appendWithoutParsing( $span, node );
                        } );
                        return $span;
                },
                 *
                 * @param {Array} nodes List of one element, integer, n >= 0
                 * @param {Array} replacements List of at least n strings
-                * @return {String} replacement
+                * @return {string} replacement
                 */
                replace: function ( nodes, replacements ) {
                        var index = parseInt( nodes[ 0 ], 10 );
                 * from the server, since the replacement is done at save time.
                 * It may, though, if the wikitext appears in extension-controlled content.
                 *
-                * @param {String[]} nodes
+                * @param {string[]} nodes
                 */
                wikilink: function ( nodes ) {
-                       var page, anchor, url;
+                       var page, anchor, url, $el;
 
-                       page = nodes[ 0 ];
+                       page = textify( nodes[ 0 ] );
                        url = mw.util.getUrl( page );
 
                        if ( nodes.length === 1 ) {
                                anchor = nodes[ 1 ];
                        }
 
-                       return $( '<a>' ).attr( {
+                       $el = $( '<a>' ).attr( {
                                title: page,
                                href: url
-                       } ).text( anchor );
+                       } );
+                       return appendWithoutParsing( $el, anchor );
                },
 
                /**
                },
 
                /**
-                * Transform parsed structure into external link
-                * If the href is a jQuery object, treat it as "enclosing" the link text.
+                * Transform parsed structure into external link.
                 *
-                * - ... function, treat it as the click handler.
-                * - ... string, treat it as a URI.
+                * The "href" can be:
+                * - a jQuery object, treat it as "enclosing" the link text.
+                * - a function, treat it as the click handler.
+                * - a string, or our htmlEmitter jQuery object, treat it as a URI after stringifying.
                 *
                 * TODO: throw an error if nodes.length > 2 ?
                 *
-                * @param {Array} nodes List of two elements, {jQuery|Function|String} and {String}
+                * @param {Array} nodes List of two elements, {jQuery|Function|String} and {string}
                 * @return {jQuery}
                 */
                extlink: function ( nodes ) {
                        var $el,
                                arg = nodes[ 0 ],
                                contents = nodes[ 1 ];
-                       if ( arg instanceof jQuery ) {
+                       if ( arg instanceof jQuery && !arg.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                $el = arg;
                        } else {
                                $el = $( '<a>' );
                                        } )
                                        .click( arg );
                                } else {
-                                       $el.attr( 'href', arg.toString() );
+                                       $el.attr( 'href', textify( arg ) );
                                }
                        }
                        return appendWithoutParsing( $el, contents );
                },
 
-               /**
-                * This is basically use a combination of replace + external link (link with parameter
-                * as url), but we don't want to run the regular replace here-on: inserting a
-                * url as href-attribute of a link will automatically escape it already, so
-                * we don't want replace to (manually) escape it as well.
-                *
-                * TODO: throw error if nodes.length > 1 ?
-                *
-                * @param {Array} nodes List of one element, integer, n >= 0
-                * @param {Array} replacements List of at least n strings
-                * @return {string} replacement
-                */
-               extlinkparam: function ( nodes, replacements ) {
-                       var replacement,
-                               index = parseInt( nodes[ 0 ], 10 );
-                       if ( index < replacements.length ) {
-                               replacement = replacements[ index ];
-                       } else {
-                               replacement = '$' + ( index + 1 );
-                       }
-                       return this.extlink( [ replacement, nodes[ 1 ] ] );
-               },
-
                /**
                 * Transform parsed structure into pluralization
                 * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
                        for ( formIndex = 0; formIndex < forms.length; formIndex++ ) {
                                form = forms[ formIndex ];
 
-                               if ( form.jquery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                               if ( form instanceof jQuery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                        // This is a nested node, may be an explicit plural form like 5=[$2 linktext]
                                        firstChild = form.contents().get( 0 );
                                        if ( firstChild && firstChild.nodeType === Node.TEXT_NODE ) {
                // 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 ) ) ) {
+               if ( this.format === 'plain' || !/\{\{|[\[<>&]/.test( this.map.get( this.key ) ) ) {
                        // Fall back to mw.msg's simple parser
                        return oldParser.apply( this );
                }
index 5dd2acb..12d698b 100644 (file)
                 * Used by Message#parser().
                 *
                 * @since 1.25
-                * @param {string} fmt Format string
-                * @param {Mixed...} parameters Values for $N replacements
+                * @param {string} formatString Format string
+                * @param {...Mixed} parameters Values for $N replacements
                 * @return {string} Formatted string
                 */
                format: function ( formatString ) {
                 *
                 * @see mw.Message
                 * @param {string} key Key of message to get
-                * @param {Mixed...} parameters Values for $N replacements
+                * @param {...Mixed} parameters Values for $N replacements
                 * @return {mw.Message}
                 */
                message: function ( key ) {
                 *
                 * @see mw.Message
                 * @param {string} key Key of message to get
-                * @param {Mixed...} parameters Values for $N replacements
+                * @param {...Mixed} parameters Values for $N replacements
                 * @return {string}
                 */
                msg: function () {
                         * Write a message the console's warning channel.
                         * Actions not supported by the browser console are silently ignored.
                         *
-                        * @param {string...} msg Messages to output to console
+                        * @param {...string} msg Messages to output to console
                         */
                        log.warn = function () {
                                var console = window.console;
                         * is a caught Error object.
                         *
                         * @since 1.26
-                        * @param {Error|string...} msg Messages to output to console
+                        * @param {Error|...string} msg Messages to output to console
                         */
                        log.error = function () {
                                var console = window.console;
                         * @param {Function} [callback]
                         */
                        function addEmbeddedCSS( cssText, callback ) {
-                               var $style, styleEl;
+                               var $style, styleEl, newCssText;
 
                                function fireCallbacks() {
                                        var oldCallbacks = cssCallbacks;
                                        // Verify that the element before the marker actually is a
                                        // <style> tag and one that came from ResourceLoader
                                        // (not some other style tag or even a `<meta>` or `<script>`).
-                                       if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+                                       if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) ) {
                                                // There's already a dynamic <style> tag present and
                                                // we are able to append more to it.
                                                styleEl = $style.get( 0 );
                                                // Support: IE6-10
                                                if ( styleEl.styleSheet ) {
                                                        try {
-                                                               styleEl.styleSheet.cssText += cssText;
+                                                               // Support: IE9
+                                                               // We can't do styleSheet.cssText += cssText, since IE9 mangles this property on
+                                                               // write, dropping @media queries from the CSS text. If we read it and used its
+                                                               // value, we would accidentally apply @media-specific styles to all media. (T108727)
+                                                               if ( document.documentMode === 9 ) {
+                                                                       newCssText = $style.data( 'ResourceLoaderDynamicStyleTag' ) + cssText;
+                                                                       styleEl.styleSheet.cssText = newCssText;
+                                                                       $style.data( 'ResourceLoaderDynamicStyleTag', newCssText );
+                                                               } else {
+                                                                       styleEl.styleSheet.cssText += cssText;
+                                                               }
                                                        } catch ( e ) {
                                                                mw.track( 'resourceloader.exception', { exception: e, source: 'stylesheet' } );
                                                        }
                                        }
                                }
 
-                               $( newStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
+                               $style = $( newStyleTag( cssText, getMarker() ) );
+
+                               if ( document.documentMode === 9 ) {
+                                       // Support: IE9
+                                       // Preserve original CSS text because IE9 mangles it on write
+                                       $style.data( 'ResourceLoaderDynamicStyleTag', cssText );
+                               } else {
+                                       $style.data( 'ResourceLoaderDynamicStyleTag', true );
+                               }
 
                                fireCallbacks();
                        }
                         * execute the module or job now.
                         *
                         * @private
-                        * @param {Array} module Names of modules to be checked
+                        * @param {Array} modules Names of modules to be checked
                         * @return {boolean} True if all modules are in state 'ready', false otherwise
                         */
                        function allReady( modules ) {
                         * order.
                         *
                         * @private
-                        * @param {string[]} module Array of string module names
+                        * @param {string[]} modules Array of string module names
                         * @return {Array} List of dependencies, including 'module'.
                         */
                        function resolve( modules ) {
                        tokens: new Map()
                },
 
+               // OOUI widgets specific to MediaWiki
+               widgets: {},
+
                /**
                 * Registry and firing of events.
                 *
                                        /**
                                         * Register a hook handler
                                         *
-                                        * @param {Function...} handler Function to bind.
+                                        * @param {...Function} handler Function to bind.
                                         * @chainable
                                         */
                                        add: list.add,
                                        /**
                                         * Unregister a hook handler
                                         *
-                                        * @param {Function...} handler Function to unbind.
+                                        * @param {...Function} handler Function to unbind.
                                         * @chainable
                                         */
                                        remove: list.remove,
                                        /**
                                         * Run a hook.
                                         *
-                                        * @param {Mixed...} data
+                                        * @param {...Mixed} data
                                         * @chainable
                                         */
                                        fire: function () {
index 053fb1a..93fb470 100644 (file)
@@ -22,7 +22,7 @@
         * messages to that, instead of the console.
         *
         * @member mw.log
-        * @param {string...} msg Messages to output to console.
+        * @param {...string} msg Messages to output to console.
         */
        mw.log = function () {
                // Turn arguments into an array
index 6c7484e..c960d65 100644 (file)
@@ -9,7 +9,7 @@
                                search: query,
                                namespace: 0,
                                limit: maxRows,
-                               suggest: ''
+                               suggest: true
                        } ).done( function ( data ) {
                                response( data[ 1 ] );
                        } );
index e10b561..cb62fbf 100644 (file)
@@ -1,69 +1,58 @@
 ( function ( mw ) {
        'use strict';
-       var storage;
 
        /**
         * Library for storing device specific information. It should be used for storing simple
         * strings and is not suitable for storing large chunks of data.
+        *
         * @class mw.storage
         * @singleton
         */
-       storage = {
-               isLocalStorageSupported: false,
+       mw.storage = {
+
+               localStorage: window.localStorage,
+
                /**
                 * Retrieve value from device storage.
                 *
-                * @param {String} key of item to retrieve
-                * @returns {String|Boolean} false when localStorage not available, otherwise string
+                * @param {string} key Key of item to retrieve
+                * @return {string|boolean} False when localStorage not available, otherwise string
                 */
                get: function ( key ) {
-                       if ( this.isLocalStorageSupported ) {
-                               return localStorage.getItem( key );
-                       } else {
-                               return false;
-                       }
+                       try {
+                               return mw.storage.localStorage.getItem( key );
+                       } catch ( e ) {}
+                       return false;
                },
 
                /**
-                * Set a value in device storage.
-                *
-                * @param {String} key key name to store under.
-                * @param {String} value to be stored.
-                * @returns {Boolean} whether the save succeeded or not.
-                */
+                 * Set a value in device storage.
+                 *
+                 * @param {string} key Key name to store under
+                 * @param {string} value Value to be stored
+                 * @return {boolean} Whether the save succeeded or not
+                 */
                set: function ( key, value ) {
                        try {
-                               localStorage.setItem( key, value );
+                               mw.storage.localStorage.setItem( key, value );
                                return true;
-                       } catch ( e ) {
-                               return false;
-                       }
+                       } catch ( e ) {}
+                       return false;
                },
 
                /**
-                * Remove a value from device storage.
-                *
-                * @param {String} key of item to remove.
-                * @returns {Boolean} whether the save succeeded or not.
-                */
+                 * Remove a value from device storage.
+                 *
+                 * @param {string} key Key of item to remove
+                 * @return {boolean} Whether the save succeeded or not
+                 */
                remove: function ( key ) {
-                       if ( this.isLocalStorageSupported ) {
-                               localStorage.removeItem( key );
+                       try {
+                               mw.storage.localStorage.removeItem( key );
                                return true;
-                       } else {
-                               return false;
-                       }
+                       } catch ( e ) {}
+                       return false;
                }
        };
 
-       mw.storage = storage;
-       // See if local storage is supported
-       try {
-               localStorage.setItem( 'localStorageTest', 'localStorageTest' );
-               localStorage.removeItem( 'localStorageTest' );
-               storage.isLocalStorageSupported = true;
-       } catch ( e ) {
-               // Already set. No body needed.
-       }
-
 }( mediaWiki ) );
index c3db69e..91f1aff 100644 (file)
@@ -24,7 +24,7 @@
                 * Get the name of the compiler associated with a template based on its name.
                 *
                 * @param {string} templateName Name of template (including file suffix)
-                * @return {String} Name of compiler
+                * @return {string} Name of compiler
                 */
                getCompilerName: function ( templateName ) {
                        var templateParts = templateName.split( '.' );
diff --git a/resources/src/mediawiki/page/gallery-print.css b/resources/src/mediawiki/page/gallery-print.css
new file mode 100644 (file)
index 0000000..0c14865
--- /dev/null
@@ -0,0 +1,35 @@
+li.gallerybox {
+       vertical-align: top;
+       display: inline-block;
+}
+
+ul.gallery, li.gallerybox {
+       zoom: 1;
+       *display: inline;
+}
+
+ul.gallery {
+       margin: 2px;
+       padding: 2px;
+       display: block;
+}
+
+li.gallerycaption {
+       font-weight: bold;
+       text-align: center;
+       display: block;
+       word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+       text-align: center;
+       border: 1px solid #ccc;
+       margin: 2px;
+}
+
+div.gallerytext {
+       overflow: hidden;
+       font-size: 94%;
+       padding: 2px 4px;
+       word-wrap: break-word;
+}
diff --git a/resources/src/mediawiki/page/gallery.css b/resources/src/mediawiki/page/gallery.css
new file mode 100644 (file)
index 0000000..20deb21
--- /dev/null
@@ -0,0 +1,101 @@
+/* Galleries */
+/* These display attributes look nonsensical, but are needed to support IE and FF2 */
+/* Don't forget to update mediawiki.page.gallery.print.css */
+li.gallerybox {
+       vertical-align: top;
+       display: -moz-inline-box;
+       display: inline-block;
+}
+
+ul.gallery,
+li.gallerybox {
+       zoom: 1;
+       *display: inline;
+}
+
+ul.gallery {
+       margin: 2px;
+       padding: 2px;
+       display: block;
+}
+
+li.gallerycaption {
+       font-weight: bold;
+       text-align: center;
+       display: block;
+       word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+       text-align: center;
+       border: 1px solid #ccc;
+       background-color: #f9f9f9;
+       margin: 2px;
+}
+
+li.gallerybox div.thumb img {
+       display: block;
+       margin: 0 auto;
+}
+
+div.gallerytext {
+       overflow: hidden;
+       font-size: 94%;
+       padding: 2px 4px;
+       word-wrap: break-word;
+}
+
+/* new gallery stuff */
+ul.mw-gallery-nolines li.gallerybox div.thumb {
+       background-color: transparent;
+       border: none;
+}
+
+ul.mw-gallery-nolines li.gallerybox div.gallerytext {
+       text-align: center;
+}
+
+/* height constrained gallery */
+
+ul.mw-gallery-packed li.gallerybox div.thumb,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb {
+       background-color: transparent;
+       border: none;
+}
+
+ul.mw-gallery-packed li.gallerybox div.thumb img,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
+       margin: 0 auto;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox,
+ul.mw-gallery-packed-overlay li.gallerybox {
+       position: relative;
+}
+
+ul.mw-gallery-packed-hover div.gallerytextwrapper {
+       overflow: hidden;
+       height: 0;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
+       position: absolute;
+       background: white;
+       background: rgba(255, 255, 255, 0.8);
+       padding: 5px 10px;
+       bottom: 0;
+       left: 0; /* Needed for IE */
+       height: auto;
+       font-weight: bold;
+       margin: 2px; /* correspond to style on div.thumb */
+}
+
+ul.mw-gallery-packed-hover,
+ul.mw-gallery-packed-overlay,
+ul.mw-gallery-packed {
+       text-align: center;
+}
diff --git a/resources/src/mediawiki/page/gallery.js b/resources/src/mediawiki/page/gallery.js
new file mode 100644 (file)
index 0000000..dfccf21
--- /dev/null
@@ -0,0 +1,268 @@
+/*!
+ * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
+ * Also Dynamically resize images to justify them.
+ */
+( function ( mw, $ ) {
+       var $galleries,
+               bound = false,
+               // Is there a better way to detect a touchscreen? Current check taken from stack overflow.
+               isTouchScreen = !!( window.ontouchstart !== undefined ||
+                       window.DocumentTouch !== undefined && document instanceof window.DocumentTouch
+               );
+
+       /**
+        * Perform the layout justification.
+        *
+        * @ignore
+        * @context {HTMLElement} A `ul.mw-gallery-*` element
+        */
+       function justify() {
+               var lastTop,
+                       $img,
+                       imgWidth,
+                       imgHeight,
+                       captionWidth,
+                       rows = [],
+                       $gallery = $( this );
+
+               $gallery.children( 'li' ).each( function () {
+                       // Math.floor to be paranoid if things are off by 0.00000000001
+                       var top = Math.floor( $( this ).position().top ),
+                               $this = $( this );
+
+                       if ( top !== lastTop ) {
+                               rows[ rows.length ] = [];
+                               lastTop = top;
+                       }
+
+                       $img = $this.find( 'div.thumb a.image img' );
+                       if ( $img.length && $img[ 0 ].height ) {
+                               imgHeight = $img[ 0 ].height;
+                               imgWidth = $img[ 0 ].width;
+                       } else {
+                               // If we don't have a real image, get the containing divs width/height.
+                               // Note that if we do have a real image, using this method will generally
+                               // give the same answer, but can be different in the case of a very
+                               // narrow image where extra padding is added.
+                               imgHeight = $this.children().children( 'div:first' ).height();
+                               imgWidth = $this.children().children( 'div:first' ).width();
+                       }
+
+                       // Hack to make an edge case work ok
+                       if ( imgHeight < 30 ) {
+                               // Don't try and resize this item.
+                               imgHeight = 0;
+                       }
+
+                       captionWidth = $this.children().children( 'div.gallerytextwrapper' ).width();
+                       rows[ rows.length - 1 ][ rows[ rows.length - 1 ].length ] = {
+                               $elm: $this,
+                               width: $this.outerWidth(),
+                               imgWidth: imgWidth,
+                               // XXX: can divide by 0 ever happen?
+                               aspect: imgWidth / imgHeight,
+                               captionWidth: captionWidth,
+                               height: imgHeight
+                       };
+
+                       // Save all boundaries so we can restore them on window resize
+                       $this.data( 'imgWidth', imgWidth );
+                       $this.data( 'imgHeight', imgHeight );
+                       $this.data( 'width', $this.outerWidth() );
+                       $this.data( 'captionWidth', captionWidth );
+               } );
+
+               ( function () {
+                       var maxWidth,
+                               combinedAspect,
+                               combinedPadding,
+                               curRow,
+                               curRowHeight,
+                               wantedWidth,
+                               preferredHeight,
+                               newWidth,
+                               padding,
+                               $outerDiv,
+                               $innerDiv,
+                               $imageDiv,
+                               $imageElm,
+                               imageElm,
+                               $caption,
+                               i,
+                               j,
+                               avgZoom,
+                               totalZoom = 0;
+
+                       for ( i = 0; i < rows.length; i++ ) {
+                               maxWidth = $gallery.width();
+                               combinedAspect = 0;
+                               combinedPadding = 0;
+                               curRow = rows[ i ];
+                               curRowHeight = 0;
+
+                               for ( j = 0; j < curRow.length; j++ ) {
+                                       if ( curRowHeight === 0 ) {
+                                               if ( isFinite( curRow[ j ].height ) ) {
+                                                       // Get the height of this row, by taking the first
+                                                       // non-out of bounds height
+                                                       curRowHeight = curRow[ j ].height;
+                                               }
+                                       }
+
+                                       if ( curRow[ j ].aspect === 0 || !isFinite( curRow[ j ].aspect ) ) {
+                                               // One of the dimensions are 0. Probably should
+                                               // not try to resize.
+                                               combinedPadding += curRow[ j ].width;
+                                       } else {
+                                               combinedAspect += curRow[ j ].aspect;
+                                               combinedPadding += curRow[ j ].width - curRow[ j ].imgWidth;
+                                       }
+                               }
+
+                               // Add some padding for inter-element spacing.
+                               combinedPadding += 5 * curRow.length;
+                               wantedWidth = maxWidth - combinedPadding;
+                               preferredHeight = wantedWidth / combinedAspect;
+
+                               if ( preferredHeight > curRowHeight * 1.5 ) {
+                                       // Only expand at most 1.5 times current size
+                                       // As that's as high a resolution as we have.
+                                       // Also on the off chance there is a bug in this
+                                       // code, would prevent accidentally expanding to
+                                       // be 10 billion pixels wide.
+                                       if ( i === rows.length - 1 ) {
+                                               // If its the last row, and we can't fit it,
+                                               // don't make the entire row huge.
+                                               avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
+                                               if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
+                                                       preferredHeight = avgZoom;
+                                               } else {
+                                                       // Probably a single row gallery
+                                                       preferredHeight = curRowHeight;
+                                               }
+                                       } else {
+                                               preferredHeight = 1.5 * curRowHeight;
+                                       }
+                               }
+                               if ( !isFinite( preferredHeight ) ) {
+                                       // This *definitely* should not happen.
+                                       // Skip this row.
+                                       continue;
+                               }
+                               if ( preferredHeight < 5 ) {
+                                       // Well something clearly went wrong...
+                                       // Skip this row.
+                                       continue;
+                               }
+
+                               if ( preferredHeight / curRowHeight > 1 ) {
+                                       totalZoom += preferredHeight / curRowHeight;
+                               } else {
+                                       // If we shrink, still consider that a zoom of 1
+                                       totalZoom += 1;
+                               }
+
+                               for ( j = 0; j < curRow.length; j++ ) {
+                                       newWidth = preferredHeight * curRow[ j ].aspect;
+                                       padding = curRow[ j ].width - curRow[ j ].imgWidth;
+                                       $outerDiv = curRow[ j ].$elm;
+                                       $innerDiv = $outerDiv.children( 'div' ).first();
+                                       $imageDiv = $innerDiv.children( 'div.thumb' );
+                                       $imageElm = $imageDiv.find( 'img' ).first();
+                                       imageElm = $imageElm.length ? $imageElm[ 0 ] : null;
+                                       $caption = $outerDiv.find( 'div.gallerytextwrapper' );
+
+                                       // Since we are going to re-adjust the height, the vertical
+                                       // centering margins need to be reset.
+                                       $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
+
+                                       if ( newWidth < 60 || !isFinite( newWidth ) ) {
+                                               // Making something skinnier than this will mess up captions,
+                                               if ( newWidth < 1 || !isFinite( newWidth ) ) {
+                                                       $innerDiv.height( preferredHeight );
+                                                       // Don't even try and touch the image size if it could mean
+                                                       // making it disappear.
+                                                       continue;
+                                               }
+                                       } else {
+                                               $outerDiv.width( newWidth + padding );
+                                               $innerDiv.width( newWidth + padding );
+                                               $imageDiv.width( newWidth );
+                                               $caption.width( curRow[ j ].captionWidth + ( newWidth - curRow[ j ].imgWidth ) );
+                                       }
+
+                                       if ( imageElm ) {
+                                               // We don't always have an img, e.g. in the case of an invalid file.
+                                               imageElm.width = newWidth;
+                                               imageElm.height = preferredHeight;
+                                       } else {
+                                               // Not a file box.
+                                               $imageDiv.height( preferredHeight );
+                                       }
+                               }
+                       }
+               }() );
+       }
+
+       function handleResizeStart() {
+               $galleries.children( 'li' ).each( function () {
+                       var imgWidth = $( this ).data( 'imgWidth' ),
+                               imgHeight = $( this ).data( 'imgHeight' ),
+                               width = $( this ).data( 'width' ),
+                               captionWidth = $( this ).data( 'captionWidth' ),
+                               $innerDiv = $( this ).children( 'div' ).first(),
+                               $imageDiv = $innerDiv.children( 'div.thumb' ),
+                               $imageElm, imageElm;
+
+                       // Restore original sizes so we can arrange the elements as on freshly loaded page
+                       $( this ).width( width );
+                       $innerDiv.width( width );
+                       $imageDiv.width( imgWidth );
+                       $( this ).find( 'div.gallerytextwrapper' ).width( captionWidth );
+
+                       $imageElm = $( this ).find( 'img' ).first();
+                       imageElm = $imageElm.length ? $imageElm[ 0 ] : null;
+                       if ( imageElm ) {
+                               imageElm.width = imgWidth;
+                               imageElm.height = imgHeight;
+                       } else {
+                               $imageDiv.height( imgHeight );
+                       }
+               } );
+       }
+
+       function handleResizeEnd() {
+               $galleries.each( justify );
+       }
+
+       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+               if ( isTouchScreen ) {
+                       // Always show the caption for a touch screen.
+                       $content.find( 'ul.mw-gallery-packed-hover' )
+                               .addClass( 'mw-gallery-packed-overlay' )
+                               .removeClass( 'mw-gallery-packed-hover' );
+               } else {
+                       // Note use of just "a", not a.image, since we want this to trigger if a link in
+                       // the caption receives focus
+                       $content.find( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
+                               // Confusingly jQuery leaves e.type as focusout for delegated blur events
+                               var gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
+                               $( this ).closest( 'li.gallerybox' ).toggleClass( 'mw-gallery-focused', gettingFocus );
+                       } );
+               }
+
+               $galleries = $content.find( 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed' );
+               // Call the justification asynchronous because live preview fires the hook with detached $content.
+               setTimeout( function () {
+                       $galleries.each( justify );
+
+                       // Bind here instead of in the top scope as the callbacks use $galleries.
+                       if ( !bound ) {
+                               bound = true;
+                               $( window )
+                                       .resize( $.debounce( 300, true, handleResizeStart ) )
+                                       .resize( $.debounce( 300, handleResizeEnd ) );
+                       }
+               } );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/image-pagination.js b/resources/src/mediawiki/page/image-pagination.js
new file mode 100644 (file)
index 0000000..49a51df
--- /dev/null
@@ -0,0 +1,143 @@
+/*!
+ * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
+ */
+( function ( mw, $ ) {
+       /*jshint latedef:false */
+       var jqXhr, $multipageimage, $spinner,
+               cache = {},
+               cacheOrder = [];
+
+       /* Fetch the next page, caching up to 10 last-loaded pages.
+        * @param {string} url
+        * @return {jQuery.Promise}
+        */
+       function fetchPageData( url ) {
+               if ( jqXhr && jqXhr.abort ) {
+                       // Prevent race conditions and piling up pending requests
+                       jqXhr.abort();
+               }
+               jqXhr = undefined;
+
+               // Try the cache
+               if ( cache[ url ] ) {
+                       // Update access freshness
+                       cacheOrder.splice( $.inArray( url, cacheOrder ), 1 );
+                       cacheOrder.push( url );
+                       return $.Deferred().resolve( cache[ url ] ).promise();
+               }
+
+               // @todo Don't fetch the entire page. Ideally we'd only fetch the content portion or the data
+               // (thumbnail urls) and update the interface manually.
+               jqXhr = $.ajax( url ).then( function ( data ) {
+                       return $( data ).find( 'table.multipageimage' ).contents();
+               } );
+
+               // Handle cache updates
+               jqXhr.done( function ( $contents ) {
+                       jqXhr = undefined;
+
+                       // Cache the newly loaded page
+                       cache[ url ] = $contents;
+                       cacheOrder.push( url );
+
+                       // Remove the oldest entry if we're over the limit
+                       if ( cacheOrder.length > 10 ) {
+                               delete cache[ cacheOrder[ 0 ] ];
+                               cacheOrder = cacheOrder.slice( 1 );
+                       }
+               } );
+
+               return jqXhr.promise();
+       }
+
+       /* Fetch the next page and use jQuery to swap the table.multipageimage contents.
+        * @param {string} url
+        * @param {boolean} [hist=false] Whether this is a load triggered by history navigation (if
+        *   true, this function won't push a new history state, for the browser did so already).
+        */
+       function switchPage( url, hist ) {
+               var $tr, promise;
+
+               // Start fetching data (might be cached)
+               promise = fetchPageData( url );
+
+               // Add a new spinner if one doesn't already exist and the data is not already ready
+               if ( !$spinner && promise.state() !== 'resolved' ) {
+                       $tr = $multipageimage.find( 'tr' );
+                       $spinner = $.createSpinner( {
+                               size: 'large',
+                               type: 'block'
+                       } )
+                               // Copy the old content dimensions equal so that the current scroll position is not
+                               // lost between emptying the table is and receiving the new contents.
+                               .css( {
+                                       height: $tr.outerHeight(),
+                                       width: $tr.outerWidth()
+                               } );
+
+                       $multipageimage.empty().append( $spinner );
+               }
+
+               promise.done( function ( $contents ) {
+                       $spinner = undefined;
+
+                       // Replace table contents
+                       $multipageimage.empty().append( $contents.clone() );
+
+                       bindPageNavigation( $multipageimage );
+
+                       // Fire hook because the page's content has changed
+                       mw.hook( 'wikipage.content' ).fire( $multipageimage );
+
+                       // Update browser history and address bar. But not if we came here from a history
+                       // event, in which case the url is already updated by the browser.
+                       if ( history.pushState && !hist ) {
+                               history.pushState( { tag: 'mw-pagination' }, document.title, url );
+                       }
+               } );
+       }
+
+       function bindPageNavigation( $container ) {
+               $container.find( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
+                       var page, uri;
+
+                       // Generate the same URL on client side as the one generated in ImagePage::openShowImage.
+                       // We avoid using the URL in the link directly since it could have been manipulated (bug 66608)
+                       page = Number( mw.util.getParamValue( 'page', this.href ) );
+                       uri = new mw.Uri( mw.util.wikiScript() )
+                               .extend( { title: mw.config.get( 'wgPageName' ), page: page } )
+                               .toString();
+
+                       switchPage( uri );
+                       e.preventDefault();
+               } );
+
+               $container.find( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
+                       switchPage( this.action + '?' + $( this ).serialize() );
+                       e.preventDefault();
+               } );
+       }
+
+       $( function () {
+               if ( mw.config.get( 'wgNamespaceNumber' ) !== 6 ) {
+                       return;
+               }
+               $multipageimage = $( 'table.multipageimage' );
+               if ( !$multipageimage.length ) {
+                       return;
+               }
+
+               bindPageNavigation( $multipageimage );
+
+               // Update the url using the History API (if available)
+               if ( history.pushState && history.replaceState ) {
+                       history.replaceState( { tag: 'mw-pagination' }, '' );
+                       $( window ).on( 'popstate', function ( e ) {
+                               var state = e.originalEvent.state;
+                               if ( state && state.tag === 'mw-pagination' ) {
+                                       switchPage( location.href, true );
+                               }
+                       } );
+               }
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/patrol.js b/resources/src/mediawiki/page/patrol.js
new file mode 100644 (file)
index 0000000..f9b0d35
--- /dev/null
@@ -0,0 +1,65 @@
+/*!
+ * Animate patrol links to use asynchronous API requests to
+ * patrol pages, rather than navigating to a different URI.
+ *
+ * @since 1.21
+ * @author Marius Hoch <hoo@online.de>
+ */
+( function ( mw, $ ) {
+       if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
+               // Current user has no patrol right, or an old cached version of user.tokens
+               // that didn't have patrolToken yet.
+               return;
+       }
+       $( function () {
+               var $patrolLinks = $( '.patrollink a' );
+               $patrolLinks.on( 'click', function ( e ) {
+                       var $spinner, href, rcid, apiRequest;
+
+                       // Start preloading the notification module (normally loaded by mw.notify())
+                       mw.loader.load( 'mediawiki.notification' );
+
+                       // Hide the link and create a spinner to show it inside the brackets.
+                       $spinner = $.createSpinner( {
+                               size: 'small',
+                               type: 'inline'
+                       } );
+                       $( this ).hide().after( $spinner );
+
+                       href = $( this ).attr( 'href' );
+                       rcid = mw.util.getParamValue( 'rcid', href );
+                       apiRequest = new mw.Api();
+
+                       apiRequest.postWithToken( 'patrol', {
+                               action: 'patrol',
+                               rcid: rcid
+                       } )
+                       .done( function ( data ) {
+                               // Remove all patrollinks from the page (including any spinners inside).
+                               $patrolLinks.closest( '.patrollink' ).remove();
+                               if ( data.patrol !== undefined ) {
+                                       // Success
+                                       var title = new mw.Title( data.patrol.title );
+                                       mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
+                               } else {
+                                       // This should never happen as errors should trigger fail
+                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ), { type: 'error' } );
+                               }
+                       } )
+                       .fail( function ( error ) {
+                               $spinner.remove();
+                               // Restore the patrol link. This allows the user to try again
+                               // (or open it in a new window, bypassing this ajax module).
+                               $patrolLinks.show();
+                               if ( error === 'noautopatrol' ) {
+                                       // Can't patrol own
+                                       mw.notify( mw.msg( 'markedaspatrollederror-noautopatrol' ), { type: 'warn' } );
+                               } else {
+                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ), { type: 'error' } );
+                               }
+                       } );
+
+                       e.preventDefault();
+               } );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/ready.js b/resources/src/mediawiki/page/ready.js
new file mode 100644 (file)
index 0000000..8ec4cf0
--- /dev/null
@@ -0,0 +1,74 @@
+( function ( mw, $ ) {
+       var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
+
+       // Break out of framesets
+       if ( mw.config.get( 'wgBreakFrames' ) ) {
+               // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
+               // it works only comparing to window.self or window.window (http://stackoverflow.com/q/4850978/319266)
+               if ( window.top !== window.self ) {
+                       // Un-trap us from framesets
+                       window.top.location.href = location.href;
+               }
+       }
+
+       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+               var $sortableTables;
+
+               // Run jquery.placeholder polyfill if placeholder is not supported
+               if ( !supportsPlaceholder ) {
+                       $content.find( 'input[placeholder]' ).placeholder();
+               }
+
+               // Run jquery.makeCollapsible
+               $content.find( '.mw-collapsible' ).makeCollapsible();
+
+               // Lazy load jquery.tablesorter
+               $sortableTables = $content.find( 'table.sortable' );
+               if ( $sortableTables.length ) {
+                       mw.loader.using( 'jquery.tablesorter', function () {
+                               $sortableTables.tablesorter();
+                       } );
+               }
+
+               // Run jquery.checkboxShiftClick
+               $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
+       } );
+
+       // Things outside the wikipage content
+       $( function () {
+               var $nodes;
+
+               if ( !supportsPlaceholder ) {
+                       // Exclude content to avoid hitting it twice for the (first) wikipage content
+                       $( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
+               }
+
+               // Add accesskey hints to the tooltips
+               if ( document.querySelectorAll ) {
+                       // If we're running on a browser where we can do this efficiently,
+                       // just find all elements that have accesskeys. We can't use jQuery's
+                       // polyfill for the selector since looping over all elements on page
+                       // load might be too slow.
+                       $nodes = $( document.querySelectorAll( '[accesskey]' ) );
+               } else {
+                       // Otherwise go through some elements likely to have accesskeys rather
+                       // than looping over all of them. Unfortunately this will not fully
+                       // work for custom skins with different HTML structures. Input, label
+                       // and button should be rare enough that no optimizations are needed.
+                       $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label, button' );
+               }
+               $nodes.updateTooltipAccessKeys();
+
+               // Infuse OOUI widgets, if any are present
+               $nodes = $( '[data-ooui]' );
+               if ( $nodes.length ) {
+                       mw.loader.using( 'mediawiki.widgets' ).done( function () {
+                               $nodes.each( function () {
+                                       OO.ui.infuse( this );
+                               } );
+                       } );
+               }
+
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/startup.js b/resources/src/mediawiki/page/startup.js
new file mode 100644 (file)
index 0000000..708dcb5
--- /dev/null
@@ -0,0 +1,32 @@
+( function ( mw, $ ) {
+
+       // Support: MediaWiki < 1.26
+       // Cached HTML will not yet have this from OutputPage::getHeadScripts.
+       document.documentElement.className = document.documentElement.className
+               .replace( /(^|\s)client-nojs(\s|$)/, '$1client-js$2' );
+
+       mw.page = {};
+
+       $( function () {
+               mw.util.init();
+
+               /**
+                * Fired when wiki content is being added to the DOM
+                *
+                * It is encouraged to fire it before the main DOM is changed (when $content
+                * is still detatched).  However, this order is not defined either way, so you
+                * should only rely on $content itself.
+                *
+                * This includes the ready event on a page load (including post-edit loads)
+                * and when content has been previewed with LivePreview.
+                *
+                * @event wikipage_content
+                * @member mw.hook
+                * @param {jQuery} $content The most appropriate element containing the content,
+                *   such as #mw-content-text (regular content root) or #wikiPreview (live preview
+                *   root)
+                */
+               mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/watch.js b/resources/src/mediawiki/page/watch.js
new file mode 100644 (file)
index 0000000..a3197da
--- /dev/null
@@ -0,0 +1,181 @@
+/**
+ * Animate watch/unwatch links to use asynchronous API requests to
+ * watch pages, rather than navigating to a different URI.
+ *
+ * @class mw.page.watch.ajax
+ */
+( function ( mw, $ ) {
+       // The name of the page to watch or unwatch
+       var title = mw.config.get( 'wgRelevantPageName' );
+
+       /**
+        * Update the link text, link href attribute and (if applicable)
+        * "loading" class.
+        *
+        * @param {jQuery} $link Anchor tag of (un)watch link
+        * @param {string} action One of 'watch', 'unwatch'
+        * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
+        */
+       function updateWatchLink( $link, action, state ) {
+               var msgKey, $li, otherAction;
+
+               // A valid but empty jQuery object shouldn't throw a TypeError
+               if ( !$link.length ) {
+                       return;
+               }
+
+               // Invalid actions shouldn't silently turn the page in an unrecoverable state
+               if ( action !== 'watch' && action !== 'unwatch' ) {
+                       throw new Error( 'Invalid action' );
+               }
+
+               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
+               msgKey = state === 'loading' ? action + 'ing' : action;
+               otherAction = action === 'watch' ? 'unwatch' : 'watch';
+               $li = $link.closest( 'li' );
+
+               // Trigger a 'watchpage' event for this List item.
+               // Announce the otherAction value as the first param.
+               // Used to monitor the state of watch link.
+               // TODO: Revise when system wide hooks are implemented
+               if ( state === undefined ) {
+                       $li.trigger( 'watchpage.mw', otherAction );
+               }
+
+               $link
+                       .text( mw.msg( msgKey ) )
+                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) )
+                       .updateTooltipAccessKeys()
+                       .attr( 'href', mw.util.wikiScript() + '?' + $.param( {
+                                       title: title,
+                                       action: action
+                               } )
+                       );
+
+               // Most common ID style
+               if ( $li.prop( 'id' ) === 'ca-' + otherAction ) {
+                       $li.prop( 'id', 'ca-' + action );
+               }
+
+               if ( state === 'loading' ) {
+                       $link.addClass( 'loading' );
+               } else {
+                       $link.removeClass( 'loading' );
+               }
+       }
+
+       /**
+        * TODO: This should be moved somewhere more accessible.
+        *
+        * @private
+        * @param {string} url
+        * @return {string} The extracted action, defaults to 'view'
+        */
+       function mwUriGetAction( url ) {
+               var action, actionPaths, key, i, m, parts;
+
+               // TODO: Does MediaWiki give action path or query param
+               // precedence? If the former, move this to the bottom
+               action = mw.util.getParamValue( 'action', url );
+               if ( action !== null ) {
+                       return action;
+               }
+
+               actionPaths = mw.config.get( 'wgActionPaths' );
+               for ( key in actionPaths ) {
+                       if ( actionPaths.hasOwnProperty( key ) ) {
+                               parts = actionPaths[ key ].split( '$1' );
+                               for ( i = 0; i < parts.length; i++ ) {
+                                       parts[ i ] = mw.RegExp.escape( parts[ i ] );
+                               }
+                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
+                               if ( m && m[ 1 ] ) {
+                                       return key;
+                               }
+
+                       }
+               }
+
+               return 'view';
+       }
+
+       // Expose public methods
+       mw.page.watch = {
+               updateWatchLink: updateWatchLink
+       };
+
+       $( function () {
+               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
+                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
+                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
+
+               // Allowing people to add inline animated links is a little scary
+               $links = $links.filter( ':not( #bodyContent *, #content * )' );
+
+               $links.click( function ( e ) {
+                       var action, api, $link;
+
+                       // Start preloading the notification module (normally loaded by mw.notify())
+                       mw.loader.load( 'mediawiki.notification' );
+
+                       action = mwUriGetAction( this.href );
+
+                       if ( action !== 'watch' && action !== 'unwatch' ) {
+                               // Could not extract target action from link url,
+                               // let native browsing handle it further
+                               return true;
+                       }
+                       e.preventDefault();
+                       e.stopPropagation();
+
+                       $link = $( this );
+
+                       if ( $link.hasClass( 'loading' ) ) {
+                               return;
+                       }
+
+                       updateWatchLink( $link, action, 'loading' );
+
+                       api = new mw.Api();
+
+                       api[ action ]( title )
+                               .done( function ( watchResponse ) {
+                                       var otherAction = action === 'watch' ? 'unwatch' : 'watch';
+
+                                       mw.notify( $.parseHTML( watchResponse.message ), {
+                                               tag: 'watch-self'
+                                       } );
+
+                                       // Set link to opposite
+                                       updateWatchLink( $link, otherAction );
+
+                                       // Update the "Watch this page" checkbox on action=edit when the
+                                       // page is watched or unwatched via the tab (bug 12395).
+                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched !== undefined );
+                               } )
+                               .fail( function () {
+                                       var cleanTitle, msg, link;
+
+                                       // Reset link to non-loading mode
+                                       updateWatchLink( $link, action );
+
+                                       // Format error message
+                                       cleanTitle = title.replace( /_/g, ' ' );
+                                       link = mw.html.element(
+                                               'a', {
+                                                       href: mw.util.getUrl( title ),
+                                                       title: cleanTitle
+                                               }, cleanTitle
+                                       );
+                                       msg = mw.message( 'watcherrortext', link );
+
+                                       // Report to user about the error
+                                       mw.notify( msg, {
+                                               tag: 'watch-self',
+                                               type: 'error'
+                                       } );
+                               } );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
index 8a81a64..093748d 100644 (file)
@@ -66,7 +66,8 @@ $wgAutoloadClasses += array(
        'TestRecentChangesHelper' => "$testDir/phpunit/includes/changes/TestRecentChangesHelper.php",
 
        # tests/phpunit/includes/content
-       'DummyContentHandlerForTesting' => "$testDir/phpunit/mocks/content/DummyContentHandlerForTesting.php",
+       'DummyContentHandlerForTesting' =>
+               "$testDir/phpunit/mocks/content/DummyContentHandlerForTesting.php",
        'DummyContentForTesting' => "$testDir/phpunit/mocks/content/DummyContentForTesting.php",
        'DummyNonTextContentHandler' => "$testDir/phpunit/mocks/content/DummyNonTextContentHandler.php",
        'DummyNonTextContent' => "$testDir/phpunit/mocks/content/DummyNonTextContent.php",
@@ -91,8 +92,10 @@ $wgAutoloadClasses += array(
        'PasswordTestCase' => "$testDir/phpunit/includes/password/PasswordTestCase.php",
 
        # tests/phpunit/includes/resourceloader
-       'ResourceLoaderImageModuleTest' => "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
-       'ResourceLoaderImageModuleTestable' => "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
+       'ResourceLoaderImageModuleTest' =>
+               "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
+       'ResourceLoaderImageModuleTestable' =>
+               "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
 
        # tests/phpunit/includes/specials
        'SpecialPageTestBase' => "$testDir/phpunit/includes/specials/SpecialPageTestBase.php",
index f429c30..005ade5 100644 (file)
@@ -134,6 +134,12 @@ class ParserTest {
                $this->setupRecorder( $options );
                $this->keepUploads = isset( $options['keep-uploads'] );
 
+               if ( $this->keepUploads ) {
+                       $this->uploadDir = wfTempDir() . '/mwParser-images';
+               } else {
+                       $this->uploadDir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
+               }
+
                if ( isset( $options['seed'] ) ) {
                        $this->fuzzSeed = intval( $options['seed'] ) - 1;
                }
@@ -147,13 +153,17 @@ class ParserTest {
                        echo "Warning: tidy is not installed, skipping some tests\n";
                }
 
+               if ( !extension_loaded( 'gd' ) ) {
+                       echo "Warning: GD extension is not present, thumbnailing tests will probably fail\n";
+               }
+
                $this->hooks = array();
                $this->functionHooks = array();
                $this->transparentHooks = array();
-               self::setUp();
+               $this->setUp();
        }
 
-       static function setUp() {
+       function setUp() {
                global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
                        $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
                        $wgExtraNamespaces, $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
@@ -171,7 +181,7 @@ class ParserTest {
                $wgLockManagers = array( array(
                        'name' => 'fsLockManager',
                        'class' => 'FSLockManager',
-                       'lockDirectory' => wfTempDir() . '/test-repo/lockdir',
+                       'lockDirectory' => $this->uploadDir . '/lockdir',
                ), array(
                        'name' => 'nullLockManager',
                        'class' => 'NullLockManager',
@@ -186,10 +196,10 @@ class ParserTest {
                                '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/deleted',
+                                       'local-public' => $this->uploadDir . '/public',
+                                       'local-thumb' => $this->uploadDir . '/thumb',
+                                       'local-temp' => $this->uploadDir . '/temp',
+                                       'local-deleted' => $this->uploadDir . '/deleted',
                                )
                        ) )
                );
@@ -729,7 +739,7 @@ class ParserTest {
                                )*
                                \}              # Close bracket
                        )
-            (?<value>
+                       (?<value>
                                (?:
                                        (?&qstr)                        # Quoted val
                                |
@@ -937,6 +947,7 @@ class ParserTest {
 
                MagicWord::clearCache();
                MWTidy::destroySingleton();
+               RepoGroup::destroySingleton();
 
                return $context;
        }
@@ -1028,7 +1039,7 @@ class ParserTest {
 
                // Remember to update newParserTests.php after changing the below
                // (and it uses a slightly different syntax just for teh lulz)
-               $this->uploadDir = $this->setupUploadDir();
+               $this->setupUploadDir();
                $user = User::createNew( 'WikiSysop' );
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
                # note that the size/width/height/bits/etc of the file
@@ -1177,20 +1188,15 @@ class ParserTest {
        private function setupUploadDir() {
                global $IP;
 
-               if ( $this->keepUploads ) {
-                       $dir = wfTempDir() . '/mwParser-images';
-
-                       if ( is_dir( $dir ) ) {
-                               return $dir;
-                       }
-               } else {
-                       $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
+               $dir = $this->uploadDir;
+               if ( $this->keepUploads && is_dir( $dir ) ) {
+                       return;
                }
 
                // wfDebug( "Creating upload directory $dir\n" );
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
-                       return $dir;
+                       return;
                }
 
                wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
@@ -1207,7 +1213,7 @@ class ParserTest {
                wfMkdirParents( $dir . '/5/5f', null, __METHOD__ );
                copy( "$IP/tests/phpunit/data/parser/LoremIpsum.djvu", "$dir/5/5f/LoremIpsum.djvu" );
 
-               return $dir;
+               return;
        }
 
        /**
@@ -1239,58 +1245,13 @@ class ParserTest {
                self::deleteFiles(
                        array(
                                "$dir/3/3a/Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/1500px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/177px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/265px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/353px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
-
+                               "$dir/thumb/3/3a/Foobar.jpg/*.jpg",
                                "$dir/e/ea/Thumb.png",
-
                                "$dir/0/09/Bad.jpg",
-
                                "$dir/5/5f/LoremIpsum.djvu",
-                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg",
-                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg",
-                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg",
-
+                               "$dir/thumb/5/5f/LoremIpsum.djvu/*-LoremIpsum.djvu.jpg",
                                "$dir/f/ff/Foobar.svg",
-                               "$dir/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png",
-
+                               "$dir/thumb/f/ff/Foobar.svg/*-Foobar.svg.png",
                                "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
                );
@@ -1321,6 +1282,7 @@ class ParserTest {
                                "$dir/math/f/a",
                                "$dir/math/f",
                                "$dir/math",
+                               "$dir/lockdir",
                                "$dir",
                        )
                );
@@ -1331,9 +1293,11 @@ class ParserTest {
         * @param array $files Full paths to files to delete.
         */
        private static function deleteFiles( $files ) {
-               foreach ( $files as $file ) {
-                       if ( file_exists( $file ) ) {
-                               unlink( $file );
+               foreach ( $files as $pattern ) {
+                       foreach ( glob( $pattern ) as $file ) {
+                               if ( file_exists( $file ) ) {
+                                       unlink( $file );
+                               }
                        }
                }
        }
@@ -1661,7 +1625,7 @@ class ParserTest {
        }
 
        static function getFakeTimestamp( &$parser, &$ts ) {
-               $ts = 123; //parsed as '1970-01-01T00:02:03Z'
+               $ts = 123; // parsed as '1970-01-01T00:02:03Z'
                return true;
        }
 }
index c8c63f3..7719a28 100644 (file)
@@ -4646,6 +4646,9 @@ http://example.com?
 http://example.com)
 http://example.com/url_with_(brackets)
 (http://example.com/url_without_brackets)
+http://example.com/url_with_entity&amp;
+http://example.com/url_with_entity&#x26;
+http://example.com/url_with_entity&#038;
 http://example.com/url_with_entity&nbsp;
 http://example.com/url_with_entity&#xA0;
 http://example.com/url_with_entity&#160;
@@ -4663,12 +4666,15 @@ http://example.com/url_with_entity&#60;
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
 <a rel="nofollow" class="external free" href="http://example.com/url_with_(brackets)">http://example.com/url_with_(brackets)</a>
 (<a rel="nofollow" class="external free" href="http://example.com/url_without_brackets">http://example.com/url_without_brackets</a>)
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#160;
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#xa0;
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#160;
 <a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&lt;
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity%3C">http://example.com/url_with_entity%3C</a>
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity%3C">http://example.com/url_with_entity%3C</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#x3c;
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#60;
 </p>
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a>,
@@ -10348,12 +10354,52 @@ BUG 553: link with two variables in a piped link
 {|
 |[[{{{1}}}|{{{2}}}]]
 |}
-!! html
+!! html/php
 <table>
 <tr>
 <td>[[{{{1}}}|{{{2}}}]]
 </td></tr></table>
 
+!! html/parsoid
+<table>
+<tbody><tr><td>[[<span about="#mwt5" typeof="mw:Param" data-parsoid='{"src":"{{{1}}}"}'>{{{1}}}</span>|<span about="#mwt2" typeof="mw:Param" data-parsoid='{"src":"{{{2}}}"}'>{{{2}}}</span>]]</td></tr>
+!! end
+
+# See: T2553
+!! test
+Abort table cell attribute parsing on wikilink
+!! wikitext
+{|
+| testing [[one|two]] | three || four
+| testing one two | three || four
+|}
+!! html/php
+<table>
+<tr>
+<td> testing <a href="/index.php?title=One&amp;action=edit&amp;redlink=1" class="new" title="One (page does not exist)">two</a> | three </td>
+<td> four
+</td>
+<td> three </td>
+<td> four
+</td></tr></table>
+
+!! html/parsoid
+<table>
+<tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'> testing <a rel="mw:WikiLink" href="./One" title="One" data-parsoid='{"stx":"piped","a":{"href":"./One"},"sa":{"href":"one"}}'>two</a> | three </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> four</td>
+<td data-parsoid='{"a":{"testing":null,"one":null,"two":null},"sa":{"testing":"","one":"","two":""},"autoInsertedEnd":true}'> three </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> four</td></tr>
+</tbody></table>
+!! end
+
+!! test
+Don't abort table cell attribute parsing if wikilink is found in template arg
+!! wikitext
+{|
+| Test {{#tag:ref|One two "[[three]]" four}}
+|}
+!! html/parsoid
+<table>
+<tbody><tr><td> Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"#tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
+</tbody></table>
 !! end
 
 !! test
@@ -11813,6 +11859,17 @@ Templates: Ugly templates: 6. Template encapsulation test: Cyclical nesting of t
 </table></td></tr></tbody></table>
 !! end
 
+!! test
+Templates: Parameters substituted at the top-level
+!! wikitext
+{{{foo|''who'' {{echo|me}}? '''never!'''}}}
+!! html/php
+<p><i>who</i> me? <b>never!</b>
+</p>
+!! html/parsoid
+<p about="#mwt2" typeof="mw:Param" data-parsoid="{&quot;src&quot;:&quot;{{{foo|''who'' {{echo|me}}? '''never!'''}}}&quot;}"><i>who</i> me? <b>never!</b></p>
+!! end
+
 !!test
 Parser Functions: 1. Simple example
 !! wikitext
@@ -17968,11 +18025,15 @@ Special:Search page linking.
 {{!}} is a magic word
 !! wikitext
 {{!}} is a magic word there and {{!}} is still a magic word here
+| is not a magic word here but {{!}} is still a magic word here
 !! html/php
 <p>| is a magic word there and | is still a magic word here
+| is not a magic word here but | is still a magic word here
 </p>
 !! html/parsoid
-<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}' data-parsoid='{"pi":[[]]}'>|</span> is a magic word there and <span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}' data-parsoid='{"pi":[[]]}'>|</span> is still a magic word here</p>
+<p><span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is a magic word there and <span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is still a magic word here
+| is not a magic word here but <span about="#mwt3" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is still a magic word here</p>
+
 !! end
 
 !! test
@@ -23739,11 +23800,15 @@ RT-ed inter-element separators should be valid separators
 {|
 |- [[foo]]
 |}
-!! html
+!! html/php
 <table>
 
 </table>
 
+!! html/parsoid
+<table>
+<tbody><tr data-parsoid='{"startTagSrc":"|-","a":{"[[foo]]":null},"sa":{"[[foo]]":""},"autoInsertedEnd":true}'></tr>
+</tbody></table>
 !!end
 
 # Parsoid-only since PHP parser relies on Tidy for correct output
@@ -26054,6 +26119,37 @@ parsoid={
 </table>
 !! end
 
+## T111151 Remove font elements without attributes
+!! test
+5a. font tags without attributes should be dropped in scrubWikitext mode
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html
+<font>foo</font>
+<font><font>bar</font></font>
+<font class="x">boo</font>
+!! wikitext
+foo
+bar
+<font class="x">boo</font>
+!! end
+
+!! test
+5b. font tags should not be dropped without scrubWikitext being enabled
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": false
+}
+!! html
+<font>foo</font>
+!! wikitext
+<font>foo</font>
+!! end
+
 !! test
 Escape nowiki DOM elements
 !! options
index eec02ed..5e1f1a9 100644 (file)
@@ -41,11 +41,9 @@ class LessFileCompilationTest extends ResourceLoaderTestCase {
                $rlContext = $this->getResourceLoaderContext();
 
                // Bleh
-               $method = new ReflectionMethod( $this->module, 'getLessCompiler' );
+               $method = new ReflectionMethod( $this->module, 'compileLessFile' );
                $method->setAccessible( true );
-               $compiler = $method->invoke( $this->module, $rlContext );
-
-               $this->assertNotNull( $compiler->parseFile( $this->file )->getCss() );
+               $this->assertNotNull( $method->invoke( $this->module, $this->file, $rlContext ) );
        }
 
        public function toString() {
index 08463f1..dd606d8 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
-class MediaWikiPHPUnitTestListener extends PHPUnit_TextUI_ResultPrinter implements PHPUnit_Framework_TestListener {
+class MediaWikiPHPUnitTestListener
+       extends PHPUnit_TextUI_ResultPrinter implements PHPUnit_Framework_TestListener {
 
        /**
         * @var string
index 7dc7027..9bbbf9f 100644 (file)
@@ -103,6 +103,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                 */
                ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
 
+               // Sandbox APC by replacing with in-process hash instead.
+               // Ensures values are removed between tests.
+               ObjectCache::$instances['apc'] =
+               ObjectCache::$instances['xcache'] =
+               ObjectCache::$instances['wincache'] = new HashBagOStuff;
+
                $needsResetDB = false;
 
                if ( $this->needsDB() ) {
@@ -217,7 +223,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        protected function tearDown() {
                $status = ob_get_status();
-               if ( isset( $status['name'] ) && $status['name'] === 'MediaWikiTestCase::wfResetOutputBuffersBarrier' ) {
+               if ( isset( $status['name'] ) &&
+                       $status['name'] === 'MediaWikiTestCase::wfResetOutputBuffersBarrier'
+               ) {
                        ob_end_flush();
                }
 
@@ -1151,7 +1159,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        /**
         * Note: we are overriding this method to remove the deprecated error
-        * @see https://bugzilla.wikimedia.org/show_bug.cgi?id=69505
+        * @see https://phabricator.wikimedia.org/T71505
         * @see https://github.com/sebastianbergmann/phpunit/issues/1292
         * @deprecated
         *
@@ -1161,7 +1169,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param bool $isHtml
         */
        public static function assertTag( $matcher, $actual, $message = '', $isHtml = true ) {
-               //trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
+               // trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
 
                self::assertTrue( self::tagMatch( $matcher, $actual, $isHtml ), $message );
        }
@@ -1176,7 +1184,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param bool $isHtml
         */
        public static function assertNotTag( $matcher, $actual, $message = '', $isHtml = true ) {
-               //trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
+               // trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
 
                self::assertFalse( self::tagMatch( $matcher, $actual, $isHtml ), $message );
        }
diff --git a/tests/phpunit/data/filecontentshasher/hash.svg b/tests/phpunit/data/filecontentshasher/hash.svg
new file mode 100644 (file)
index 0000000..44068ba
--- /dev/null
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="200"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="New document 1">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.765"
+     inkscape:cx="101.66909"
+     inkscape:cy="64.929256"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     showborder="false"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1132"
+     inkscape:window-height="961"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-193.20113,-609.30267)">
+    <g
+       id="g3829">
+      <g
+         transform="translate(-61.473095,237.81998)"
+         id="g3821">
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke:none"
+           id="rect2998"
+           width="120.67989"
+           height="19.546741"
+           x="298.017"
+           y="434.23184"
+           ry="0" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke:none"
+           id="rect2998-1"
+           width="120.67989"
+           height="19.546741"
+           x="290.65155"
+           y="488.76447"
+           ry="0" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke:none"
+           id="rect2998-7"
+           width="183.60896"
+           height="19.546741"
+           x="384.33142"
+           y="-455.46609"
+           ry="0"
+           transform="matrix(-0.13731609,0.99052728,-1,0,0,0)" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke:none"
+           id="rect2998-7-4"
+           width="183.60896"
+           height="19.546741"
+           x="384.04288"
+           y="-406.21848"
+           ry="0"
+           transform="matrix(-0.13731609,0.99052728,-1,0,0,0)" />
+      </g>
+      <rect
+         y="609.30267"
+         x="193.20113"
+         height="200"
+         width="200"
+         id="rect3827"
+         style="fill:none;stroke:none" />
+    </g>
+  </g>
+</svg>
diff --git a/tests/phpunit/data/filecontentshasher/primes.txt b/tests/phpunit/data/filecontentshasher/primes.txt
new file mode 100644 (file)
index 0000000..a2fe1fb
--- /dev/null
@@ -0,0 +1,105 @@
+                         The First 1,000 Primes
+                          (the 1,000th is 7919)
+         For more information on primes see http://primes.utm.edu/
+
+      2      3      5      7     11     13     17     19     23     29
+     31     37     41     43     47     53     59     61     67     71
+     73     79     83     89     97    101    103    107    109    113
+    127    131    137    139    149    151    157    163    167    173
+    179    181    191    193    197    199    211    223    227    229
+    233    239    241    251    257    263    269    271    277    281
+    283    293    307    311    313    317    331    337    347    349
+    353    359    367    373    379    383    389    397    401    409
+    419    421    431    433    439    443    449    457    461    463
+    467    479    487    491    499    503    509    521    523    541
+    547    557    563    569    571    577    587    593    599    601
+    607    613    617    619    631    641    643    647    653    659
+    661    673    677    683    691    701    709    719    727    733
+    739    743    751    757    761    769    773    787    797    809
+    811    821    823    827    829    839    853    857    859    863
+    877    881    883    887    907    911    919    929    937    941
+    947    953    967    971    977    983    991    997   1009   1013
+   1019   1021   1031   1033   1039   1049   1051   1061   1063   1069
+   1087   1091   1093   1097   1103   1109   1117   1123   1129   1151
+   1153   1163   1171   1181   1187   1193   1201   1213   1217   1223
+   1229   1231   1237   1249   1259   1277   1279   1283   1289   1291
+   1297   1301   1303   1307   1319   1321   1327   1361   1367   1373
+   1381   1399   1409   1423   1427   1429   1433   1439   1447   1451
+   1453   1459   1471   1481   1483   1487   1489   1493   1499   1511
+   1523   1531   1543   1549   1553   1559   1567   1571   1579   1583
+   1597   1601   1607   1609   1613   1619   1621   1627   1637   1657
+   1663   1667   1669   1693   1697   1699   1709   1721   1723   1733
+   1741   1747   1753   1759   1777   1783   1787   1789   1801   1811
+   1823   1831   1847   1861   1867   1871   1873   1877   1879   1889
+   1901   1907   1913   1931   1933   1949   1951   1973   1979   1987
+   1993   1997   1999   2003   2011   2017   2027   2029   2039   2053
+   2063   2069   2081   2083   2087   2089   2099   2111   2113   2129
+   2131   2137   2141   2143   2153   2161   2179   2203   2207   2213
+   2221   2237   2239   2243   2251   2267   2269   2273   2281   2287
+   2293   2297   2309   2311   2333   2339   2341   2347   2351   2357
+   2371   2377   2381   2383   2389   2393   2399   2411   2417   2423
+   2437   2441   2447   2459   2467   2473   2477   2503   2521   2531
+   2539   2543   2549   2551   2557   2579   2591   2593   2609   2617
+   2621   2633   2647   2657   2659   2663   2671   2677   2683   2687
+   2689   2693   2699   2707   2711   2713   2719   2729   2731   2741
+   2749   2753   2767   2777   2789   2791   2797   2801   2803   2819
+   2833   2837   2843   2851   2857   2861   2879   2887   2897   2903
+   2909   2917   2927   2939   2953   2957   2963   2969   2971   2999
+   3001   3011   3019   3023   3037   3041   3049   3061   3067   3079
+   3083   3089   3109   3119   3121   3137   3163   3167   3169   3181
+   3187   3191   3203   3209   3217   3221   3229   3251   3253   3257
+   3259   3271   3299   3301   3307   3313   3319   3323   3329   3331
+   3343   3347   3359   3361   3371   3373   3389   3391   3407   3413
+   3433   3449   3457   3461   3463   3467   3469   3491   3499   3511
+   3517   3527   3529   3533   3539   3541   3547   3557   3559   3571
+   3581   3583   3593   3607   3613   3617   3623   3631   3637   3643
+   3659   3671   3673   3677   3691   3697   3701   3709   3719   3727
+   3733   3739   3761   3767   3769   3779   3793   3797   3803   3821
+   3823   3833   3847   3851   3853   3863   3877   3881   3889   3907
+   3911   3917   3919   3923   3929   3931   3943   3947   3967   3989
+   4001   4003   4007   4013   4019   4021   4027   4049   4051   4057
+   4073   4079   4091   4093   4099   4111   4127   4129   4133   4139
+   4153   4157   4159   4177   4201   4211   4217   4219   4229   4231
+   4241   4243   4253   4259   4261   4271   4273   4283   4289   4297
+   4327   4337   4339   4349   4357   4363   4373   4391   4397   4409
+   4421   4423   4441   4447   4451   4457   4463   4481   4483   4493
+   4507   4513   4517   4519   4523   4547   4549   4561   4567   4583
+   4591   4597   4603   4621   4637   4639   4643   4649   4651   4657
+   4663   4673   4679   4691   4703   4721   4723   4729   4733   4751
+   4759   4783   4787   4789   4793   4799   4801   4813   4817   4831
+   4861   4871   4877   4889   4903   4909   4919   4931   4933   4937
+   4943   4951   4957   4967   4969   4973   4987   4993   4999   5003
+   5009   5011   5021   5023   5039   5051   5059   5077   5081   5087
+   5099   5101   5107   5113   5119   5147   5153   5167   5171   5179
+   5189   5197   5209   5227   5231   5233   5237   5261   5273   5279
+   5281   5297   5303   5309   5323   5333   5347   5351   5381   5387
+   5393   5399   5407   5413   5417   5419   5431   5437   5441   5443
+   5449   5471   5477   5479   5483   5501   5503   5507   5519   5521
+   5527   5531   5557   5563   5569   5573   5581   5591   5623   5639
+   5641   5647   5651   5653   5657   5659   5669   5683   5689   5693
+   5701   5711   5717   5737   5741   5743   5749   5779   5783   5791
+   5801   5807   5813   5821   5827   5839   5843   5849   5851   5857
+   5861   5867   5869   5879   5881   5897   5903   5923   5927   5939
+   5953   5981   5987   6007   6011   6029   6037   6043   6047   6053
+   6067   6073   6079   6089   6091   6101   6113   6121   6131   6133
+   6143   6151   6163   6173   6197   6199   6203   6211   6217   6221
+   6229   6247   6257   6263   6269   6271   6277   6287   6299   6301
+   6311   6317   6323   6329   6337   6343   6353   6359   6361   6367
+   6373   6379   6389   6397   6421   6427   6449   6451   6469   6473
+   6481   6491   6521   6529   6547   6551   6553   6563   6569   6571
+   6577   6581   6599   6607   6619   6637   6653   6659   6661   6673
+   6679   6689   6691   6701   6703   6709   6719   6733   6737   6761
+   6763   6779   6781   6791   6793   6803   6823   6827   6829   6833
+   6841   6857   6863   6869   6871   6883   6899   6907   6911   6917
+   6947   6949   6959   6961   6967   6971   6977   6983   6991   6997
+   7001   7013   7019   7027   7039   7043   7057   7069   7079   7103
+   7109   7121   7127   7129   7151   7159   7177   7187   7193   7207
+   7211   7213   7219   7229   7237   7243   7247   7253   7283   7297
+   7307   7309   7321   7331   7333   7349   7351   7369   7393   7411
+   7417   7433   7451   7457   7459   7477   7481   7487   7489   7499
+   7507   7517   7523   7529   7537   7541   7547   7549   7559   7561
+   7573   7577   7583   7589   7591   7603   7607   7621   7639   7643
+   7649   7669   7673   7681   7687   7691   7699   7703   7717   7723
+   7727   7741   7753   7757   7759   7789   7793   7817   7823   7829
+   7841   7853   7867   7873   7877   7879   7883   7901   7907   7919
+end.
diff --git a/tests/phpunit/includes/ConsecutiveParametersMatcher.php b/tests/phpunit/includes/ConsecutiveParametersMatcher.php
deleted file mode 100644 (file)
index adf74bb..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Invocation matcher which looks for sets of specific parameters in the invocations.
- *
- * Checks the parameters of the incoming invocations, the parameter list is
- * checked against the defined constraints in $parameters. If the constraint
- * is met it will return true in matches().
- *
- * It takes a list of match groups and and increases a call index after each invocation.
- * So the first invocation uses the first group of constraints, the second the next and so on.
- */
-class PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
-{
-    /**
-     * @var array
-     */
-    private $_parameterGroups = array();
-
-    /**
-     * @var array
-     */
-    private $_invocations = array();
-
-    /**
-     * @param array $parameterGroups
-     */
-    public function __construct(array $parameterGroups)
-    {
-        foreach ($parameterGroups as $index => $parameters) {
-            foreach ($parameters as $parameter) {
-                if (!($parameter instanceof \PHPUnit_Framework_Constraint)) {
-                    $parameter = new \PHPUnit_Framework_Constraint_IsEqual($parameter);
-                }
-                $this->_parameterGroups[$index][] = $parameter;
-            }
-        }
-    }
-
-    /**
-     * @return string
-     */
-    public function toString()
-    {
-        $text = 'with consecutive parameters';
-
-        return $text;
-    }
-
-    /**
-     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
-     * @return bool
-     */
-    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
-    {
-        $this->_invocations[] = $invocation;
-        $callIndex            = count($this->_invocations) - 1;
-        $this->verifyInvocation($invocation, $callIndex);
-
-        return false;
-    }
-
-    public function verify()
-    {
-        foreach ($this->_invocations as $callIndex => $invocation) {
-            $this->verifyInvocation($invocation, $callIndex);
-        }
-    }
-
-    /**
-     * Verify a single invocation
-     *
-     * @param  PHPUnit_Framework_MockObject_Invocation      $invocation
-     * @param  int                                          $callIndex
-     * @throws PHPUnit_Framework_ExpectationFailedException
-     */
-    private function verifyInvocation(PHPUnit_Framework_MockObject_Invocation $invocation, $callIndex)
-    {
-
-        if (isset($this->_parameterGroups[$callIndex])) {
-            $parameters = $this->_parameterGroups[$callIndex];
-        } else {
-          // no parameter assertion for this call index
-            return;
-        }
-
-        if ($invocation === null) {
-            throw new PHPUnit_Framework_ExpectationFailedException(
-                'Mocked method does not exist.'
-            );
-        }
-
-        if (count($invocation->parameters) < count($parameters)) {
-            throw new PHPUnit_Framework_ExpectationFailedException(
-                sprintf(
-                    'Parameter count for invocation %s is too low.',
-                    $invocation->toString()
-                )
-            );
-        }
-
-        foreach ($parameters as $i => $parameter) {
-            $parameter->evaluate(
-                $invocation->parameters[$i],
-                sprintf(
-                    'Parameter %s for invocation #%d %s does not match expected ' .
-                    'value.',
-                    $i,
-                    $callIndex,
-                    $invocation->toString()
-                )
-            );
-        }
-    }
-}
index 27959b1..51f0083 100644 (file)
@@ -138,7 +138,7 @@ class EditPageTest extends MediaWikiLangTestCase {
                        $page->doEditContent( $content, "base text for test" );
                        $this->forceRevisionDate( $page, '20120101000000' );
 
-                       //sanity check
+                       // sanity check
                        $page->clear();
                        $currentText = ContentHandler::getContentText( $page->getContent() );
 
@@ -335,7 +335,7 @@ hello
                $textWithNewSectionAdded = "$text\n$newSection";
 
                return array(
-                       array( #0
+                       array( # 0
                                $text,
                                '',
                                'hello',
@@ -343,7 +343,7 @@ hello
                                'hello'
                        ),
 
-                       array( #1
+                       array( # 1
                                $text,
                                '1',
                                $sectionOne,
@@ -351,7 +351,7 @@ hello
                                $textWithNewSectionOne,
                        ),
 
-                       array( #2
+                       array( # 2
                                $text,
                                'new',
                                'hello',
@@ -380,14 +380,14 @@ hello
        public static function provideAutoMerge() {
                $tests = array();
 
-               $tests[] = array( #0: plain conflict
+               $tests[] = array( # 0: plain conflict
                        "Elmo", # base edit user
                        "one\n\ntwo\n\nthree\n",
-                       array( #adam's edit
+                       array( # adam's edit
                                'wpStarttime' => 1,
                                'wpTextbox1' => "ONE\n\ntwo\n\nthree\n",
                        ),
-                       array( #berta's edit
+                       array( # berta's edit
                                'wpStarttime' => 2,
                                'wpTextbox1' => "(one)\n\ntwo\n\nthree\n",
                        ),
@@ -396,14 +396,14 @@ hello
                        'expected edit conflict', # message
                );
 
-               $tests[] = array( #1: successful merge
+               $tests[] = array( # 1: successful merge
                        "Elmo", # base edit user
                        "one\n\ntwo\n\nthree\n",
-                       array( #adam's edit
+                       array( # adam's edit
                                'wpStarttime' => 1,
                                'wpTextbox1' => "ONE\n\ntwo\n\nthree\n",
                        ),
-                       array( #berta's edit
+                       array( # berta's edit
                                'wpStarttime' => 2,
                                'wpTextbox1' => "one\n\ntwo\n\nTHREE\n",
                        ),
@@ -424,15 +424,15 @@ hello
                // generate expected text after merge
                $expected = str_replace( 'one', 'ONE', str_replace( 'three', 'THREE', $text ) );
 
-               $tests[] = array( #2: merge in section
+               $tests[] = array( # 2: merge in section
                        "Elmo", # base edit user
                        $text,
-                       array( #adam's edit
+                       array( # adam's edit
                                'wpStarttime' => 1,
                                'wpTextbox1' => str_replace( 'one', 'ONE', $section ),
                                'wpSection' => '1'
                        ),
-                       array( #berta's edit
+                       array( # berta's edit
                                'wpStarttime' => 2,
                                'wpTextbox1' => str_replace( 'three', 'THREE', $section ),
                                'wpSection' => '1'
@@ -465,7 +465,7 @@ hello
        ) {
                $this->checkHasDiff3();
 
-               //create page
+               // create page
                $ns = $this->getDefaultWikitextNS();
                $title = Title::newFromText( 'EditPageTest_testAutoMerge', $ns );
                $page = WikiPage::factory( $title );
index c60170f..0a1b7d0 100644 (file)
@@ -13,7 +13,7 @@ class FallbackTest extends MediaWikiTestCase {
 
                $sampleUTF = "Östergötland_coat_of_arms.png";
 
-               //mb_substr
+               // mb_substr
                $substr_params = array(
                        array( 0, 0 ),
                        array( 5, -4 ),
@@ -35,21 +35,21 @@ class FallbackTest extends MediaWikiTestCase {
                        );
                }
 
-               //mb_strlen
+               // mb_strlen
                $this->assertEquals(
                        mb_strlen( $sampleUTF ),
                        Fallback::mb_strlen( $sampleUTF ),
                        'Fallback mb_strlen'
                );
 
-               //mb_str(r?)pos
+               // mb_str(r?)pos
                $strpos_params = array(
-                       //array( 'ter' ),
-                       //array( 'Ö' ),
-                       //array( 'Ö', 3 ),
-                       //array( 'oat_', 100 ),
-                       //array( 'c', -10 ),
-                       //Broken for now
+                       // array( 'ter' ),
+                       // array( 'Ö' ),
+                       // array( 'Ö', 3 ),
+                       // array( 'oat_', 100 ),
+                       // array( 'c', -10 ),
+                       // Broken for now
                );
 
                foreach ( $strpos_params as $param_set ) {
index 39a0eff..8c104d9 100644 (file)
@@ -32,13 +32,36 @@ class FauxResponseTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers FauxResponse::getcookie
-        * @covers FauxResponse::setcookie
+        * @covers FauxResponse::setCookie
+        * @covers FauxResponse::getCookie
+        * @covers FauxResponse::getCookieData
+        * @covers FauxResponse::getCookies
         */
        public function testCookie() {
-               $this->assertEquals( null, $this->response->getcookie( 'key' ), 'Non-existing cookie' );
-               $this->response->setcookie( 'key', 'val' );
-               $this->assertEquals( 'val', $this->response->getcookie( 'key' ), 'Existing cookie' );
+               $expire = time() + 100;
+               $cookie = array(
+                       'value' => 'val',
+                       'path' => '/path',
+                       'domain' => 'domain',
+                       'secure' => true,
+                       'httpOnly' => false,
+                       'raw' => false,
+                       'expire' => $expire,
+               );
+
+               $this->assertEquals( null, $this->response->getCookie( 'xkey' ), 'Non-existing cookie' );
+               $this->response->setCookie( 'key', 'val', $expire, array(
+                       'prefix' => 'x',
+                       'path' => '/path',
+                       'domain' => 'domain',
+                       'secure' => 1,
+                       'httpOnly' => 0,
+               ) );
+               $this->assertEquals( 'val', $this->response->getCookie( 'xkey' ), 'Existing cookie' );
+               $this->assertEquals( $cookie, $this->response->getCookieData( 'xkey' ),
+                       'Existing cookie (data)' );
+               $this->assertEquals( array( 'xkey' => $cookie ), $this->response->getCookies(),
+                       'Existing cookies' );
        }
 
        /**
index e89e36f..e39e02f 100644 (file)
@@ -306,7 +306,7 @@ class GlobalTest extends MediaWikiTestCase {
 
                $this->setMwGlobals( array(
                        'wgDebugLogFile' => $debugLogFile,
-                       # @todo FIXME: $wgDebugTimestamps should be tested
+                       #  @todo FIXME: $wgDebugTimestamps should be tested
                        'wgDebugTimestamps' => false
                ) );
 
@@ -353,7 +353,7 @@ class GlobalTest extends MediaWikiTestCase {
                        'gzip;q=1.0' => true,
                        'foozip' => false,
                        'foo*zip' => false,
-                       'gzip;q=abcde' => true, //is this REALLY valid?
+                       'gzip;q=abcde' => true, // is this REALLY valid?
                        'gzip;q=12345678.9' => true,
                        ' gzip' => true,
                );
@@ -551,10 +551,10 @@ class GlobalTest extends MediaWikiTestCase {
 
        public static function provideMakeUrlIndexes() {
                return array(
+                       // Testcase for T30627
                        array(
-                               // just a regular :)
-                               'https://bugzilla.wikimedia.org/show_bug.cgi?id=28627',
-                               array( 'https://org.wikimedia.bugzilla./show_bug.cgi?id=28627' )
+                               'https://example.org/test.cgi?id=12345',
+                               array( 'https://org.example./test.cgi?id=12345' )
                        ),
                        array(
                                // mailtos are handled special
@@ -563,7 +563,7 @@ class GlobalTest extends MediaWikiTestCase {
                                array( 'mailto:org.wikimedia@wiki.' )
                        ),
 
-                       // file URL cases per bug 28627...
+                       // file URL cases per T30627...
                        array(
                                // three slashes: local filesystem path Unix-style
                                'file:///whatever/you/like.txt',
@@ -587,12 +587,12 @@ class GlobalTest extends MediaWikiTestCase {
                        // Those will survive the algorithm but with results that
                        // are less consistent.
 
-                       // protocol-relative URL cases per bug 29854...
+                       // protocol-relative URL cases per T31854...
                        array(
-                               '//bugzilla.wikimedia.org/show_bug.cgi?id=28627',
+                               '//example.org/test.cgi?id=12345',
                                array(
-                                       'http://org.wikimedia.bugzilla./show_bug.cgi?id=28627',
-                                       'https://org.wikimedia.bugzilla./show_bug.cgi?id=28627'
+                                       'http://org.example./test.cgi?id=12345',
+                                       'https://org.example./test.cgi?id=12345'
                                )
                        ),
                );
index d4df7b0..92115b0 100644 (file)
@@ -7,7 +7,7 @@
  * @covers ::wfUrlencode
  */
 class WfUrlencodeTest extends MediaWikiTestCase {
-       #### TESTS ##############################################################
+       # ### TESTS ##############################################################
 
        /**
         * @dataProvider provideURLS
@@ -23,7 +23,7 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                $this->verifyEncodingFor( 'Microsoft-IIS/7', $input, $expected );
        }
 
-       #### HELPERS #############################################################
+       # ### HELPERS #############################################################
 
        /**
         * Internal helper that actually run the test.
@@ -76,7 +76,7 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                }
        }
 
-       #### PROVIDERS ###########################################################
+       # ### PROVIDERS ###########################################################
 
        /**
         * Format is either:
@@ -91,7 +91,7 @@ class WfUrlencodeTest extends MediaWikiTestCase {
         */
        public static function provideURLS() {
                return array(
-                       ### RFC 1738 chars
+                       # ## RFC 1738 chars
                        // + is not safe
                        array( '+', '%2B' ),
                        // & and = not safe in queries
@@ -109,7 +109,7 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                                ';@$-_.!*',
                        ),
 
-                       ### Other tests
+                       # ## Other tests
                        // slash remain unchanged. %2F seems to break things
                        array( '/', '/' ),
                        // T105265
index 1c3e853..df54914 100644 (file)
@@ -114,7 +114,7 @@ class HtmlFormatterTest extends MediaWikiTestCase {
                                array(),
                                $removeTags, // Have some rules to trigger a DOM parse
                        ),
-                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+                       // https://phabricator.wikimedia.org/T55086
                        array(
                                'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>'
                                        . ' <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
index c5797c4..830a7be 100644 (file)
@@ -103,7 +103,7 @@ class HtmlTest extends MediaWikiTestCase {
         */
        public function testExpandAttributesSkipsNullAndFalse() {
 
-               ### EMPTY ########
+               # ## EMPTY ########
                $this->assertEmpty(
                        Html::expandAttributes( array( 'foo' => null ) ),
                        'skip keys with null value'
@@ -187,7 +187,7 @@ class HtmlTest extends MediaWikiTestCase {
         * @covers Html::expandAttributes
         */
        public function testExpandAttributesVariousExpansions() {
-               ### NOT EMPTY ####
+               # ## NOT EMPTY ####
                $this->assertEquals(
                        ' empty_string=""',
                        Html::expandAttributes( array( 'empty_string' => '' ) ),
@@ -240,7 +240,7 @@ class HtmlTest extends MediaWikiTestCase {
         * @covers Html::expandAttributes
         */
        public function testExpandAttributesListValueAttributes() {
-               ### STRING VALUES
+               # ## STRING VALUES
                $this->assertEquals(
                        ' class="redundant spaces here"',
                        Html::expandAttributes( array( 'class' => ' redundant  spaces  here  ' ) ),
@@ -251,7 +251,7 @@ class HtmlTest extends MediaWikiTestCase {
                        Html::expandAttributes( array( 'class' => 'foo bar foo bar bar' ) ),
                        'Normalization should remove duplicates in string-lists'
                );
-               ### "EMPTY" ARRAY VALUES
+               # ## "EMPTY" ARRAY VALUES
                $this->assertEquals(
                        ' class=""',
                        Html::expandAttributes( array( 'class' => array() ) ),
@@ -262,7 +262,7 @@ class HtmlTest extends MediaWikiTestCase {
                        Html::expandAttributes( array( 'class' => array( null, '', ' ', '  ' ) ) ),
                        'Array with null, empty string and spaces'
                );
-               ### NON-EMPTY ARRAY VALUES
+               # ## NON-EMPTY ARRAY VALUES
                $this->assertEquals(
                        ' class="foo bar"',
                        Html::expandAttributes( array( 'class' => array(
@@ -528,7 +528,7 @@ class HtmlTest extends MediaWikiTestCase {
                # Will be mapped to Html::element()
                $cases = array();
 
-               ### Generic cases, match $attribDefault static array
+               # ## Generic cases, match $attribDefault static array
                $cases[] = array( '<area>',
                        'area', array( 'shape' => 'rect' )
                );
@@ -602,7 +602,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'textarea', array( 'wrap' => 'soft' )
                );
 
-               ### SPECIFIC CASES
+               # ## SPECIFIC CASES
 
                # <link type="text/css">
                $cases[] = array( '<link>',
index 8a0dff7..ea4b646 100644 (file)
@@ -95,8 +95,8 @@ class HttpTest extends MediaWikiTestCase {
                        # (\S+) - host part is made of anything not whitespaces
                        // commented these out in order to remove @group Broken
                        // @todo are these valid tests? if so, fix Http::isValidURI so it can handle them
-                       //array( false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ),
-                       //array( false, 'http://exam:ple.org/', 'hostname can not use colons!' ),
+                       // array( false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ),
+                       // array( false, 'http://exam:ple.org/', 'hostname can not use colons!' ),
 
                        # (:[0-9]+)? - port number
                        array( true, 'http://example.org:80/' ),
index ea753e8..8ee2ad5 100644 (file)
@@ -10,6 +10,9 @@
 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() ) {
@@ -35,7 +38,10 @@ class ImportTest extends MediaWikiLangTestCase {
                        }
                };
 
-               $importer = new WikiImporter( $source, ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $importer = new WikiImporter(
+                       $source,
+                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+               );
                $importer->setPageOutCallback( $callback );
                $importer->doImport();
 
@@ -43,6 +49,7 @@ class ImportTest extends MediaWikiLangTestCase {
        }
 
        public function getRedirectXML() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array(
                                <<< EOF
@@ -97,6 +104,7 @@ EOF
                                null
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -113,7 +121,10 @@ EOF
                        $importNamespaces = $siteinfo['_namespaces'];
                };
 
-               $importer = new WikiImporter( $source, ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $importer = new WikiImporter(
+                       $source,
+                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+               );
                $importer->setSiteInfoCallback( $callback );
                $importer->doImport();
 
@@ -121,6 +132,7 @@ EOF
        }
 
        public function getSiteInfoXML() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array(
                                <<< EOF
@@ -152,6 +164,7 @@ EOF
                                )
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
 }
index 6808105..f011f47 100644 (file)
@@ -172,7 +172,7 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        //
                        // array( null, 'http://*.test.com', 'http://www.test.com:80', false ),
                        // array( '', 'https://*.wikimedia.org/r/#/q/status:open,n,z',
-                       //      'https://gerrit.wikimedia.org/XXX/r/#/q/status:open,n,z', false ),
+                       //      'https://gerrit.wikimedia.org/XXX/r/#/q/status:open,n,z', false ),
                );
 
        }
index a3efbb8..58634d4 100644 (file)
@@ -30,7 +30,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                # - optional message
                return array(
 
-                       ### ANONYMOUS USER ########################################
+                       # ## ANONYMOUS USER ########################################
                        array(
                                '<a href="/wiki/Special:Contributions/JohnDoe" '
                                        . 'title="Special:Contributions/JohnDoe" '
@@ -82,7 +82,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                                'Anonymous with IPv4 and an alternative username'
                        ),
 
-                       ### Regular user ##########################################
+                       # ## Regular user ##########################################
                        # TODO!
                );
        }
@@ -93,7 +93,9 @@ class LinkerTest extends MediaWikiLangTestCase {
         * @covers Linker::formatAutocomments
         * @covers Linker::formatLinksInComment
         */
-       public function testFormatComment( $expected, $comment, $title = false, $local = false, $wikiId = null ) {
+       public function testFormatComment(
+               $expected, $comment, $title = false, $local = false, $wikiId = null
+       ) {
                $conf = new SiteConfiguration();
                $conf->settings = array(
                        'wgServer' => array(
@@ -129,6 +131,7 @@ class LinkerTest extends MediaWikiLangTestCase {
        public function provideCasesForFormatComment() {
                $wikiId = 'enwiki'; // $wgConf has a fake entry for this
 
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Linker::formatComment
                        array(
@@ -252,6 +255,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                                false, false, $wikiId
                        )
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -285,6 +289,7 @@ class LinkerTest extends MediaWikiLangTestCase {
        }
 
        public static function provideCasesForFormatLinksInComment() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array(
                                'foo bar <a href="/wiki/Special:BlankPage" title="Special:BlankPage">Special:BlankPage</a>',
@@ -302,5 +307,6 @@ class LinkerTest extends MediaWikiLangTestCase {
                                'enwiki',
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
index 311350b..4fc54e8 100644 (file)
@@ -29,7 +29,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
                ) );
        }
 
-#### START OF TESTS #########################################################
+# ### START OF TESTS #########################################################
 
        /**
         * @todo Write more texts, handle $wgAllowImageMoving setting
@@ -137,9 +137,9 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
        }
 
-       ### Exceptions with getAssociated()
-       ### NS_MEDIA and NS_SPECIAL do not have talk pages. MediaWiki raises
-       ### an exception for them.
+       # ## Exceptions with getAssociated()
+       # ## NS_MEDIA and NS_SPECIAL do not have talk pages. MediaWiki raises
+       # ## an exception for them.
        /**
         * @expectedException MWException
         * @covers MWNamespace::getAssociated
@@ -565,7 +565,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $this->assertFalse( MWNamespace::isNonincludable( NS_TEMPLATE ) );
        }
 
-       ####### HELPERS ###########################################################
+       # ###### HELPERS ###########################################################
        function __call( $method, $args ) {
                // Call the real method if it exists
                if ( method_exists( $this, $method ) ) {
index f0d905e..51a19c6 100644 (file)
@@ -137,6 +137,7 @@ class OutputPageTest extends MediaWikiTestCase {
        }
 
        public static function provideMakeResourceLoaderLink() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Load module script only
                        array(
@@ -193,6 +194,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                        . "\n} );</script>"
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -323,8 +325,6 @@ class OutputPageTest extends MediaWikiTestCase {
                                        array( 'Cookie', array( 'string-contains=phpsessid' ) ),
                                        array( 'Cookie', array( 'string-contains=phpsessid' ) ),
                                        array( 'Accept-Language', array( 'string-contains=en', 'string-contains=en' ) ),
-
-
                                ),
                                'Vary: Cookie, Accept-Language',
                                'X-Vary-Options: Cookie;string-contains=phpsessid,Accept-Language;string-contains=en',
@@ -359,6 +359,7 @@ class NullMessageBlobStore extends MessageBlobStore {
 
        public function updateMessage( $key ) {
        }
+
        public function clear() {
        }
 }
index 9a429bc..301ec5c 100644 (file)
@@ -226,7 +226,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
 
                $res = Revision::fetchRevision( $page->getTitle() );
 
-               #note: order is unspecified
+               # note: order is unspecified
                $rows = array();
                while ( ( $row = $res->fetchObject() ) ) {
                        $rows[$row->rev_id] = $row;
@@ -297,7 +297,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $this->assertNull( $rev->getContent(),
                        "getContent() should return null if the revision's text blob could not be loaded." );
 
-               //NOTE: check this twice, once for lazy initialization, and once with the cached value.
+               // NOTE: check this twice, once for lazy initialization, and once with the cached value.
                $this->assertNull( $rev->getContent(),
                        "getContent() should return null if the revision's text blob could not be loaded." );
        }
@@ -462,16 +462,16 @@ class RevisionStorageTest extends MediaWikiTestCase {
 
        public static function provideUserWasLastToEdit() {
                return array(
-                       array( #0
+                       array( # 0
                                3, true, # actually the last edit
                        ),
-                       array( #1
+                       array( # 1
                                2, true, # not the current edit, but still by this user
                        ),
-                       array( #2
+                       array( # 2
                                1, false, # edit by another user
                        ),
-                       array( #3
+                       array( # 3
                                0, false, # first edit, by this user, but another user edited in the mean time
                        ),
                );
index 4623b38..eb17588 100644 (file)
@@ -211,7 +211,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetContentModel() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, CONTENT_MODEL_WIKITEXT ),
                        array( 'hello world', 'User:hello/there.css', null, null, CONTENT_MODEL_CSS ),
@@ -231,7 +231,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetContentFormat() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, CONTENT_FORMAT_WIKITEXT ),
                        array( 'hello world', 'Help:Hello', CONTENT_MODEL_CSS, null, CONTENT_FORMAT_CSS ),
@@ -252,7 +252,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetContentHandler() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, 'WikitextContentHandler' ),
                        array( 'hello world', 'User:hello/there.css', null, null, 'CssContentHandler' ),
@@ -272,7 +272,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetContent() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
                        array(
@@ -312,7 +312,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetText() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
                        array( serialize( 'hello world' ), 'Hello', "testing", null, Revision::FOR_PUBLIC, null ),
index c5944d1..4b06e83 100644 (file)
@@ -57,12 +57,12 @@ class TestSample extends MediaWikiLangTestCase {
                );
        }
 
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * @dataProvider provideTitles
-        * @codingStandardsIgnoreStart Ignore long line warning
         * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.dataProvider
-        * @codingStandardsIgnoreEnd
         */
+       // @codingStandardsIgnoreEnd
        public function testCreateBasicListOfTitles( $titleName, $ns, $text ) {
                $title = Title::newFromText( $titleName, $ns );
                $this->assertEquals( $text, "$title", "see if '$titleName' matches '$text'" );
@@ -95,7 +95,7 @@ class TestSample extends MediaWikiLangTestCase {
                $this->assertTrue( $title->isLocal() );
        }
 
-       // @codingStandardsIgnoreStart Ignore long line warning
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * @expectedException InvalidArgumentException
         * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.expectedException
index 291ed31..c95e69b 100644 (file)
@@ -64,7 +64,16 @@ class StatusTest extends MediaWikiLangTestCase {
                $this->assertTrue( $status->ok );
                $status = Status::newFatal( 'foo', 1, 2 );
                $this->assertFalse( $status->ok );
-               $this->assertArrayEquals( array( array( 'type' => 'error', 'message' => 'foo', 'params' => array( 1, 2 ) ) ), $status->errors );
+               $this->assertArrayEquals(
+                       array(
+                               array(
+                                       'type' => 'error',
+                                       'message' => 'foo',
+                                       'params' => array( 1, 2 )
+                               )
+                       ),
+                       $status->errors
+               );
        }
 
        /**
@@ -439,14 +448,14 @@ class StatusTest extends MediaWikiLangTestCase {
                // and the first call to the setUp method. Because of that you can't access any variables
                // you create there from within a data provider."
                // http://phpunit.de/manual/3.7/en/writing-tests-for-phpunit.html
-//             $status = new Status();
-//             $status->warning( 'fooBar!' );
-//             $status->warning( 'fooBar2!' );
-//             $testCases[ '2StringWarnings' ] = array(
-//                     $status,
-//                     array( new Message( 'fooBar!' ), new Message( 'fooBar2!' ) ),
-//                     "* \$1\n* \$2"
-//             );
+//             $status = new Status();
+//             $status->warning( 'fooBar!' );
+//             $status->warning( 'fooBar2!' );
+//             $testCases[ '2StringWarnings' ] = array(
+//                     $status,
+//                     array( new Message( 'fooBar!' ), new Message( 'fooBar2!' ) ),
+//                     "* \$1\n* \$2"
+//             );
 
                $status = new Status();
                $status->warning( new Message( 'fooBar!', array( 'foo', 'bar' ) ) );
index 754568d..96b2251 100644 (file)
@@ -28,7 +28,9 @@ class TestUser {
 
        private function assertNotReal() {
                global $wgDBprefix;
-               if ( $wgDBprefix !== MediaWikiTestCase::DB_PREFIX && $wgDBprefix !== MediaWikiTestCase::ORA_DB_PREFIX ) {
+               if ( $wgDBprefix !== MediaWikiTestCase::DB_PREFIX &&
+                       $wgDBprefix !== MediaWikiTestCase::ORA_DB_PREFIX
+               ) {
                        throw new MWException( "Can't create user on real database" );
                }
        }
index 6654a5b..aad435e 100644 (file)
@@ -113,7 +113,7 @@ class TitleArrayFromResultTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals( $expected, $object->valid() );
        }
 
-       //@todo unit test for key()
-       //@todo unit test for next()
-       //@todo unit test for rewind()
+       // @todo unit test for key()
+       // @todo unit test for next()
+       // @todo unit test for rewind()
 }
index f588ed6..1318d10 100644 (file)
@@ -248,7 +248,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                );
 
                if ( $this->isWikitextNS( NS_MAIN ) ) {
-                       //NOTE: some content models don't allow moving
+                       // NOTE: some content models don't allow moving
                        // @todo find a Wikitext namespace for testing
 
                        $this->setTitle( NS_MAIN );
index a2c6f23..e88eb21 100644 (file)
@@ -99,9 +99,9 @@ class TitleTest extends MediaWikiTestCase {
                        // XML/HTML character entity references
                        // Note: Commented out because they are not marked invalid by the PHP test as
                        // Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
-                       //'A &eacute; B',
-                       //'A &#233; B',
-                       //'A &#x00E9; B',
+                       // 'A &eacute; B',
+                       // 'A &#233; B',
+                       // 'A &#x00E9; B',
                        // Subject of NS_TALK does not roundtrip to NS_MAIN
                        array( 'Talk:File:Example.svg', 'title-invalid-talk-namespace' ),
                        // Directory navigation
@@ -657,7 +657,15 @@ class TitleTest extends MediaWikiTestCase {
                $linkCache->clearLink( $title );
                $linkCache->addBadLinkObj( $title );
 
-               $this->assertEquals( false, $title->exists(), 'exists() should rely on link cache unless GAID_FOR_UPDATE is used' );
-               $this->assertEquals( true, $title->exists( Title::GAID_FOR_UPDATE ), 'exists() should re-query database when GAID_FOR_UPDATE is used' );
+               $this->assertEquals(
+                       false,
+                       $title->exists(),
+                       'exists() should rely on link cache unless GAID_FOR_UPDATE is used'
+               );
+               $this->assertEquals(
+                       true,
+                       $title->exists( Title::GAID_FOR_UPDATE ),
+                       'exists() should re-query database when GAID_FOR_UPDATE is used'
+               );
        }
 }
index 62989fa..469ad29 100644 (file)
@@ -108,7 +108,7 @@ class UserArrayFromResultTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $object->valid() );
        }
 
-       //@todo unit test for key()
-       //@todo unit test for next()
-       //@todo unit test for rewind()
+       // @todo unit test for key()
+       // @todo unit test for next()
+       // @todo unit test for rewind()
 }
index 77132bb..17c1b8e 100644 (file)
@@ -527,7 +527,7 @@ class UserTest extends MediaWikiTestCase {
 
                $setcookieInvocations = $setcookieSpy->getInvocations();
                $setcookieInvocation = end( $setcookieInvocations );
-               $actualExpiry = $setcookieInvocation->parameters[ 2 ];
+               $actualExpiry = $setcookieInvocation->parameters[2];
 
                // TODO: ± 300 seconds compensates for
                // slow-running tests. However, the dependency on the time
index 9233416..08ba41d 100644 (file)
@@ -27,8 +27,8 @@ class WikiMapTest extends MediaWikiLangTestCase {
        }
 
        public function provideGetWiki() {
-               $enwiki = new WikiReference( 'wiki', 'en', 'http://en.example.org', '/w/$1' );
-               $ruwiki = new WikiReference( 'wiki', 'ru', '//ru.example.org', '/wiki/$1' );
+               $enwiki = new WikiReference( 'http://en.example.org', '/w/$1' );
+               $ruwiki = new WikiReference( '//ru.example.org', '/wiki/$1' );
 
                return array(
                        'unknown' => array( false, 'xyzzy' ),
@@ -62,8 +62,19 @@ class WikiMapTest extends MediaWikiLangTestCase {
        public function provideMakeForeignLink() {
                return array(
                        'unknown' => array( false, 'xyzzy', 'Foo' ),
-                       'enwiki' => array( '<a class="external" rel="nofollow" href="http://en.example.org/w/Foo">Foo</a>', 'enwiki', 'Foo',  ),
-                       'ruwiki' => array( '<a class="external" rel="nofollow" href="//ru.example.org/wiki/%D0%A4%D1%83">вар</a>', 'ruwiki', 'Фу', 'вар' ),
+                       'enwiki' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="http://en.example.org/w/Foo">Foo</a>',
+                               'enwiki',
+                               'Foo'
+                       ),
+                       'ruwiki' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="//ru.example.org/wiki/%D0%A4%D1%83">вар</a>',
+                               'ruwiki',
+                               'Фу',
+                               'вар'
+                       ),
                );
        }
 
@@ -71,14 +82,28 @@ class WikiMapTest extends MediaWikiLangTestCase {
         * @dataProvider provideMakeForeignLink
         */
        public function testMakeForeignLink( $expected, $wikiId, $page, $text = null ) {
-               $this->assertEquals( $expected, WikiMap::makeForeignLink( $wikiId, $page, $text ) );
+               $this->assertEquals(
+                       $expected,
+                       WikiMap::makeForeignLink( $wikiId, $page, $text )
+               );
        }
 
        public function provideForeignUserLink() {
                return array(
                        'unknown' => array( false, 'xyzzy', 'Foo' ),
-                       'enwiki' => array( '<a class="external" rel="nofollow" href="http://en.example.org/w/User:Foo">User:Foo</a>', 'enwiki', 'Foo',  ),
-                       'ruwiki' => array( '<a class="external" rel="nofollow" href="//ru.example.org/wiki/User:%D0%A4%D1%83">вар</a>', 'ruwiki', 'Фу', 'вар' ),
+                       'enwiki' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="http://en.example.org/w/User:Foo">User:Foo</a>',
+                               'enwiki',
+                               'Foo'
+                       ),
+                       'ruwiki' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="//ru.example.org/wiki/User:%D0%A4%D1%83">вар</a>',
+                               'ruwiki',
+                               'Фу',
+                               'вар'
+                       ),
                );
        }
 
@@ -92,8 +117,13 @@ class WikiMapTest extends MediaWikiLangTestCase {
        public function provideGetForeignURL() {
                return array(
                        'unknown' => array( false, 'xyzzy', 'Foo' ),
-                       'enwiki' => array( 'http://en.example.org/w/Foo', 'enwiki', 'Foo',  ),
-                       'ruwiki with fragement' => array( '//ru.example.org/wiki/%D0%A4%D1%83#%D0%B2%D0%B0%D1%80', 'ruwiki', 'Фу', 'вар' ),
+                       'enwiki' => array( 'http://en.example.org/w/Foo', 'enwiki', 'Foo' ),
+                       'ruwiki with fragment' => array(
+                               '//ru.example.org/wiki/%D0%A4%D1%83#%D0%B2%D0%B0%D1%80',
+                               'ruwiki',
+                               'Фу',
+                               'вар'
+                       ),
                );
        }
 
@@ -105,4 +135,3 @@ class WikiMapTest extends MediaWikiLangTestCase {
        }
 
 }
-
index 4fe2e85..bcef403 100644 (file)
@@ -20,31 +20,75 @@ class WikiReferenceTest extends PHPUnit_Framework_TestCase {
         * @dataProvider provideGetDisplayName
         */
        public function testGetDisplayName( $expected, $canonicalServer ) {
-               $reference = new WikiReference( 'wiki', 'xx', $canonicalServer, '/wiki/$1' );
+               $reference = new WikiReference( $canonicalServer, '/wiki/$1' );
                $this->assertEquals( $expected, $reference->getDisplayName() );
        }
 
        public function testGetCanonicalServer() {
-               $reference = new WikiReference( 'wiki', 'xx', 'https://acme.com', '/wiki/$1', '//acme.com' );
+               $reference = new WikiReference( 'https://acme.com', '/wiki/$1', '//acme.com' );
                $this->assertEquals( 'https://acme.com', $reference->getCanonicalServer() );
        }
 
        public function provideGetCanonicalUrl() {
                return array(
-                       'no fragement' => array( 'https://acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', null ),
-                       'empty fragement' => array( 'https://acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', '' ),
-                       'fragment' => array( 'https://acme.com/wiki/Foo#Bar', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', 'Bar' ),
-                       'double fragment' => array( 'https://acme.com/wiki/Foo#Bar%23Xus', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', 'Bar#Xus' ),
-                       'escaped fragement' => array( 'https://acme.com/wiki/Foo%23Bar', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo#Bar', null ),
-                       'empty path' => array( 'https://acme.com/Foo', 'https://acme.com', '//acme.com', '/$1', 'Foo', null ),
+                       'no fragment' => array(
+                               'https://acme.com/wiki/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               null
+                       ),
+                       'empty fragment' => array(
+                               'https://acme.com/wiki/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               ''
+                       ),
+                       'fragment' => array(
+                               'https://acme.com/wiki/Foo#Bar',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               'Bar'
+                       ),
+                       'double fragment' => array(
+                               'https://acme.com/wiki/Foo#Bar%23Xus',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               'Bar#Xus'
+                       ),
+                       'escaped fragment' => array(
+                               'https://acme.com/wiki/Foo%23Bar',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo#Bar',
+                               null
+                       ),
+                       'empty path' => array(
+                               'https://acme.com/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/$1',
+                               'Foo',
+                               null
+                       ),
                );
        }
 
        /**
         * @dataProvider provideGetCanonicalUrl
         */
-       public function testGetCanonicalUrl( $expected, $canonicalServer, $server, $path, $page, $fragmentId ) {
-               $reference = new WikiReference( 'wiki', 'xx', $canonicalServer, $path, $server );
+       public function testGetCanonicalUrl(
+               $expected, $canonicalServer, $server, $path, $page, $fragmentId
+       ) {
+               $reference = new WikiReference( $canonicalServer, $path, $server );
                $this->assertEquals( $expected, $reference->getCanonicalUrl( $page, $fragmentId ) );
        }
 
@@ -53,18 +97,60 @@ class WikiReferenceTest extends PHPUnit_Framework_TestCase {
         * @note getUrl is an alias for getCanonicalUrl
         */
        public function testGetUrl( $expected, $canonicalServer, $server, $path, $page, $fragmentId ) {
-               $reference = new WikiReference( 'wiki', 'xx', $canonicalServer, $path, $server );
+               $reference = new WikiReference( $canonicalServer, $path, $server );
                $this->assertEquals( $expected, $reference->getUrl( $page, $fragmentId ) );
        }
 
        public function provideGetFullUrl() {
                return array(
-                       'no fragement' => array( '//acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', null ),
-                       'empty fragement' => array( '//acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', '' ),
-                       'fragment' => array( '//acme.com/wiki/Foo#Bar', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', 'Bar' ),
-                       'double fragment' => array( '//acme.com/wiki/Foo#Bar%23Xus', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', 'Bar#Xus' ),
-                       'escaped fragement' => array( '//acme.com/wiki/Foo%23Bar', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo#Bar', null ),
-                       'empty path' => array( '//acme.com/Foo', 'https://acme.com', '//acme.com', '/$1', 'Foo', null ),
+                       'no fragment' => array(
+                               '//acme.com/wiki/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               null
+                       ),
+                       'empty fragment' => array(
+                               '//acme.com/wiki/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               ''
+                       ),
+                       'fragment' => array(
+                               '//acme.com/wiki/Foo#Bar',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               'Bar'
+                       ),
+                       'double fragment' => array(
+                               '//acme.com/wiki/Foo#Bar%23Xus',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               'Bar#Xus'
+                       ),
+                       'escaped fragment' => array(
+                               '//acme.com/wiki/Foo%23Bar',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo#Bar',
+                               null
+                       ),
+                       'empty path' => array(
+                               '//acme.com/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/$1',
+                               'Foo',
+                               null
+                       ),
                );
        }
 
@@ -72,9 +158,8 @@ class WikiReferenceTest extends PHPUnit_Framework_TestCase {
         * @dataProvider provideGetFullUrl
         */
        public function testGetFullUrl( $expected, $canonicalServer, $server, $path, $page, $fragmentId ) {
-               $reference = new WikiReference( 'wiki', 'xx', $canonicalServer, $path, $server );
+               $reference = new WikiReference( $canonicalServer, $path, $server );
                $this->assertEquals( $expected, $reference->getFullUrl( $page, $fragmentId ) );
        }
 
 }
-
index 3babb97..63e0c8e 100644 (file)
@@ -92,7 +92,7 @@ class ActionTest extends MediaWikiTestCase {
        }
 
        public function testGetActionName_editredlinkWorkaround() {
-               // See https://bugzilla.wikimedia.org/show_bug.cgi?id=20966
+               // See https://phabricator.wikimedia.org/T22966
                $context = $this->getContext( 'editredlink' );
                $actionName = Action::getActionName( $context );
 
@@ -100,7 +100,7 @@ class ActionTest extends MediaWikiTestCase {
        }
 
        public function testGetActionName_historysubmitWorkaround() {
-               // See https://bugzilla.wikimedia.org/show_bug.cgi?id=20966
+               // See https://phabricator.wikimedia.org/T22966
                $context = $this->getContext( 'historysubmit' );
                $actionName = Action::getActionName( $context );
 
@@ -108,7 +108,7 @@ class ActionTest extends MediaWikiTestCase {
        }
 
        public function testGetActionName_revisiondeleteWorkaround() {
-               // See https://bugzilla.wikimedia.org/show_bug.cgi?id=20966
+               // See https://phabricator.wikimedia.org/T22966
                $context = $this->getContext( 'historysubmit' );
                $context->getRequest()->setVal( 'revisiondelete', true );
                $actionName = Action::getActionName( $context );
index 575efd6..e0488b7 100644 (file)
@@ -30,11 +30,11 @@ class ApiBlockTest extends ApiTestCase {
 
        /**
         * This test has probably always been broken and use an invalid token
-        * Bug tracking brokenness is https://bugzilla.wikimedia.org/35646
+        * Bug tracking brokenness is https://phabricator.wikimedia.org/T37646
         *
         * Root cause is https://gerrit.wikimedia.org/r/3434
         * Which made the Block/Unblock API to actually verify the token
-        * previously always considered valid (bug 34212).
+        * previously always considered valid (T36212).
         */
        public function testMakeNormalBlock() {
                $tokens = $this->getTokens();
index 2edf0c6..30b679d 100644 (file)
@@ -168,13 +168,18 @@ class ApiContinuationManagerTest extends MediaWikiTestCase {
                        );
                }
 
-               $manager = self::getManager( '||mock2', array_slice( $allModules, 0, 2 ), array( 'mock1', 'mock2' ) );
+               $manager = self::getManager(
+                       '||mock2',
+                       array_slice( $allModules, 0, 2 ),
+                       array( 'mock1', 'mock2' )
+               );
                try {
                        $manager->addContinueParam( $allModules[1], 'm2continue', 1 );
                        $this->fail( 'Expected exception not thrown' );
                } catch ( UnexpectedValueException $ex ) {
                        $this->assertSame(
-                               'Module \'mock2\' was not supposed to have been executed, but it was executed anyway',
+                               'Module \'mock2\' was not supposed to have been executed, ' .
+                                       'but it was executed anyway',
                                $ex->getMessage(),
                                'Expected exception'
                        );
@@ -184,7 +189,8 @@ class ApiContinuationManagerTest extends MediaWikiTestCase {
                        $this->fail( 'Expected exception not thrown' );
                } catch ( UnexpectedValueException $ex ) {
                        $this->assertSame(
-                               'Module \'mocklist\' called ApiContinuationManager::addContinueParam but was not passed to ApiContinuationManager::__construct',
+                               'Module \'mocklist\' called ApiContinuationManager::addContinueParam ' .
+                                       'but was not passed to ApiContinuationManager::__construct',
                                $ex->getMessage(),
                                'Expected exception'
                        );
index 61a8ad1..4a90bf8 100644 (file)
@@ -106,22 +106,22 @@ class ApiEditPageTest extends ApiTestCase {
         */
        public static function provideEditAppend() {
                return array(
-                       array( #0: append
+                       array( # 0: append
                                'foo', 'append', 'bar', "foobar"
                        ),
-                       array( #1: prepend
+                       array( # 1: prepend
                                'foo', 'prepend', 'bar', "barfoo"
                        ),
-                       array( #2: append to empty page
+                       array( # 2: append to empty page
                                '', 'append', 'foo', "foo"
                        ),
-                       array( #3: prepend to empty page
+                       array( # 3: prepend to empty page
                                '', 'prepend', 'foo', "foo"
                        ),
-                       array( #4: append to non-existing page
+                       array( # 4: append to non-existing page
                                null, 'append', 'foo', "foo"
                        ),
-                       array( #5: prepend to non-existing page
+                       array( # 5: prepend to non-existing page
                                null, 'prepend', 'foo', "foo"
                        ),
                );
@@ -475,7 +475,8 @@ class ApiEditPageTest extends ApiTestCase {
        public function testCheckDirectApiEditingDisallowed_forNonTextContent() {
                $this->setExpectedException(
                        'UsageException',
-                       'Direct editing via API is not supported for content model testing used by Dummy:ApiEditPageTest_nonTextPageEdit'
+                       'Direct editing via API is not supported for content model ' .
+                               'testing used by Dummy:ApiEditPageTest_nonTextPageEdit'
                );
 
                $this->doApiRequestWithToken( array(
index 8ebdf60..3e5f355 100644 (file)
@@ -130,13 +130,21 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                                array(
                                        'errors' => array(
                                                'err' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
                                                        $I => 'error',
                                                ),
                                        ),
                                        'warnings' => array(
                                                'string' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                        ),
@@ -144,24 +152,44 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                                array(
                                        'errors' => array(
                                                'errWithData' => array(
-                                                       array( 'code' => 'overriddenCode', 'message' => 'mainpage', 'params' => array( $I => 'param' ),
-                                                               'overriddenData' => true ),
+                                                       array(
+                                                               'code' => 'overriddenCode',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' ),
+                                                               'overriddenData' => true
+                                                       ),
                                                        $I => 'error',
                                                ),
                                        ),
                                        'warnings' => array(
                                                'messageWithData' => array(
-                                                       array( 'code' => 'overriddenCode', 'message' => 'mainpage', 'params' => array( $I => 'param' ),
-                                                               'overriddenData' => true ),
+                                                       array(
+                                                               'code' => 'overriddenCode',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' ),
+                                                               'overriddenData' => true
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                                'message' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                                'foo' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                                                       array( 'code' => 'parentheses', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
+                                                       array(
+                                                               'code' => 'parentheses',
+                                                               'message' => 'parentheses',
+                                                               'params' => array( 'foobar', $I => 'param' )
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                        ),
@@ -169,17 +197,37 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                                array(
                                        'errors' => array(
                                                'status' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                                                       array( 'code' => 'parentheses', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
+                                                       array(
+                                                               'code' => 'parentheses',
+                                                               'message' => 'parentheses',
+                                                               'params' => array( 'foobar', $I => 'param' )
+                                                       ),
                                                        $I => 'error',
                                                ),
                                        ),
                                        'warnings' => array(
                                                'status' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                                                       array( 'code' => 'parentheses', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
-                                                       array( 'code' => 'overriddenCode', 'message' => 'mainpage', 'params' => array( $I => 'param' ),
-                                                               'overriddenData' => true ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
+                                                       array(
+                                                               'code' => 'parentheses',
+                                                               'message' => 'parentheses',
+                                                               'params' => array( 'foobar', $I => 'param' )
+                                                       ),
+                                                       array(
+                                                               'code' => 'overriddenCode',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' ),
+                                                               'overriddenData' => true
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                        ),
@@ -328,8 +376,16 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                $I = ApiResult::META_INDEXED_TAG_NAME;
                $this->assertSame(
                        array(
-                               array( 'type' => 'error', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                               array( 'type' => 'error', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                               array(
+                                       'type' => 'error',
+                                       'message' => 'mainpage',
+                                       'params' => array( $I => 'param' )
+                               ),
+                               array(
+                                       'type' => 'error',
+                                       'message' => 'parentheses',
+                                       'params' => array( 'foobar', $I => 'param' )
+                               ),
                                $I => 'error',
                        ),
                        $formatter->arrayFromStatus( $status, 'error' ),
@@ -337,10 +393,26 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                );
                $this->assertSame(
                        array(
-                               array( 'type' => 'warning', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                               array( 'type' => 'warning', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
-                               array( 'message' => 'mainpage', 'params' => array( $I => 'param' ), 'type' => 'warning' ),
-                               array( 'message' => 'mainpage', 'params' => array( $I => 'param' ), 'type' => 'warning' ),
+                               array(
+                                       'type' => 'warning',
+                                       'message' => 'mainpage',
+                                       'params' => array( $I => 'param' )
+                               ),
+                               array(
+                                       'type' => 'warning',
+                                       'message' => 'parentheses',
+                                       'params' => array( 'foobar', $I => 'param' )
+                               ),
+                               array(
+                                       'message' => 'mainpage',
+                                       'params' => array( $I => 'param' ),
+                                       'type' => 'warning'
+                               ),
+                               array(
+                                       'message' => 'mainpage',
+                                       'params' => array( $I => 'param' ),
+                                       'type' => 'warning'
+                               ),
                                $I => 'warning',
                        ),
                        $formatter->arrayFromStatus( $status, 'warning' ),
index 94b741d..aef4815 100644 (file)
@@ -90,7 +90,9 @@ class ApiMainTest extends ApiTestCase {
         * @param int $status Expected response status
         * @param bool $post Request is a POST
         */
-       public function testCheckConditionalRequestHeaders( $headers, $conditions, $status, $post = false ) {
+       public function testCheckConditionalRequestHeaders(
+               $headers, $conditions, $status, $post = false
+       ) {
                $request = new FauxRequest( array( 'action' => 'query', 'meta' => 'siteinfo' ), $post );
                $request->setHeaders( $headers );
                $request->response()->statusHeader( 200 ); // Why doesn't it default?
@@ -186,7 +188,9 @@ class ApiMainTest extends ApiTestCase {
         * @param bool $isError $isError flag
         * @param bool $post Request is a POST
         */
-       public function testConditionalRequestHeadersOutput( $conditions, $headers, $isError = false, $post = false ) {
+       public function testConditionalRequestHeadersOutput(
+               $conditions, $headers, $isError = false, $post = false
+       ) {
                $request = new FauxRequest( array( 'action' => 'query', 'meta' => 'siteinfo' ), $post );
                $response = $request->response();
 
index dab81e1..5e74f13 100644 (file)
@@ -307,12 +307,24 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $moduleManager->addModules( $fooModules, 'foo' );
                $moduleManager->addModules( $barModules, 'bar' );
 
-               $this->assertEquals( 'ApiLogin', $moduleManager->getClassName( 'login' ) );
-               $this->assertEquals( 'ApiLogout', $moduleManager->getClassName( 'logout' ) );
-               $this->assertEquals( 'ApiFeedContributions', $moduleManager->getClassName( 'feedcontributions' ) );
-               $this->assertEquals( 'ApiFeedRecentChanges', $moduleManager->getClassName( 'feedrecentchanges' ) );
-               $this->assertFalse( $moduleManager->getClassName( 'nonexistentmodule' ) );
+               $this->assertEquals(
+                       'ApiLogin',
+                       $moduleManager->getClassName( 'login' )
+               );
+               $this->assertEquals(
+                       'ApiLogout',
+                       $moduleManager->getClassName( 'logout' )
+               );
+               $this->assertEquals(
+                       'ApiFeedContributions',
+                       $moduleManager->getClassName( 'feedcontributions' )
+               );
+               $this->assertEquals(
+                       'ApiFeedRecentChanges',
+                       $moduleManager->getClassName( 'feedrecentchanges' )
+               );
+               $this->assertFalse(
+                       $moduleManager->getClassName( 'nonexistentmodule' )
+               );
        }
-
-
 }
index 2f31677..d43db71 100644 (file)
@@ -973,7 +973,12 @@ class ApiResultTest extends MediaWikiTestCase {
                                        'kvpmerge' => array(
                                                $kvp( 'name', 'x', 'value', 'a' ),
                                                $kvp( 'name', 'y', 'value', array( 'b', ApiResult::META_TYPE => 'array' ) ),
-                                               array( 'name' => 'z', 'c' => 'd', ApiResult::META_TYPE => 'assoc', ApiResult::META_PRESERVE_KEYS => array( 'name' ) ),
+                                               array(
+                                                       'name' => 'z',
+                                                       'c' => 'd',
+                                                       ApiResult::META_TYPE => 'assoc',
+                                                       ApiResult::META_PRESERVE_KEYS => array( 'name' )
+                                               ),
                                                ApiResult::META_TYPE => 'array',
                                                ApiResult::META_KVP_MERGE => true,
                                        ),
@@ -1011,7 +1016,11 @@ class ApiResultTest extends MediaWikiTestCase {
                                        'kvpmerge' => array(
                                                $kvp( 'name', 'x', '*', 'a' ),
                                                $kvp( 'name', 'y', '*', array( 'b', ApiResult::META_TYPE => 'array' ) ),
-                                               array( 'name' => 'z', 'c' => 'd', ApiResult::META_TYPE => 'assoc', ApiResult::META_PRESERVE_KEYS => array( 'name' ) ),
+                                               array(
+                                                       'name' => 'z',
+                                                       'c' => 'd',
+                                                       ApiResult::META_TYPE => 'assoc',
+                                                       ApiResult::META_PRESERVE_KEYS => array( 'name' ) ),
                                                ApiResult::META_TYPE => 'array',
                                                ApiResult::META_KVP_MERGE => true,
                                        ),
@@ -1053,7 +1062,12 @@ class ApiResultTest extends MediaWikiTestCase {
                                        'kvpmerge' => array(
                                                (object)$kvp( 'name', 'x', 'value', 'a' ),
                                                (object)$kvp( 'name', 'y', 'value', array( 'b', ApiResult::META_TYPE => 'array' ) ),
-                                               (object)array( 'name' => 'z', 'c' => 'd', ApiResult::META_TYPE => 'assoc', ApiResult::META_PRESERVE_KEYS => array( 'name' ) ),
+                                               (object)array(
+                                                       'name' => 'z',
+                                                       'c' => 'd',
+                                                       ApiResult::META_TYPE => 'assoc',
+                                                       ApiResult::META_PRESERVE_KEYS => array( 'name' )
+                                               ),
                                                ApiResult::META_TYPE => 'array',
                                                ApiResult::META_KVP_MERGE => true,
                                        ),
index 362d647..575859b 100644 (file)
@@ -14,12 +14,16 @@ class ApiRevisionDeleteTest extends ApiTestCase {
 
        protected function setUp() {
                // Needs to be before setup since this gets cached
-               $this->mergeMwGlobalArrayValue( 'wgGroupPermissions', array( 'sysop' => array( 'deleterevision' => true ) ) );
+               $this->mergeMwGlobalArrayValue(
+                       'wgGroupPermissions',
+                       array( 'sysop' => array( 'deleterevision' => true ) )
+               );
                parent::setUp();
                // Make a few edits for us to play with
                for ( $i = 1; $i <= 5; $i++ ) {
                        self::editPage( self::$page, MWCryptRand::generateHex( 10 ), 'summary' );
-                       $this->revs[] = Title::newFromText( self::$page )->getLatestRevID( Title::GAID_FOR_UPDATE );
+                       $this->revs[] = Title::newFromText( self::$page )
+                               ->getLatestRevID( Title::GAID_FOR_UPDATE );
                }
 
        }
index c852d72..40de254 100644 (file)
@@ -11,7 +11,7 @@
  * @todo Port the other Upload tests, and other API tests to this framework
  *
  * @todo Broken test, reports false errors from time to time.
- * See https://bugzilla.wikimedia.org/26169
+ * See https://phabricator.wikimedia.org/T28169
  *
  * @todo This is pretty sucky... needs to be prettified.
  *
index e49c6c0..dc86b22 100644 (file)
@@ -98,7 +98,7 @@ class ApiWatchTest extends ApiTestCase {
                $this->getTokens();
 
                if ( !Title::newFromText( 'Help:UTPage' )->exists() ) {
-                       $this->markTestSkipped( "The article [[Help:UTPage]] does not exist" ); //TODO: just create it?
+                       $this->markTestSkipped( "The article [[Help:UTPage]] does not exist" ); // TODO: just create it?
                }
 
                $data = $this->doApiRequest( array(
index 3fcfc73..addd16a 100644 (file)
@@ -29,18 +29,55 @@ class ApiFormatDbgTest extends ApiFormatTestBase {
                        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)" ),
+                       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' ),
index 3dfcaf0..f7ffcb9 100644 (file)
@@ -44,8 +44,14 @@ class ApiFormatJsonTest extends ApiFormatTestBase {
                                array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '[{"0":1}]' ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '[[1]]' ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), '[{"x":1}]' ),
-                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
-                                       '[[{"key":"x","*":1}]]' ),
+                               array(
+                                       array( array(
+                                               'x' => 1,
+                                               ApiResult::META_TYPE => 'BCkvp',
+                                               ApiResult::META_KVP_KEY_NAME => 'key'
+                                       ) ),
+                                       '[[{"key":"x","*":1}]]'
+                               ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '[{"x":1}]' ),
                                array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '[["a","b"]]' ),
 
@@ -85,10 +91,23 @@ class ApiFormatJsonTest extends ApiFormatTestBase {
                                array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '[{"0":1}]' ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '[[1]]' ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), '[{"x":1}]' ),
-                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
-                                       '[{"x":1}]' ),
+                               array(
+                                       array( array(
+                                               'x' => 1,
+                                               ApiResult::META_TYPE => 'BCkvp',
+                                               ApiResult::META_KVP_KEY_NAME => 'key'
+                                       ) ),
+                                       '[{"x":1}]'
+                               ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '[[1]]' ),
-                               array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '[{"0":"a","1":"b"}]' ),
+                               array(
+                                       array( array(
+                                               'a',
+                                               'b',
+                                               ApiResult::META_TYPE => 'BCassoc'
+                                       ) ),
+                                       '[{"0":"a","1":"b"}]'
+                               ),
 
                                // Content
                                array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
index 8f81a41..c0192bc 100644 (file)
@@ -29,7 +29,14 @@ class ApiFormatNoneTest extends ApiFormatTestBase {
                        array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '' ),
                        array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '' ),
                        array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), '' ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ), '' ),
+                       array(
+                               array( array(
+                                       'x' => 1,
+                                       ApiResult::META_TYPE => 'BCkvp',
+                                       ApiResult::META_KVP_KEY_NAME => 'key'
+                               ) ),
+                               ''
+                       ),
                        array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '' ),
                        array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '' ),
 
index 0cb44e9..fd06ad0 100644 (file)
@@ -20,6 +20,7 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
        }
 
        public static function provideGeneralEncoding() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array_merge(
                        self::addFormatVersion( 1, array(
                                // Basic types
@@ -96,6 +97,7 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
                                        'a:1:{s:3:"foo";s:3:"foo";}' ),
                        ) )
                );
+               // @codingStandardsIgnoreEnd
        }
 
        public function testCrossDomainMangling() {
@@ -134,7 +136,8 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
                } catch ( UsageException $ex ) {
                        ob_end_clean();
                        $this->assertSame(
-                               'This response cannot be represented using format=php. See https://bugzilla.wikimedia.org/show_bug.cgi?id=66776',
+                               'This response cannot be represented using format=php. ' .
+                                       'See https://phabricator.wikimedia.org/T68776',
                                $ex->getMessage(),
                                'Expected exception'
                        );
index b0a2a96..c779a3c 100644 (file)
@@ -9,6 +9,7 @@ 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";
@@ -50,6 +51,7 @@ class ApiFormatTxtTest extends ApiFormatTestBase {
                        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 7babaed..0b7ae35 100644 (file)
@@ -12,9 +12,11 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
        public static function setUpBeforeClass() {
                parent::setUpBeforeClass();
                $page = WikiPage::factory( Title::newFromText( 'MediaWiki:ApiFormatXmlTest.xsl' ) );
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                $page->doEditContent( new WikitextContent(
                        '<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" />'
                ), 'Summary' );
+               // @codingStandardsIgnoreEnd
                $page = WikiPage::factory( Title::newFromText( 'MediaWiki:ApiFormatXmlTest' ) );
                $page->doEditContent( new WikitextContent( 'Bogus' ), 'Summary' );
                $page = WikiPage::factory( Title::newFromText( 'ApiFormatXmlTest' ) );
@@ -22,6 +24,7 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
        }
 
        public static function provideGeneralEncoding() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Basic types
                        array( array( null, 'a' => null ), '<?xml version="1.0"?><api><_v _idx="0" /></api>' ),
@@ -114,6 +117,7 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
                                        '" type="text/xsl" ?><api />',
                                array( 'xslt' => 'MediaWiki:ApiFormatXmlTest.xsl' ) ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
 }
index db61bc8..9e8f9ab 100644 (file)
@@ -57,10 +57,6 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                } else {
                        $params['action'] = 'query';
                }
-               // Silence warning
-               if ( !isset( $params['continue'] ) ) {
-                       $params['continue'] = '';
-               }
                $count = 0;
                $result = array();
                $continue = array();
@@ -74,7 +70,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                                return strcmp( $a, $b );
                        } );
                        $reqStr = http_build_query( $request );
-                       //$reqStr = str_replace( '&', ' & ', $reqStr );
+                       // $reqStr = str_replace( '&', ' & ', $reqStr );
                        $this->assertLessThan( $expectedCount, $count, "$id more data: $reqStr" );
                        if ( $this->mVerbose ) {
                                print "$id (#$count): $reqStr\n";
index d5fa454..25d1efc 100644 (file)
@@ -100,10 +100,6 @@ STR;
                if ( !array_key_exists( 'action', $req ) ) {
                        $req['action'] = 'query';
                }
-               // Silence warning
-               if ( !isset( $params['continue'] ) ) {
-                       $params['continue'] = '';
-               }
                foreach ( $req as &$val ) {
                        if ( is_array( $val ) ) {
                                $val = implode( '|', array_unique( $val ) );
index 04fb00d..6b22000 100644 (file)
@@ -7,7 +7,7 @@
 class GenderCacheTest extends MediaWikiLangTestCase {
 
        function addDBData() {
-               //ensure the correct default gender
+               // ensure the correct default gender
                $this->mergeMwGlobalArrayValue( 'wgDefaultUserOptions', array( 'gender' => 'unknown' ) );
 
                $user = User::newFromName( 'UTMale' );
@@ -15,7 +15,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                        $user->addToDatabase();
                        $user->setPassword( 'UTMalePassword' );
                }
-               //ensure the right gender
+               // ensure the right gender
                $user->setOption( 'gender', 'male' );
                $user->saveSettings();
 
@@ -24,7 +24,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                        $user->addToDatabase();
                        $user->setPassword( 'UTFemalePassword' );
                }
-               //ensure the right gender
+               // ensure the right gender
                $user->setOption( 'gender', 'female' );
                $user->saveSettings();
 
@@ -33,7 +33,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                        $user->addToDatabase();
                        $user->setPassword( 'UTDefaultGenderPassword' );
                }
-               //ensure the default gender
+               // ensure the default gender
                $user->setOption( 'gender', null );
                $user->saveSettings();
        }
@@ -69,7 +69,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                        array( 'UTFemale', 'female' ),
                        array( 'UTDefaultGender', 'unknown' ),
                        array( 'UTNotExist', 'unknown' ),
-                       //some not valid user
+                       // some not valid user
                        array( '127.0.0.1', 'unknown' ),
                        array( 'user@test', 'unknown' ),
                );
diff --git a/tests/phpunit/includes/changes/CategoryMembershipChangeTest.php b/tests/phpunit/includes/changes/CategoryMembershipChangeTest.php
new file mode 100644 (file)
index 0000000..2622ad4
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * @covers CategoryMembershipChange
+ *
+ * @group Database
+ *
+ * @author Adam Shorland
+ */
+class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var array|Title[]|User[]
+        */
+       private static $lastNotifyArgs;
+
+       /**
+        * @var int
+        */
+       private static $notifyCallCounter = 0;
+
+       /**
+        * @var RecentChange
+        */
+       private static $mockRecentChange;
+
+       public static function newForCategorizationCallback() {
+               self::$lastNotifyArgs = func_get_args();
+               self::$notifyCallCounter += 1;
+               return self::$mockRecentChange;
+       }
+
+       public function setUp() {
+               parent::setUp();
+               self::$notifyCallCounter = 0;
+               self::$mockRecentChange = self::getMock( 'RecentChange' );
+       }
+
+       private function newChange( Revision $revision = null ) {
+               $change = new CategoryMembershipChange( Title::newFromText( 'UTPage' ), $revision );
+               $change->overrideNewForCategorizationCallback(
+                       'CategoryMembershipChangeTest::newForCategorizationCallback'
+               );
+
+               return $change;
+       }
+
+       public function testChangeAddedNoRev() {
+               $change = $this->newChange();
+               $change->triggerCategoryAddedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
+
+               $this->assertEquals( 1, self::$notifyCallCounter );
+
+               $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
+               $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
+               $this->assertEquals( 'MediaWiki automatic change', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '[[:UTPage]] added to category', self::$lastNotifyArgs[3] );
+               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[6] );
+               $this->assertEquals( null, self::$lastNotifyArgs[7] );
+               $this->assertEquals( 1, self::$lastNotifyArgs[8] );
+               $this->assertEquals( null, self::$lastNotifyArgs[9] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+       }
+
+       public function testChangeRemovedNoRev() {
+               $change = $this->newChange();
+               $change->triggerCategoryRemovedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
+
+               $this->assertEquals( 1, self::$notifyCallCounter );
+
+               $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
+               $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
+               $this->assertEquals( 'MediaWiki automatic change', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '[[:UTPage]] removed from category', self::$lastNotifyArgs[3] );
+               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[6] );
+               $this->assertEquals( null, self::$lastNotifyArgs[7] );
+               $this->assertEquals( 1, self::$lastNotifyArgs[8] );
+               $this->assertEquals( null, self::$lastNotifyArgs[9] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+       }
+
+       public function testChangeAddedWithRev() {
+               $revision = Revision::newFromId( Title::newFromText( 'UTPage' )->getLatestRevID() );
+               $change = $this->newChange( $revision );
+               $change->triggerCategoryAddedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
+
+               $this->assertEquals( 1, self::$notifyCallCounter );
+
+               $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
+               $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
+               $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '[[:UTPage]] added to category', self::$lastNotifyArgs[3] );
+               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
+               $this->assertEquals( null, self::$lastNotifyArgs[7] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[8] );
+               $this->assertEquals( '127.0.0.1', self::$lastNotifyArgs[9] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+       }
+
+       public function testChangeRemovedWithRev() {
+               $revision = Revision::newFromId( Title::newFromText( 'UTPage' )->getLatestRevID() );
+               $change = $this->newChange( $revision );
+               $change->triggerCategoryRemovedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
+
+               $this->assertEquals( 1, self::$notifyCallCounter );
+
+               $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
+               $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
+               $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '[[:UTPage]] removed from category', self::$lastNotifyArgs[3] );
+               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
+               $this->assertEquals( null, self::$lastNotifyArgs[7] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[8] );
+               $this->assertEquals( '127.0.0.1', self::$lastNotifyArgs[9] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+       }
+
+}
index 4d1a936..85dbe79 100644 (file)
@@ -41,44 +41,6 @@ class RecentChangeTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $rc->getAttributes() );
        }
 
-       /**
-        * The testIrcMsgForAction* tests are supposed to cover the hacky
-        * LogFormatter::getIRCActionText / bug 34508
-        *
-        * Third parties bots listen to those messages. They are clever enough
-        * to fetch the i18n messages from the wiki and then analyze the IRC feed
-        * to reverse engineer the $1, $2 messages.
-        * One thing bots can not detect is when MediaWiki change the meaning of
-        * a message like what happened when we deployed 1.19. $1 became the user
-        * performing the action which broke basically all bots around.
-        *
-        * Should cover the following log actions (which are most commonly used by bots):
-        * - block/block
-        * - block/unblock
-        * - block/reblock
-        * - delete/delete
-        * - delete/restore
-        * - newusers/create
-        * - newusers/create2
-        * - newusers/autocreate
-        * - move/move
-        * - move/move_redir
-        * - protect/protect
-        * - protect/modifyprotect
-        * - protect/unprotect
-        * - protect/move_prot
-        * - upload/upload
-        * - merge/merge
-        * - import/upload
-        * - import/interwiki
-        *
-        * As well as the following Auto Edit Summaries:
-        * - blank
-        * - replace
-        * - rollback
-        * - undo
-        */
-
        /**
         * @covers RecentChange::parseParams
         */
@@ -152,6 +114,7 @@ class RecentChangeTest extends MediaWikiTestCase {
                        array( RC_NEW, 'new' ),
                        array( RC_LOG, 'log' ),
                        array( RC_EXTERNAL, 'external' ),
+                       array( RC_CATEGORIZE, 'categorize' ),
                );
        }
 
index 2506087..fe5bdd2 100644 (file)
@@ -25,8 +25,8 @@ class TestRecentChangesHelper {
                return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
        }
 
-       public function makeLogRecentChange( $logType, $logAction, User $user, $titleText, $timestamp, $counter,
-               $watchingUsers
+       public function makeLogRecentChange(
+               $logType, $logAction, User $user, $titleText, $timestamp, $counter, $watchingUsers
        ) {
                $attribs = array_merge(
                        $this->getDefaultAttributes( $titleText, $timestamp ),
index e1785a9..58735bc 100644 (file)
@@ -21,10 +21,12 @@ class CssContentHandlerTest extends MediaWikiTestCase {
         * Keep this in sync with CssContentTest::provideGetRedirectTarget()
         */
        public static function provideMakeRedirectContent() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array( 'MediaWiki:MonoBook.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=MediaWiki:MonoBook.css&action=raw&ctype=text/css);" ),
                        array( 'User:FooBar/common.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=User:FooBar/common.css&action=raw&ctype=text/css);" ),
                        array( 'Gadget:FooBaz.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
index c4d87c2..24b0c68 100644 (file)
@@ -100,6 +100,7 @@ class CssContentTest extends JavaScriptContentTest {
         * Keep this in sync with CssContentHandlerTest::provideMakeRedirectContent()
         */
        public static function provideGetRedirectTarget() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array( 'MediaWiki:MonoBook.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=MediaWiki:MonoBook.css&action=raw&ctype=text/css);" ),
                        array( 'User:FooBar/common.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=User:FooBar/common.css&action=raw&ctype=text/css);" ),
@@ -109,9 +110,10 @@ class CssContentTest extends JavaScriptContentTest {
                        # Wrong domain
                        array( null, "/* #REDIRECT */@import url(//example.com/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
-               public static function dataEquals() {
+       public static function dataEquals() {
                return array(
                        array( new CssContent( 'hallo' ), null, false ),
                        array( new CssContent( 'hallo' ), new CssContent( 'hallo' ), true ),
index 0f41020..69fc9af 100644 (file)
@@ -21,10 +21,12 @@ class JavaScriptContentHandlerTest extends MediaWikiTestCase {
         * Keep this in sync with JavaScriptContentTest::provideGetRedirectTarget()
         */
        public static function provideMakeRedirectContent() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array( 'MediaWiki:MonoBook.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");' ),
                        array( 'User:FooBar/common.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=User:FooBar/common.js\u0026action=raw\u0026ctype=text/javascript");' ),
                        array( 'Gadget:FooBaz.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=Gadget:FooBaz.js\u0026action=raw\u0026ctype=text/javascript");' ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
index 0ee2712..b97842c 100644 (file)
@@ -116,10 +116,12 @@ class JavaScriptContentTest extends TextContentTest {
 
        public static function dataPreloadTransform() {
                return array(
-                       array( 'hello this is ~~~',
+                       array(
+                               'hello this is ~~~',
                                'hello this is ~~~',
                        ),
-                       array( 'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
+                       array(
+                               'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
                                'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
                        ),
                );
@@ -253,7 +255,7 @@ class JavaScriptContentTest extends TextContentTest {
         * @covers JavaScriptContent::updateRedirect
         * @dataProvider provideUpdateRedirect
         */
-       public function testUpdateRedirect( $oldText, $expectedText) {
+       public function testUpdateRedirect( $oldText, $expectedText ) {
                $this->setMwGlobals( array(
                        'wgServer' => '//example.org',
                        'wgScriptPath' => '/w/index.php',
@@ -272,10 +274,13 @@ class JavaScriptContentTest extends TextContentTest {
                                '#REDIRECT [[Someplace]]',
                                '#REDIRECT [[Someplace]]',
                        ),
+
+                       // @codingStandardsIgnoreStart Generic.Files.LineLength
                        array(
                                '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");',
                                '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=TestUpdateRedirect_target\u0026action=raw\u0026ctype=text/javascript");'
                        )
+                       // @codingStandardsIgnoreEnd
                );
        }
 
@@ -323,6 +328,7 @@ class JavaScriptContentTest extends TextContentTest {
         * Keep this in sync with JavaScriptContentHandlerTest::provideMakeRedirectContent()
         */
        public static function provideGetRedirectTarget() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array( 'MediaWiki:MonoBook.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");' ),
                        array( 'User:FooBar/common.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=User:FooBar/common.js\u0026action=raw\u0026ctype=text/javascript");' ),
@@ -332,5 +338,6 @@ class JavaScriptContentTest extends TextContentTest {
                        // Different domain
                        array( null, '/* #REDIRECT */mw.loader.load("//example.com/w/index.php?title=MediaWiki:OtherWiki.js\u0026action=raw\u0026ctype=text/javascript");' ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
index fe26375..06609d8 100644 (file)
@@ -93,12 +93,12 @@ class TextContentTest extends MediaWikiLangTestCase {
        public static function dataPreSaveTransform() {
                return array(
                        array(
-                               #0: no signature resolution
+                               # 0: no signature resolution
                                'hello this is ~~~',
                                'hello this is ~~~',
                        ),
                        array(
-                               #1: rtrim
+                               # 1: rtrim
                                " Foo \n ",
                                ' Foo',
                        ),
@@ -421,7 +421,7 @@ class TextContentTest extends MediaWikiLangTestCase {
                        $update = $updates[$class];
 
                        foreach ( $fieldValues as $field => $value ) {
-                               $v = $update->$field; #if the field doesn't exist, just crash and burn
+                               $v = $update->$field; # if the field doesn't exist, just crash and burn
                                $this->assertEquals( $value, $v, "unexpected value for field $field in instance of $class" );
                        }
                }
index 7becd6f..f0d486a 100644 (file)
@@ -89,8 +89,12 @@ more stuff
                        $update = $updates[$class];
 
                        foreach ( $fieldValues as $field => $value ) {
-                               $v = $update->$field; #if the field doesn't exist, just crash and burn
-                               $this->assertEquals( $value, $v, "unexpected value for field $field in instance of $class" );
+                               $v = $update->$field; # if the field doesn't exist, just crash and burn
+                               $this->assertEquals(
+                                       $value,
+                                       $v,
+                                       "unexpected value for field $field in instance of $class"
+                               );
                        }
                }
 
@@ -208,10 +212,12 @@ just a test"
 
        public static function dataPreloadTransform() {
                return array(
-                       array( 'hello this is ~~~',
+                       array(
+                               'hello this is ~~~',
                                "hello this is ~~~",
                        ),
-                       array( 'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
+                       array(
+                               'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
                                'hello \'\'this\'\' is bar',
                        ),
                );
@@ -318,7 +324,10 @@ just a test"
                $this->assertTrue( $content->matchMagicWord( $mw ), "should have matched magic word" );
 
                $content = $this->newContent( "#REDIRECT [[FOO]]" );
-               $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word" );
+               $this->assertFalse(
+                       $content->matchMagicWord( $mw ),
+                       "should not have matched magic word"
+               );
        }
 
        /**
@@ -340,7 +349,10 @@ just a test"
                $this->assertFalse( $content->equals( $newContent ), "content should have changed" );
                $this->assertTrue( $newContent->isRedirect(), "new content should be a redirect" );
 
-               $this->assertEquals( $target->getFullText(), $newContent->getRedirectTarget()->getFullText() );
+               $this->assertEquals(
+                       $target->getFullText(),
+                       $newContent->getRedirectTarget()->getFullText()
+               );
        }
 
        /**
@@ -394,15 +406,28 @@ just a test"
                // Test with a redirect page
                $wikitext = false;
                $redirectTarget = false;
-               $content = $this->newContent( "#REDIRECT [[TestRedirectParserOption/redir]]\nhello redirect." );
+               $content = $this->newContent(
+                       "#REDIRECT [[TestRedirectParserOption/redir]]\nhello redirect."
+               );
                $options = $content->getContentHandler()->makeParserOptions( 'canonical' );
                $content->getParserOutput( $title, null, $options );
-               $this->assertEquals( 'hello redirect.', $wikitext, 'Wikitext passed to hook was not as expected' );
-               $this->assertNotEquals( null, $redirectTarget, 'Redirect seen in hook was null' );
-               $this->assertEquals( 'TestRedirectParserOption/redir', $redirectTarget->getFullText(),
+               $this->assertEquals(
+                       'hello redirect.',
+                       $wikitext,
+                       'Wikitext passed to hook was not as expected'
+               );
+               $this->assertNotEquals(
+                       null,
+                       $redirectTarget,
+                       'Redirect seen in hook was null' );
+               $this->assertEquals(
+                       'TestRedirectParserOption/redir',
+                       $redirectTarget->getFullText(),
                        'Redirect seen in hook was not the expected title'
                );
-               $this->assertEquals( null, $options->getRedirectTarget(),
+               $this->assertEquals(
+                       null,
+                       $options->getRedirectTarget(),
                        'ParserOptions\' redirectTarget was changed'
                );
        }
index 42ea58e..8c09471 100644 (file)
@@ -79,6 +79,10 @@ class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
        protected function mysqlPing() {
        }
 
+       protected function mysqlRealEscapeString( $s ) {
+
+       }
+
        // From interface DatabaseType
        function insertId() {
        }
index 3db9172..0db7af9 100644 (file)
@@ -295,7 +295,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
                // Versions tested
                $versions = array(
-                       //'1.13', disabled for now, was totally screwed up
+                       // '1.13', disabled for now, was totally screwed up
                        // SQLite wasn't included in 1.14
                        '1.15',
                        '1.16',
@@ -482,4 +482,12 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
                $this->assertTrue( $db->close(), "closing database" );
        }
+
+       public function testToString() {
+               $db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
+
+               $toString = (string)$db;
+
+               $this->assertContains( 'SQLite ', $toString );
+       }
 }
index 81d6840..cb2d7db 100644 (file)
@@ -57,4 +57,93 @@ class LBFactoryTest extends MediaWikiTestCase {
                        array( 'LBFactoryFake', 'LBFactory_Fake' ),
                );
        }
+
+       public function testLBFactorySimpleServer() {
+               $this->setMwGlobals( 'wgDBservers', false );
+
+               $factory = new LBFactorySimple( array() );
+               $lb = $factory->getMainLB();
+
+               $dbw = $lb->getConnection( DB_MASTER );
+               $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
+
+               $dbr = $lb->getConnection( DB_SLAVE );
+               $this->assertTrue( $dbr->getLBInfo( 'master' ), 'DB_SLAVE also gets the master' );
+
+               $factory->shutdown();
+               $lb->closeAll();
+       }
+
+       public function testLBFactorySimpleServers() {
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+
+               $this->setMwGlobals( 'wgDBservers', array(
+                       array( // master
+                               'host'          => $wgDBserver,
+                               'dbname'    => $wgDBname,
+                               'user'          => $wgDBuser,
+                               'password'      => $wgDBpassword,
+                               'type'          => $wgDBtype,
+                               'load'      => 0,
+                               'flags'     => DBO_TRX // REPEATABLE-READ for consistency
+                       ),
+                       array( // emulated slave
+                               'host'          => $wgDBserver,
+                               'dbname'    => $wgDBname,
+                               'user'          => $wgDBuser,
+                               'password'      => $wgDBpassword,
+                               'type'          => $wgDBtype,
+                               'load'      => 100,
+                               'flags'     => DBO_TRX // REPEATABLE-READ for consistency
+                       )
+               ) );
+
+               $factory = new LBFactorySimple( array( 'loadMonitorClass' => 'LoadMonitorNull' ) );
+               $lb = $factory->getMainLB();
+
+               $dbw = $lb->getConnection( DB_MASTER );
+               $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
+
+               $dbr = $lb->getConnection( DB_SLAVE );
+               $this->assertTrue( $dbr->getLBInfo( 'slave' ), 'slave shows as slave' );
+
+               $factory->shutdown();
+               $lb->closeAll();
+       }
+
+       public function testLBFactoryMulti() {
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+
+               $factory = new LBFactoryMulti( array(
+                       'sectionsByDB' => array(),
+                       'sectionLoads' => array(
+                               'DEFAULT' => array(
+                                       'test-db1' => 0,
+                                       'test-db2' => 100,
+                               ),
+                       ),
+                       'serverTemplate' => array(
+                               'dbname'          => $wgDBname,
+                               'user'            => $wgDBuser,
+                               'password'        => $wgDBpassword,
+                               'type'            => $wgDBtype,
+                               'flags'           => DBO_DEFAULT
+                       ),
+                       'hostsByName' => array(
+                               'test-db1'  => $wgDBserver,
+                               'test-db2'  => $wgDBserver
+                       ),
+                       'loadMonitorClass' => 'LoadMonitorNull'
+               ) );
+               $lb = $factory->getMainLB();
+
+               $dbw = $lb->getConnection( DB_MASTER );
+               $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
+
+               $dbr = $lb->getConnection( DB_SLAVE );
+               $this->assertTrue( $dbr->getLBInfo( 'slave' ), 'slave shows as slave' );
+
+               $factory->shutdown();
+               $lb->closeAll();
+       }
 }
index 5cbb247..b0df616 100644 (file)
@@ -25,7 +25,7 @@ use PHPUnit_Framework_Error_Notice;
 
 class AvroFormatterTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
                if ( !class_exists( 'AvroStringIO' ) ) {
                        $this->markTestSkipped( 'Avro is required for the AvroFormatterTest' );
                }
@@ -34,7 +34,10 @@ class AvroFormatterTest extends MediaWikiTestCase {
 
        public function testSchemaNotAvailable() {
                $formatter = new AvroFormatter( array() );
-               $this->setExpectedException( 'PHPUnit_Framework_Error_Notice', "The schema for channel 'marty' is not available" );
+               $this->setExpectedException(
+                       'PHPUnit_Framework_Error_Notice',
+                       "The schema for channel 'marty' is not available"
+               );
                $formatter->format( array( 'channel' => 'marty' ) );
        }
 
index 272f6e4..9866ce1 100644 (file)
@@ -24,14 +24,17 @@ use MediaWikiTestCase;
 use Monolog\Logger;
 
 // not available in the version of phpunit mw uses, so copied into repo
-require_once __DIR__ . '/../../../ConsecutiveParametersMatcher.php';
+require_once __DIR__ . '/../../../phpunit/ConsecutiveParametersMatcher.php';
 
 class KafkaHandlerTest extends MediaWikiTestCase {
 
-       public function setUo() {
-               if ( !class_exists( 'Monolog\Handler\AbstractProcessingHandler' ) ) {
-                       $this->markTestSkipped( 'Monolog is required for the KafkaHandlerTest' );
+       protected function setUp() {
+               if ( !class_exists( 'Monolog\Handler\AbstractProcessingHandler' )
+                       || !class_exists( 'Kafka\Produce' )
+               ) {
+                       $this->markTestSkipped( 'Monolog and Kafka are required for the KafkaHandlerTest' );
                }
+
                parent::setUp();
        }
 
@@ -49,10 +52,10 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                $produce = $this->getMockBuilder( 'Kafka\Produce' )
                        ->disableOriginalConstructor()
                        ->getMock();
-               $produce->expects($this->any())
-                       ->method('getAvailablePartitions')
-                       ->will($this->returnValue( array( 'A' ) ) );
-               $produce->expects($this->once())
+               $produce->expects( $this->any() )
+                       ->method( 'getAvailablePartitions' )
+                       ->will( $this->returnValue( array( 'A' ) ) );
+               $produce->expects( $this->once() )
                        ->method( 'setMessages' )
                        ->with( $expect, $this->anything(), $this->anything() );
 
index 6ee54d3..be23c4a 100644 (file)
@@ -28,7 +28,7 @@ use TestingAccessWrapper;
 
 class LineFormatterTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
                if ( !class_exists( 'Monolog\Formatter\LineFormatter' ) ) {
                        $this->markTestSkipped( 'This test requires monolog to be installed' );
                }
index 02f6b2a..bbd196d 100644 (file)
@@ -255,7 +255,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
        ) {
                $update = new LinksUpdate( $title, $parserOutput );
 
-               //NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
+               // NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
                $update->beginTransaction();
                $update->doUpdate();
                $update->commitTransaction();
index 2e4942f..0d15b75 100644 (file)
@@ -80,6 +80,11 @@ class FileBackendTest extends MediaWikiTestCase {
                ) );
        }
 
+       protected function tearDown() {
+               parent::tearDown();
+               DeferredUpdates::forceDeferral( false );
+       }
+
        private static function baseStorePath() {
                return 'mwstore://localtesting';
        }
@@ -1517,7 +1522,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
                        array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
                        # Specific to FS backend with no basePath field set
-                       #array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
+                       # array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
                );
        }
 
@@ -2347,7 +2352,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        $this->assertEquals( true, $status->isOK(),
                                "Locking of files succeeded with OK status ($backendName) ($i)." );
 
-                       ## Flip the acquire/release ordering around ##
+                       # # Flip the acquire/release ordering around ##
 
                        $status = $this->backend->lockFiles( $paths, LockManager::LOCK_SH );
                        $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
@@ -2442,6 +2447,54 @@ class FileBackendTest extends MediaWikiTestCase {
                );
        }
 
+       public function testAsyncWrites() {
+               $be = TestingAccessWrapper::newFromObject(
+                       new FileBackendMultiWrite( array(
+                               'name' => 'localtesting',
+                               'wikiId' => wfWikiId() . mt_rand(),
+                               'backends' => array(
+                                       array( // backend 0
+                                               'name' => 'multitesting0',
+                                               'class' => 'MemoryFileBackend',
+                                               'isMultiMaster' => false
+                                       ),
+                                       array( // backend 1
+                                               'name' => 'multitesting1',
+                                               'class' => 'MemoryFileBackend',
+                                               'isMultiMaster' => true
+                                       )
+                               ),
+                               'replication' => 'async'
+                       ) )
+               );
+
+               DeferredUpdates::forceDeferral( true );
+
+               $p = 'container/test-cont/file.txt';
+               $be->quickCreate( array(
+                       'dst' => "mwstore://localtesting/$p", 'content' => 'cattitude' ) );
+
+               $this->assertEquals(
+                       false,
+                       $be->backends[0]->getFileContents( array( 'src' => "mwstore://multitesting0/$p" ) ),
+                       "File not yet written to backend 0"
+               );
+               $this->assertEquals(
+                       'cattitude',
+                       $be->backends[1]->getFileContents( array( 'src' => "mwstore://multitesting1/$p" ) ),
+                       "File already written to backend 1"
+               );
+
+               DeferredUpdates::doUpdates();
+               DeferredUpdates::forceDeferral( false );
+
+               $this->assertEquals(
+                       'cattitude',
+                       $be->backends[0]->getFileContents( array( 'src' => "mwstore://multitesting0/$p" ) ),
+                       "File now written to backend 0"
+               );
+       }
+
        // helper function
        private function listToArray( $iter ) {
                return is_array( $iter ) ? $iter : iterator_to_array( $iter );
index a618889..877cb60 100644 (file)
@@ -75,7 +75,7 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                                array(
                                        'content-length' => 345,
                                        'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'filename='. str_repeat( 'o', 1024 ) . ';inline',
+                                       'content-disposition' => 'filename=' . str_repeat( 'o', 1024 ) . ';inline',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
                                        'x-content-custom' => 'hello'
@@ -145,4 +145,4 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                        )
                );
        }
-}
\ No newline at end of file
+}
index 681e368..ea3f862 100644 (file)
@@ -99,7 +99,7 @@ class FileBackendDBRepoWrapperTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( '96246614d75ba1703bdfd5d7660bb57407aaf5d9' ) );
 
                $backendMock->expects( $this->once() )
-                       ->method( 'getFileContentsMulti')
+                       ->method( 'getFileContentsMulti' )
                        ->will( $this->returnValue( array( $sha1Path => 'foo' ) ) );
 
                $result = $wrapperMock->getFileContentsMulti( array( 'srcs' => array( $filenamePath ) ) );
index 551d3a7..c839bc4 100644 (file)
@@ -48,10 +48,16 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                                'backend' => $backend
                        ) ) );
 
-               $repoMock->expects( $this->any() )->method( 'getMasterDB' )->will( $this->returnValue( $dbMock ) );
+               $repoMock
+                       ->expects( $this->any() )
+                       ->method( 'getMasterDB' )
+                       ->will( $this->returnValue( $dbMock ) );
 
                $this->migratorMock = $this->getMock( 'MigrateFileRepoLayout', array( 'getRepo' ) );
-               $this->migratorMock->expects( $this->any() )->method( 'getRepo' )->will( $this->returnValue( $repoMock ) );
+               $this->migratorMock
+                       ->expects( $this->any() )
+                       ->method( 'getRepo' )
+                       ->will( $this->returnValue( $repoMock ) );
 
                $this->tmpFilepath = TempFSFile::factory( 'migratefilelayout-test-', 'png' )->getPath();
 
@@ -59,19 +65,24 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
 
                $hashPath = $repoMock->getHashPath( $filename );
 
-               $status = $repoMock->store( $this->tmpFilepath, 'public', $hashPath . $filename, FileRepo::OVERWRITE );
+               $status = $repoMock->store(
+                       $this->tmpFilepath,
+                       'public',
+                       $hashPath . $filename,
+                       FileRepo::OVERWRITE
+               );
        }
 
        protected function deleteFilesRecursively( $directory ) {
                foreach ( glob( $directory . '/*' ) as $file ) {
-               if ( is_dir( $file ) ) {
-                       $this->deleteFilesRecursively( $file );
-               } else {
-                       unlink( $file );
-               }
-               }
-
-               rmdir( $directory );
+                       if ( is_dir( $file ) ) {
+                               $this->deleteFilesRecursively( $file );
+                       } else {
+                               unlink( $file );
+                       }
+               }
+
+               rmdir( $directory );
        }
 
        protected function tearDown() {
@@ -85,7 +96,10 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
        }
 
        public function testMigration() {
-               $this->migratorMock->loadParamsAndArgs( null, array( 'oldlayout' => 'name', 'newlayout' => 'sha1' ) );
+               $this->migratorMock->loadParamsAndArgs(
+                       null,
+                       array( 'oldlayout' => 'name', 'newlayout' => 'sha1' )
+               );
 
                ob_start();
 
@@ -103,12 +117,20 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                        . '/'
                        . substr( $sha1, 2, 1 )
                        . '/'
-                       . $sha1 ;
+                       . $sha1;
 
-               $this->assertEquals( file_get_contents( $expectedOriginalFilepath ), $this->text, 'New sha1 file should be exist and have the right contents' );
+               $this->assertEquals(
+                       file_get_contents( $expectedOriginalFilepath ),
+                       $this->text,
+                       'New sha1 file should be exist and have the right contents'
+               );
 
                $expectedPublicFilepath = $this->tmpPrefix . '-public/f/f8/Foo.png';
 
-               $this->assertEquals( file_get_contents( $expectedPublicFilepath ), $this->text, 'Existing name file should still and have the right contents' );
+               $this->assertEquals(
+                       file_get_contents( $expectedPublicFilepath ),
+                       $this->text,
+                       'Existing name file should still and have the right contents'
+               );
        }
 }
index 7841f30..f4f7bfd 100644 (file)
@@ -188,6 +188,7 @@ class CSSMinTest extends MediaWikiTestCase {
                        . '%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%228%22%20height%3D'
                        . '%228%22%3E%0A%3Ccircle%20cx%3D%224%22%20cy%3D%224%22%20r%3D%222%22%2F%3E%0A%3C%2Fsvg%3E%0A';
 
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array(
                                'Regular file',
@@ -374,6 +375,7 @@ class CSSMinTest extends MediaWikiTestCase {
                                '.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(http://localhost/w/images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }',
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
index aea037e..577dc3c 100644 (file)
@@ -25,7 +25,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
         */
        public function testClosureExpansionDisabled() {
                $obj = ObjectFactory::getObjectFromSpec( array(
-                       'class' => 'ObjectFactoryTest_Fixture',
+                       'class' => 'ObjectFactoryTestFixture',
                        'args' => array( function() {
                                return 'unwrapped';
                        }, ),
@@ -47,7 +47,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
         */
        public function testClosureExpansionEnabled() {
                $obj = ObjectFactory::getObjectFromSpec( array(
-                       'class' => 'ObjectFactoryTest_Fixture',
+                       'class' => 'ObjectFactoryTestFixture',
                        'args' => array( function() {
                                return 'unwrapped';
                        }, ),
@@ -64,7 +64,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( 'unwrapped', $obj->setterArgs[0] );
 
                $obj = ObjectFactory::getObjectFromSpec( array(
-                       'class' => 'ObjectFactoryTest_Fixture',
+                       'class' => 'ObjectFactoryTestFixture',
                        'args' => array( function() {
                                return 'unwrapped';
                        }, ),
@@ -81,7 +81,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
        }
 }
 
-class ObjectFactoryTest_Fixture {
+class ObjectFactoryTestFixture {
        public $args;
        public $setterArgs;
        public function __construct( /*...*/ ) {
index edfaf16..35a8e4f 100644 (file)
@@ -23,7 +23,7 @@ class RunningStatTest extends PHPUnit_Framework_TestCase {
         */
        public function testRunningStatAccuracy() {
                $rstat = new RunningStat();
-               foreach( $this->points as $point ) {
+               foreach ( $this->points as $point ) {
                        $rstat->push( $point );
                }
 
@@ -51,7 +51,7 @@ class RunningStatTest extends PHPUnit_Framework_TestCase {
        public function testRunningStatMerge() {
                $expected = new RunningStat();
 
-               foreach( $this->points as $point ) {
+               foreach ( $this->points as $point ) {
                        $expected->push( $point );
                }
 
@@ -60,13 +60,13 @@ class RunningStatTest extends PHPUnit_Framework_TestCase {
 
                // Accumulate the first half into one RunningStat object
                $first = new RunningStat();
-               foreach( $sets[0] as $point ) {
+               foreach ( $sets[0] as $point ) {
                        $first->push( $point );
                }
 
                // Accumulate the second half into another RunningStat object
                $second = new RunningStat();
-               foreach( $sets[1] as $point ) {
+               foreach ( $sets[1] as $point ) {
                        $second->push( $point );
                }
 
index f0ba934..c43d550 100644 (file)
@@ -8,7 +8,9 @@
 class XmlTypeCheckTest extends PHPUnit_Framework_TestCase {
        const WELL_FORMED_XML = "<root><child /></root>";
        const MAL_FORMED_XML = "<root><child /></error>";
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        const XML_WITH_PIH = '<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/w/index.php"?><svg><child /></svg>';
+       // @codingStandardsIgnoreEnd
 
        /**
         * @covers XMLTypeCheck::newFromString
index cac3b10..6b374f2 100644 (file)
@@ -38,7 +38,8 @@ class ComposerLockTest extends MediaWikiTestCase {
                                                'email' => 'chad@wikimedia.org',
                                        ),
                                ),
-                               'description' => 'Constant Database (CDB) wrapper library for PHP. Provides pure-PHP fallback when dba_* functions are absent.',
+                               'description' => 'Constant Database (CDB) wrapper library for PHP. '.
+                                       'Provides pure-PHP fallback when dba_* functions are absent.',
                        ),
                        'cssjanus/cssjanus' => array(
                                'version' => '1.1.1',
@@ -108,14 +109,18 @@ class ComposerLockTest extends MediaWikiTestCase {
                                                'role' => 'Developer',
                                        ),
                                ),
-                               'description' => 'The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software',
+                               'description' => 'The only standard solution to translate any kind ' .
+                                       'of text with an avant-garde web interface within MediaWiki, ' .
+                                       'including your documentation and software',
                        ),
                        'mediawiki/universal-language-selector' => array(
                                'version' => '2014.12',
                                'type' => 'mediawiki-extension',
                                'licenses' => array( 'GPL-2.0+', 'MIT' ),
                                'authors' => array(),
-                               'description' => 'The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.',
+                               'description' => 'The primary aim is to allow users to select a language ' .
+                                       'and configure its support in an easy way. ' .
+                                       'Main features are language selection, input methods and web fonts.',
                        ),
                ), $lock->getInstalledDependencies(), false, true );
        }
index 844c9af..478086b 100644 (file)
@@ -307,6 +307,44 @@ class LogFormatterTest extends MediaWikiLangTestCase {
                );
        }
 
+       /**
+        * The testIrcMsgForAction* tests are supposed to cover the hacky
+        * LogFormatter::getIRCActionText / bug 34508
+        *
+        * Third parties bots listen to those messages. They are clever enough
+        * to fetch the i18n messages from the wiki and then analyze the IRC feed
+        * to reverse engineer the $1, $2 messages.
+        * One thing bots can not detect is when MediaWiki change the meaning of
+        * a message like what happened when we deployed 1.19. $1 became the user
+        * performing the action which broke basically all bots around.
+        *
+        * Should cover the following log actions (which are most commonly used by bots):
+        * - block/block
+        * - block/unblock
+        * - block/reblock
+        * - delete/delete
+        * - delete/restore
+        * - newusers/create
+        * - newusers/create2
+        * - newusers/autocreate
+        * - move/move
+        * - move/move_redir
+        * - protect/protect
+        * - protect/modifyprotect
+        * - protect/unprotect
+        * - protect/move_prot
+        * - upload/upload
+        * - merge/merge
+        * - import/upload
+        * - import/interwiki
+        *
+        * As well as the following Auto Edit Summaries:
+        * - blank
+        * - replace
+        * - rollback
+        * - undo
+        */
+
        /**
         * @covers LogFormatter::getIRCActionComment
         * @covers LogFormatter::getIRCActionText
@@ -462,13 +500,13 @@ class LogFormatterTest extends MediaWikiLangTestCase {
         */
        public function testIrcMsgForLogTypeProtect() {
                $protectParams = array(
-                       '[edit=sysop] (indefinite) ‎[move=sysop] (indefinite)'
+                       '4::description' => '[edit=sysop] (indefinite) ‎[move=sysop] (indefinite)'
                );
                $sep = $this->context->msg( 'colon-separator' )->text();
 
                # protect/protect
                $this->assertIRCComment(
-                       $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams[0] )
+                       $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams['4::description'] )
                                ->plain() . $sep . $this->user_comment,
                        'protect', 'protect',
                        $protectParams,
@@ -485,8 +523,10 @@ class LogFormatterTest extends MediaWikiLangTestCase {
 
                # protect/modify
                $this->assertIRCComment(
-                       $this->context->msg( 'modifiedarticleprotection', 'SomeTitle ' . $protectParams[0] )
-                               ->plain() . $sep . $this->user_comment,
+                       $this->context->msg(
+                               'modifiedarticleprotection',
+                               'SomeTitle ' . $protectParams['4::description']
+                       )->plain() . $sep . $this->user_comment,
                        'protect', 'modify',
                        $protectParams,
                        $this->user_comment
index e88452b..f175482 100644 (file)
@@ -49,6 +49,7 @@ abstract class LogFormatterTestCase extends MediaWikiLangTestCase {
 
        private static function removeSomeHtml( $html ) {
                $html = str_replace( '&quot;', '"', $html );
+               $html = preg_replace( '/\xE2\x80[\x8E\x8F]/', '', $html ); // Strip lrm/rlm
                return trim( preg_replace( '/<(a|span)[^>]*>([^<]*)<\/\1>/', '$2', $html ) );
        }
 
index 611b2df..17decf3 100644 (file)
@@ -2,6 +2,374 @@
 
 class ProtectLogFormatterTest 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 provideProtectLogDatabaseRows() {
+               return array(
+                       // Current format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'protect',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '5:bool:cascade' => false,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User protected ProtectPage [Edit=Allow only administrators] ' .
+                                               '(indefinite) [Move=Allow only administrators] (indefinite)',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => false,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                       ),
+
+                       // Current format with cascade
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'protect',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '5:bool:cascade' => true,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => true,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User protected ProtectPage [Edit=Allow only administrators] ' .
+                                               '(indefinite) [Move=Allow only administrators] (indefinite) [cascading]',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => true,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => true,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                       ),
+
+                       // Legacy format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'protect',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '',
+                                       ),
+                               ),
+                               array(
+                                       'legacy' => true,
+                                       'text' => 'User protected ProtectPage [edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => false,
+                                       ),
+                               ),
+                       ),
+
+                       // Legacy format with cascade
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'protect',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade',
+                                       ),
+                               ),
+                               array(
+                                       'legacy' => true,
+                                       'text' => 'User protected ProtectPage [edit=sysop] ' .
+                                               '(indefinite)[move=sysop] (indefinite) [cascading]',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => true,
+                                       ),
+                               ),
+                       ),
+               );
+       }
+
+
+       /**
+        * @dataProvider provideProtectLogDatabaseRows
+        */
+       public function testProtectLogDatabaseRows( $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 provideModifyLogDatabaseRows() {
+               return array(
+                       // Current format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'modify',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '5:bool:cascade' => false,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User changed protection level for ProtectPage ' .
+                                               '[Edit=Allow only administrators] ' .
+                                               '(indefinite) [Move=Allow only administrators] (indefinite)',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => false,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                       ),
+
+                       // Current format with cascade
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'modify',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '5:bool:cascade' => true,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => true,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User changed protection level for ProtectPage ' .
+                                               '[Edit=Allow only administrators] (indefinite) ' .
+                                               '[Move=Allow only administrators] (indefinite) [cascading]',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => true,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => true,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                       ),
+
+                       // Legacy format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'modify',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '',
+                                       ),
+                               ),
+                               array(
+                                       'legacy' => true,
+                                       'text' => 'User changed protection level for ProtectPage ' .
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => false,
+                                       ),
+                               ),
+                       ),
+
+                       // Legacy format with cascade
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'modify',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade',
+                                       ),
+                               ),
+                               array(
+                                       'legacy' => true,
+                                       'text' => 'User changed protection level for ProtectPage ' .
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite) [cascading]',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => true,
+                                       ),
+                               ),
+                       ),
+               );
+       }
+
+
+       /**
+        * @dataProvider provideModifyLogDatabaseRows
+        */
+       public function testModifyLogDatabaseRows( $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 provideUnprotectLogDatabaseRows() {
+               return array(
+                       // Current format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'unprotect',
+                                       'comment' => 'unprotect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(),
+                               ),
+                               array(
+                                       'text' => 'User removed protection from ProtectPage',
+                                       'api' => array(),
+                               ),
+                       ),
+               );
+       }
+
+
+       /**
+        * @dataProvider provideUnprotectLogDatabaseRows
+        */
+       public function testUnprotectLogDatabaseRows( $row, $extra ) {
+               $this->doTestLogFormatter( $row, $extra );
+       }
+
        /**
         * Provide different rows from the logging table to test
         * for backward compatibility.
index 18d2acd..1fc63d9 100644 (file)
@@ -18,9 +18,15 @@ class MailAddressTest extends MediaWikiTestCase {
                        $this->markTestSkipped( 'This test only works on non-Windows platforms' );
                }
                $user = $this->getMock( 'User' );
-               $user->expects( $this->any() )->method( 'getName' )->will( $this->returnValue( 'UserName' ) );
-               $user->expects( $this->any() )->method( 'getEmail' )->will( $this->returnValue( 'foo@bar.baz' ) );
-               $user->expects( $this->any() )->method( 'getRealName' )->will( $this->returnValue( 'Real name' ) );
+               $user->expects( $this->any() )->method( 'getName' )->will(
+                       $this->returnValue( 'UserName' )
+               );
+               $user->expects( $this->any() )->method( 'getEmail' )->will(
+                       $this->returnValue( 'foo@bar.baz' )
+               );
+               $user->expects( $this->any() )->method( 'getRealName' )->will(
+                       $this->returnValue( 'Real name' )
+               );
 
                $ma = MailAddress::newFromUser( $user );
                $this->assertInstanceOf( 'MailAddress', $ma );
index c0871f1..31cda64 100644 (file)
@@ -13,7 +13,7 @@ class DjVuTest extends MediaWikiMediaTestCase {
        protected function setUp() {
                parent::setUp();
 
-               //cli tool setup
+               // cli tool setup
                $djvuSupport = new DjVuSupport();
 
                if ( !$djvuSupport->isEnabled() ) {
index adbc977..078c842 100644 (file)
@@ -148,7 +148,9 @@ class ExifBitmapTest extends MediaWikiMediaTestCase {
         * @dataProvider provideSwappingICCProfile
         * @covers BitmapHandler::swapICCProfile
         */
-       public function testSwappingICCProfile( $sourceFilename, $controlFilename, $newProfileFilename, $oldProfileName ) {
+       public function testSwappingICCProfile(
+               $sourceFilename, $controlFilename, $newProfileFilename, $oldProfileName
+       ) {
                global $wgExiftool;
 
                if ( !$wgExiftool || !is_file( $wgExiftool ) ) {
@@ -167,17 +169,35 @@ class ExifBitmapTest extends MediaWikiMediaTestCase {
                $file = $this->dataFile( $sourceFilename, 'image/jpeg' );
                $this->handler->swapICCProfile( $filepath, $oldProfileName, $profileFilepath );
 
-               $this->assertEquals( sha1( file_get_contents( $filepath ) ), sha1( file_get_contents( $controlFilepath ) ) );
+               $this->assertEquals(
+                       sha1( file_get_contents( $filepath ) ),
+                       sha1( file_get_contents( $controlFilepath ) )
+               );
        }
 
        public function provideSwappingICCProfile() {
                return array(
                        // File with sRGB should end up with TinyRGB
-                       array( 'srgb.jpg', 'tinyrgb.jpg', 'tinyrgb.icc', 'IEC 61966-2.1 Default RGB colour space - sRGB' ),
+                       array(
+                               'srgb.jpg',
+                               'tinyrgb.jpg',
+                               'tinyrgb.icc',
+                               'IEC 61966-2.1 Default RGB colour space - sRGB'
+                       ),
                        // File with TinyRGB should be left unchanged
-                       array( 'tinyrgb.jpg', 'tinyrgb.jpg', 'tinyrgb.icc', 'IEC 61966-2.1 Default RGB colour space - sRGB' ),
+                       array(
+                               'tinyrgb.jpg',
+                               'tinyrgb.jpg',
+                               'tinyrgb.icc',
+                               'IEC 61966-2.1 Default RGB colour space - sRGB'
+                       ),
                        // File with no profile should be left unchanged
-                       array( 'test.jpg', 'test.jpg', 'tinyrgb.icc', 'IEC 61966-2.1 Default RGB colour space - sRGB' )
+                       array(
+                               'test.jpg',
+                               'test.jpg',
+                               'tinyrgb.icc',
+                               'IEC 61966-2.1 Default RGB colour space - sRGB'
+                       )
                );
        }
 }
index b666c83..22383e1 100644 (file)
@@ -53,17 +53,45 @@ class FormatMetadataTest extends MediaWikiMediaTestCase {
 
        public function provideResolveMultivalueValue() {
                return array(
-                       'nonArray' => array( 'foo', 'foo' ),
-                       'multiValue' => array( array( 'first', 'second', 'third', '_type' => 'ol' ), 'first' ),
-                       'noType' => array( array( 'first', 'second', 'third' ), 'first' ),
-                       'typeFirst' => array( array( '_type' => 'ol', 'first', 'second', 'third' ), 'first' ),
+                       'nonArray' => array(
+                               'foo',
+                               'foo'
+                       ),
+                       'multiValue' => array(
+                               array( 'first', 'second', 'third', '_type' => 'ol' ),
+                               'first'
+                       ),
+                       'noType' => array(
+                               array( 'first', 'second', 'third' ),
+                               'first'
+                       ),
+                       'typeFirst' => array(
+                               array( '_type' => 'ol', 'first', 'second', 'third' ),
+                               'first'
+                       ),
                        'multilang' => array(
-                               array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
-                               array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
+                               array(
+                                       'en' => 'first',
+                                       'de' => 'Erste',
+                                       '_type' => 'lang'
+                               ),
+                               array(
+                                       'en' => 'first',
+                                       'de' => 'Erste',
+                                       '_type' => 'lang'
+                               ),
                        ),
                        'multilang-multivalue' => array(
-                               array( 'en' => array( 'first', 'second' ), 'de' => array( 'Erste', 'Zweite' ), '_type' => 'lang' ),
-                               array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
+                               array(
+                                       'en' => array( 'first', 'second' ),
+                                       'de' => array( 'Erste', 'Zweite' ),
+                                       '_type' => 'lang'
+                               ),
+                               array(
+                                       'en' => 'first',
+                                       'de' => 'Erste',
+                                       '_type' => 'lang'
+                               ),
                        ),
                );
        }
index 87ffd99..de1e153 100644 (file)
@@ -139,4 +139,24 @@ class GIFHandlerTest extends MediaWikiMediaTestCase {
                        ),
                );
        }
+
+       /**
+        * @param $filename string
+        * @param $expectedLength float
+        * @dataProvider provideGetLength
+        */
+       public function testGetLength( $filename, $expectedLength ) {
+               $file = $this->dataFile( $filename, 'image/gif' );
+               $actualLength = $file->getLength();
+               $this->assertEquals( $expectedLength, $actualLength, '', 0.00001 );
+       }
+
+       public function provideGetLength() {
+               return array(
+                       array( 'animated.gif', 2.4 ),
+                       array( 'animated-xmp.gif', 2.4 ),
+                       array( 'nonanimated', 0.0 ),
+                       array( 'Bishzilla_blink.gif', 1.4 ),
+               );
+       }
 }
index 36872a7..5f1f6ca 100644 (file)
@@ -93,7 +93,7 @@ class PNGHandlerTest extends MediaWikiMediaTestCase {
        public function testGetMetadata( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/png' );
                $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
-//             $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
+//             $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
                $this->assertEquals( ( $expected ), ( $actual ) );
        }
 
@@ -128,4 +128,24 @@ class PNGHandlerTest extends MediaWikiMediaTestCase {
                        ),
                );
        }
+
+       /**
+        * @param $filename string
+        * @param $expectedLength float
+        * @dataProvider provideGetLength
+        */
+       public function testGetLength( $filename, $expectedLength ) {
+               $file = $this->dataFile( $filename, 'image/png' );
+               $actualLength = $file->getLength();
+               $this->assertEquals( $expectedLength, $actualLength, '', 0.00001 );
+       }
+
+       public function provideGetLength() {
+               return array(
+                       array( 'Animated_PNG_example_bouncing_beach_ball.png', 1.5 ),
+                       array( 'Png-native-test.png', 0.0 ),
+                       array( 'greyscale-png.png', 0.0 ),
+                       array( '1bit-png.png', 0.0 ),
+               );
+       }
 }
index d36710a..a92f25a 100644 (file)
@@ -19,12 +19,13 @@ class WebPHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $this->tempFileName ) );
        }
        public function provideTestExtractMetaData() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Files from https://developers.google.com/speed/webp/gallery2
                        array( "\x52\x49\x46\x46\x90\x68\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x83\x68\x01\x00\x2F\x8F\x01\x4B\x10\x8D\x38\x6C\xDB\x46\x92\xE0\xE0\x82\x7B\x6C",
                                array( 'compression' => 'lossless', 'width' => 400, 'height' => 301 ) ),
                        array( "\x52\x49\x46\x46\x64\x5B\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x8F\x01\x00\x2C\x01\x00\x41\x4C\x50\x48\xE5\x0E",
-                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 400, 'height' => 301) ),
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 400, 'height' => 301 ) ),
                        array( "\x52\x49\x46\x46\xA8\x72\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x9B\x72\x00\x00\x2F\x81\x81\x62\x10\x8D\x40\x8C\x24\x39\x6E\x73\x73\x38\x01\x96",
                                array( 'compression' => 'lossless', 'width' => 386, 'height' => 395 ) ),
                        array( "\x52\x49\x46\x46\xE0\x42\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x81\x01\x00\x8A\x01\x00\x41\x4C\x50\x48\x56\x10",
@@ -50,9 +51,9 @@ class WebPHandlerTest extends MediaWikiTestCase {
                        array( "\x52\x49\x46\x46\x7A\x19\x03\x00\x57\x45\x42\x50\x56\x50\x38\x20\x6E\x19\x03\x00\xB2\xF8\x09\x9D\x01\x2A\x00\x05\xD0\x02\x3E\xAD\x46\x99\x4A\xA5",
                                array( 'compression' => 'lossy', 'width' => 1280, 'height' => 720 ) ),
                        array( "\x52\x49\x46\x46\x44\xB3\x02\x00\x57\x45\x42\x50\x56\x50\x38\x20\x38\xB3\x02\x00\x52\x57\x06\x9D\x01\x2A\x00\x04\x04\x03\x3E\xA5\x44\x96\x49\x26",
-                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 772) ),
+                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 772 ) ),
                        array( "\x52\x49\x46\x46\x02\x43\x01\x00\x57\x45\x42\x50\x56\x50\x38\x20\xF6\x42\x01\x00\x12\xC0\x05\x9D\x01\x2A\x00\x04\xF0\x02\x3E\x79\x34\x93\x47\xA4",
-                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 752) ),
+                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 752 ) ),
 
                        // Animated file from https://groups.google.com/a/chromium.org/d/topic/blink-dev/Y8tRC4mdQz8/discussion
                        array( "\x52\x49\x46\x46\xD0\x0B\x02\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x12\x00\x00\x00\x3F\x01\x00\x3F\x01\x00\x41\x4E",
@@ -66,6 +67,7 @@ class WebPHandlerTest extends MediaWikiTestCase {
                        array( 'RIFF1234WEBPVP8                     ', false ),
                        array( 'RIFF1234WEBPVP8L                    ', false ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -76,10 +78,22 @@ class WebPHandlerTest extends MediaWikiTestCase {
        }
        public function provideTestWithFileExtractMetaData() {
                return array(
-                               array( __DIR__ . '/../../data/media/2_webp_ll.webp',
-                                       array( 'compression' => 'lossless', 'width' => 386, 'height' => 395 ) ),
-                               array( __DIR__ . '/../../data/media/2_webp_a.webp',
-                                       array( 'compression' => 'lossy', 'animated' => false, 'transparency' => true, 'width' => 386, 'height' => 395 ) ),
+                       array( __DIR__ . '/../../data/media/2_webp_ll.webp',
+                               array(
+                                       'compression' => 'lossless',
+                                       'width' => 386,
+                                       'height' => 395
+                               )
+                       ),
+                       array( __DIR__ . '/../../data/media/2_webp_a.webp',
+                               array(
+                                       'compression' => 'lossy',
+                                       'animated' => false,
+                                       'transparency' => true,
+                                       'width' => 386,
+                                       'height' => 395
+                               )
+                       ),
                );
        }
 
index b684006..b9fe490 100644 (file)
@@ -120,6 +120,23 @@ class BagOStuffTest extends MediaWikiTestCase {
                $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
         */
@@ -139,24 +156,31 @@ class BagOStuffTest extends MediaWikiTestCase {
                $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' );
-               $key3 = wfMemcKey( 'will-%-encode' ); // internally, MemcachedBagOStuffs will encode to will-%25-encode
+               // 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 ),
-                       $this->cache->getMulti( array( $key1, $key2, $key3 ) )
+                       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 );
        }
 
        /**
index 9b4eca7..742b737 100644 (file)
@@ -74,6 +74,14 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                }
        }
 
+       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()
         */
index c011e9a..a21fc8a 100644 (file)
@@ -160,7 +160,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->hideDeprecated( "WikiPage::getText" );
                $this->hideDeprecated( "Revision::getText" );
 
-               //NOTE: assume help namespace will default to wikitext
+               // NOTE: assume help namespace will default to wikitext
                $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" );
 
                $page = $this->newPage( $title );
@@ -220,7 +220,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
                $this->hideDeprecated( "WikiPage::doQuickEdit" );
 
-               //NOTE: assume help namespace will default to wikitext
+               // NOTE: assume help namespace will default to wikitext
                $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
 
                $text = "quick text";
@@ -292,6 +292,12 @@ class WikiPageTest extends MediaWikiLangTestCase {
                        "Title::exists should return false after page was deleted"
                );
 
+               // Run the job queue
+               JobQueueGroup::destroySingletons();
+               $jobs = new RunJobs;
+               $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
+               $jobs->execute();
+
                # ------------------------
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
@@ -312,8 +318,16 @@ class WikiPageTest extends MediaWikiLangTestCase {
                );
                $id = $page->getId();
 
+               // Similar to MovePage logic
+               wfGetDB( DB_MASTER )->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
                $page->doDeleteUpdates( $id );
 
+               // Run the job queue
+               JobQueueGroup::destroySingletons();
+               $jobs = new RunJobs;
+               $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
+               $jobs->execute();
+
                # ------------------------
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
@@ -743,7 +757,7 @@ more stuff
 ";
 
        public function dataReplaceSection() {
-               //NOTE: assume the Help namespace to contain wikitext
+               // NOTE: assume the Help namespace to contain wikitext
                return array(
                        array( 'Help:WikiPageTest_testReplaceSection',
                                CONTENT_MODEL_WIKITEXT,
@@ -938,7 +952,7 @@ more stuff
                $this->assertEquals( 'Admin', $rev1->getUserText() );
 
                # now, try the actual rollback
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
                $token = $admin->getEditToken(
                        array( $page->getTitle()->getPrefixedText(), $user2->getName() ),
                        null
@@ -995,7 +1009,7 @@ more stuff
                );
 
                # now, try the rollback
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
                $token = $admin->getEditToken(
                        array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
                        null
@@ -1026,7 +1040,7 @@ more stuff
        public function testDoRollbackFailureSameContent() {
                $admin = new User();
                $admin->setName( "Admin" );
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
@@ -1041,7 +1055,7 @@ more stuff
 
                $user1 = new User();
                $user1->setName( "127.0.1.11" );
-               $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $user1->addGroup( "sysop" ); # XXX: make the test user a sysop...
                $text .= "\n\ntwo";
                $page = new WikiPage( $page->getTitle() );
                $page->doEditContent(
@@ -1219,7 +1233,7 @@ more stuff
        public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
                global $wgUser;
 
-               //NOTE: assume Help namespace to contain wikitext
+               // NOTE: assume Help namespace to contain wikitext
                $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
 
                $c = 1;
@@ -1275,7 +1289,7 @@ more stuff
                $user = new User();
                $user->setName( "127.0.0.1" );
 
-               //NOTE: assume Help namespace to contain wikitext
+               // NOTE: assume Help namespace to contain wikitext
                $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
                $text = $page->preSaveTransform( $text, $user );
 
index cd54a9e..8997846 100644 (file)
@@ -84,7 +84,7 @@ class MagicVariableTest extends MediaWikiTestCase {
                return self::createProviderUpTo( 31 );
        }
 
-       ############### TESTS #############################################
+       # ############## TESTS #############################################
        # @todo FIXME:
        #  - those got copy pasted, we can probably make them cleaner
        #  - tests are lacking useful messages
@@ -157,7 +157,7 @@ class MagicVariableTest extends MediaWikiTestCase {
                $this->assertUnPadded( 'revisionmonth1', $month );
        }
 
-       ############### HELPERS ############################################
+       # ############## HELPERS ############################################
 
        /** assertion helper expecting a magic output which is zero padded */
        public function assertZeroPadded( $magic, $value ) {
@@ -189,7 +189,7 @@ class MagicVariableTest extends MediaWikiTestCase {
                );
 
                # please keep the following commented line of code. It helps debugging.
-               //print "\nDEBUG (value $value):" . sprintf( '2010%02d%02d123456', $value, $value ) . "\n";
+               // print "\nDEBUG (value $value):" . sprintf( '2010%02d%02d123456', $value, $value ) . "\n";
 
                # format expectation and test it
                $expected = sprintf( $format, $value );
index 96ae3be..95822ad 100644 (file)
@@ -94,9 +94,12 @@ class MediaWikiParserTest {
                        $testsName = $extensionName . '__' . basename( $fileName, '.txt' );
                        $escapedFileName = strtr( $fileName, array( "'" => "\\'", '\\' => '\\\\' ) );
                        $parserTestClassName = ucfirst( $testsName );
+
                        // Official spec for class names: http://php.net/manual/en/language.oop5.basic.php
                        // Prepend 'ParserTest_' to be paranoid about it not starting with a number
-                       $parserTestClassName = 'ParserTest_' . preg_replace( '/[^a-zA-Z0-9_\x7f-\xff]/', '_', $parserTestClassName );
+                       $parserTestClassName = 'ParserTest_' .
+                               preg_replace( '/[^a-zA-Z0-9_\x7f-\xff]/', '_', $parserTestClassName );
+
                        if ( isset( $testList[$parserTestClassName] ) ) {
                                // If a conflict happens, gives a very unclear fatal.
                                // So as a last ditch effort to prevent that eventuality, if there
index df7da98..ff4a527 100644 (file)
@@ -27,7 +27,7 @@ class NewParserTest extends MediaWikiTestCase {
        public $functionHooks = array();
        public $transparentHooks = array();
 
-       //Fuzz test
+       // Fuzz test
        public $maxFuzzTestLength = 300;
        public $fuzzSeed = 0;
        public $memoryLimit = 50;
@@ -54,7 +54,7 @@ class NewParserTest extends MediaWikiTestCase {
 
                parent::setUp();
 
-               //Setup CLI arguments
+               // Setup CLI arguments
                if ( $this->getCliArg( 'regex' ) ) {
                        $this->regex = $this->getCliArg( 'regex' );
                } else {
@@ -210,7 +210,7 @@ class NewParserTest extends MediaWikiTestCase {
        function addDBData() {
                $this->tablesUsed[] = 'site_stats';
                # disabled for performance
-               #$this->tablesUsed[] = 'image';
+               # $this->tablesUsed[] = 'image';
 
                # Update certain things in site_stats
                $this->db->insert( 'site_stats',
@@ -346,7 +346,7 @@ class NewParserTest extends MediaWikiTestCase {
                }
        }
 
-       //ParserTest setup/teardown functions
+       // ParserTest setup/teardown functions
 
        /**
         * Set up the global variables for a consistent environment for each test.
@@ -426,7 +426,7 @@ class NewParserTest extends MediaWikiTestCase {
                        foreach ( $configLines as $line ) {
                                list( $var, $value ) = explode( '=', $line, 2 );
 
-                               $settings[$var] = eval( "return $value;" ); //???
+                               $settings[$var] = eval( "return $value;" ); // ???
                        }
                }
 
@@ -682,7 +682,7 @@ class NewParserTest extends MediaWikiTestCase {
        public function testParserTest( $desc, $input, $result, $opts, $config ) {
                if ( $this->regex != '' && !preg_match( '/' . $this->regex . '/', $desc ) ) {
                        $this->assertTrue( true ); // XXX: don't flood output with "test made no assertions"
-                       //$this->markTestSkipped( 'Filtered out by the user' );
+                       // $this->markTestSkipped( 'Filtered out by the user' );
                        return;
                }
 
@@ -865,7 +865,7 @@ class NewParserTest extends MediaWikiTestCase {
 
                        if ( $id % 100 == 0 ) {
                                $usage = intval( memory_get_usage( true ) / $this->memoryLimit / 1048576 * 100 );
-                               //echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
+                               // echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
                                if ( $usage > 90 ) {
                                        $ret = "Out of memory:\n";
                                        $memStats = $this->getMemoryBreakdown();
@@ -882,7 +882,7 @@ class NewParserTest extends MediaWikiTestCase {
                }
        }
 
-       //Various getter functions
+       // Various getter functions
 
        /**
         * Get an input dictionary from a set of parser test files
@@ -956,7 +956,7 @@ class NewParserTest extends MediaWikiTestCase {
                return $parser;
        }
 
-       //Various action functions
+       // Various action functions
 
        public function addArticle( $name, $text, $line ) {
                self::$articles[$name] = array( $text, $line );
@@ -999,7 +999,7 @@ class NewParserTest extends MediaWikiTestCase {
                return isset( $wgParser->mTransparentTagHooks[$name] );
        }
 
-       //Various "cleanup" functions
+       // Various "cleanup" functions
 
        /**
         * Remove last character if it is a newline
@@ -1014,7 +1014,7 @@ class NewParserTest extends MediaWikiTestCase {
                }
        }
 
-       //Test options parser functions
+       // Test options parser functions
 
        protected function parseOptions( $instring ) {
                $opts = array();
index af143ca..bf0eb10 100644 (file)
@@ -71,7 +71,8 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @expectedException MWException
-        * @expectedExceptionMessage Parser state cleared while parsing. Did you call Parser::parse recursively?
+        * @expectedExceptionMessage Parser state cleared while parsing.
+        *  Did you call Parser::parse recursively?
         * @covers Parser::lock
         */
        public function testRecursiveParse() {
index 345fd0a..1ebba1a 100644 (file)
@@ -193,7 +193,7 @@ class PreprocessorTest extends MediaWikiTestCase {
        }
 
        /**
-        * Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
+        * Tests from T30642 · https://phabricator.wikimedia.org/T30642
         */
        public static function provideHeadings() {
                // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
index 4af3898..672b1d4 100644 (file)
@@ -84,7 +84,11 @@ class TagHookTest extends MediaWikiTestCase {
                global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
 
-               $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), Parser::SFH_OBJECT_ARGS );
+               $parser->setFunctionTagHook(
+                       $tag,
+                       array( $this, 'functionTagCallback' ),
+                       Parser::SFH_OBJECT_ARGS
+               );
                $parser->parse(
                        "Foo<$tag>Bar</$tag>Baz",
                        Title::newFromText( 'Test' ),
index 8ac419f..d90567f 100644 (file)
@@ -12,7 +12,7 @@ class BcryptPasswordTestCase extends PasswordTestCase {
        }
 
        public static function providePasswordTests() {
-               /** @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong */
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Tests from glibc bcrypt implementation
                        array( true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "U*U" ),
@@ -35,6 +35,6 @@ class BcryptPasswordTestCase extends PasswordTestCase {
                        array( false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "UXU" ),
                        array( false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "" ),
                );
-               /** @codingStandardsIgnoreEnd */
+               // @codingStandardsIgnoreEnd
        }
 }
index 86e8270..368fda1 100644 (file)
@@ -27,11 +27,11 @@ class LayeredParameterizedPasswordTest extends PasswordTestCase {
        }
 
        public static function providePasswordTests() {
-               /** @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong */
+               // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
                return array(
                        array( true, ':testLargeLayeredTop:sha512:1024:512!sha512:1024:512!sha512:1024:512!sha512:1024:512!5!vnRy+2SrSA0fHt3dwhTP5g==!AVnwfZsAQjn+gULv7FSGjA==!xvHUX3WcpkeSn1lvjWcvBg==!It+OC/N9tu+d3ByHhuB0BQ==!Tb.gqUOiD.aWktVwHM.Q/O!7CcyMfXUPky5ptyATJsR2nq3vUqtnBC', 'testPassword123' ),
                );
-               /** @codingStandardsIgnoreEnd */
+               // @codingStandardsIgnoreEnd
        }
 
        /**
index ce4e30a..b419203 100644 (file)
@@ -191,41 +191,41 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
        public function provideMaxOfPolicies() {
                return array(
                        array(
-                               array( 'MinimalPasswordLength' => 8 ), //p1
-                               array( 'MinimalPasswordLength' => 2 ), //p2
-                               array( 'MinimalPasswordLength' => 8 ), //max
+                               array( 'MinimalPasswordLength' => 8 ), // p1
+                               array( 'MinimalPasswordLength' => 2 ), // p2
+                               array( 'MinimalPasswordLength' => 8 ), // max
                                'Basic max in p1'
                        ),
                        array(
-                               array( 'MinimalPasswordLength' => 2 ), //p1
-                               array( 'MinimalPasswordLength' => 8 ), //p2
-                               array( 'MinimalPasswordLength' => 8 ), //max
+                               array( 'MinimalPasswordLength' => 2 ), // p1
+                               array( 'MinimalPasswordLength' => 8 ), // p2
+                               array( 'MinimalPasswordLength' => 8 ), // max
                                'Basic max in p2'
                        ),
                        array(
-                               array( 'MinimalPasswordLength' => 8 ), //p1
+                               array( 'MinimalPasswordLength' => 8 ), // p1
                                array(
                                        'MinimalPasswordLength' => 2,
                                        'PasswordCannotMatchUsername' => 1,
-                               ), //p2
+                               ), // p2
                                array(
                                        'MinimalPasswordLength' => 8,
                                        'PasswordCannotMatchUsername' => 1,
-                               ), //max
+                               ), // max
                                'Missing items in p1'
                        ),
                        array(
                                array(
                                        'MinimalPasswordLength' => 8,
                                        'PasswordCannotMatchUsername' => 1,
-                               ), //p1
+                               ), // p1
                                array(
                                        'MinimalPasswordLength' => 2,
-                               ), //p2
+                               ), // p2
                                array(
                                        'MinimalPasswordLength' => 8,
                                        'PasswordCannotMatchUsername' => 1,
-                               ), //max
+                               ), // max
                                'Missing items in p2'
                        ),
                );
diff --git a/tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php b/tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php
new file mode 100644 (file)
index 0000000..8de467f
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+// @codingStandardsIgnoreFile
+/*
+ * This file is part of the PHPUnit_MockObject package.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Invocation matcher which looks for sets of specific parameters in the invocations.
+ *
+ * Checks the parameters of the incoming invocations, the parameter list is
+ * checked against the defined constraints in $parameters. If the constraint
+ * is met it will return true in matches().
+ *
+ * It takes a list of match groups and and increases a call index after each invocation.
+ * So the first invocation uses the first group of constraints, the second the next and so on.
+ */
+class PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
+{
+    /**
+     * @var array
+     */
+    private $_parameterGroups = array();
+
+    /**
+     * @var array
+     */
+    private $_invocations = array();
+
+    /**
+     * @param array $parameterGroups
+     */
+    public function __construct(array $parameterGroups)
+    {
+        foreach ($parameterGroups as $index => $parameters) {
+            foreach ($parameters as $parameter) {
+                if (!($parameter instanceof \PHPUnit_Framework_Constraint)) {
+                    $parameter = new \PHPUnit_Framework_Constraint_IsEqual($parameter);
+                }
+                $this->_parameterGroups[$index][] = $parameter;
+            }
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        $text = 'with consecutive parameters';
+
+        return $text;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return bool
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        $this->_invocations[] = $invocation;
+        $callIndex            = count($this->_invocations) - 1;
+        $this->verifyInvocation($invocation, $callIndex);
+
+        return false;
+    }
+
+    public function verify()
+    {
+        foreach ($this->_invocations as $callIndex => $invocation) {
+            $this->verifyInvocation($invocation, $callIndex);
+        }
+    }
+
+    /**
+     * Verify a single invocation
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation      $invocation
+     * @param  int                                          $callIndex
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    private function verifyInvocation(PHPUnit_Framework_MockObject_Invocation $invocation, $callIndex)
+    {
+
+        if (isset($this->_parameterGroups[$callIndex])) {
+            $parameters = $this->_parameterGroups[$callIndex];
+        } else {
+          // no parameter assertion for this call index
+            return;
+        }
+
+        if ($invocation === null) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+                'Mocked method does not exist.'
+            );
+        }
+
+        if (count($invocation->parameters) < count($parameters)) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+                sprintf(
+                    'Parameter count for invocation %s is too low.',
+                    $invocation->toString()
+                )
+            );
+        }
+
+        foreach ($parameters as $i => $parameter) {
+            $parameter->evaluate(
+                $invocation->parameters[$i],
+                sprintf(
+                    'Parameter %s for invocation #%d %s does not match expected ' .
+                    'value.',
+                    $i,
+                    $callIndex,
+                    $invocation->toString()
+                )
+            );
+        }
+    }
+}
diff --git a/tests/phpunit/includes/phpunit/LICENSE b/tests/phpunit/includes/phpunit/LICENSE
new file mode 100644 (file)
index 0000000..fe178b0
--- /dev/null
@@ -0,0 +1,33 @@
+PHPUnit
+
+Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ * 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.
+
+ * Neither the name of Sebastian Bergmann nor the names of his
+   contributors may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"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
+COPYRIGHT OWNER OR CONTRIBUTORS 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.
diff --git a/tests/phpunit/includes/phpunit/README b/tests/phpunit/includes/phpunit/README
new file mode 100644 (file)
index 0000000..3ec3fd9
--- /dev/null
@@ -0,0 +1,2 @@
+This directory contains classes duplicated from new versions of phpunit
+that also work in the older php 3.7.37 used by wmf CI servers.
index 1cb8a5d..ddf552e 100644 (file)
@@ -379,13 +379,21 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                        array(
                                array( 'wgGroupPermissions' ),
                                array(
-                                       'wgGroupPermissions' => array( 'sysop' => array( 'delete' ) ),
+                                       'wgGroupPermissions' => array(
+                                               'sysop' => array( 'delete' )
+                                       ),
                                ),
                                array(
-                                       'GroupPermissions' => array( 'sysop' => array( 'undelete' ), 'user' => array( 'edit' ) ),
+                                       'GroupPermissions' => array(
+                                               'sysop' => array( 'undelete' ),
+                                               'user' => array( 'edit' )
+                                       ),
                                ),
                                array(
-                                       'wgGroupPermissions' => array( 'sysop' => array( 'delete', 'undelete' ), 'user' => array( 'edit' ) ),
+                                       'wgGroupPermissions' => array(
+                                               'sysop' => array( 'delete', 'undelete' ),
+                                               'user' => array( 'edit' )
+                                       ),
                                )
                        )
                );
index d0bc210..fc1887d 100644 (file)
@@ -100,7 +100,8 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase {
                                array(
                                        'class' => 'ResourceLoaderImageModule',
                                        'selectorWithoutVariant' => '.mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-                                       'selectorWithVariant' => '.mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
+                                       'selectorWithVariant' =>
+                                               '.mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
                                        'variants' => self::$commonImageVariants,
                                        'images' => self::$commonImageData,
                                ),
@@ -146,7 +147,10 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase {
         * @covers ResourceLoaderImageModule::getStyles
         */
        public function testGetStyles( $module, $expected ) {
-               $module = new ResourceLoaderImageModuleTestable( $module, __DIR__ . '/../../data/resourceloader' );
+               $module = new ResourceLoaderImageModuleTestable(
+                       $module,
+                       __DIR__ . '/../../data/resourceloader'
+               );
                $styles = $module->getStyles( $this->getResourceLoaderContext() );
                $this->assertEquals( $expected, $styles['all'] );
        }
index cc121ba..b4f1000 100644 (file)
@@ -15,9 +15,16 @@ class ResourceLoaderImageTest extends ResourceLoaderTestCase {
        protected function getTestImage( $name ) {
                $options = ResourceLoaderImageModuleTest::$commonImageData[$name];
                $fileDescriptor = is_string( $options ) ? $options : $options['file'];
-               $allowedVariants = is_array( $options ) && isset( $options['variants'] ) ? $options['variants'] : array();
+               $allowedVariants = is_array( $options ) &&
+                       isset( $options['variants'] ) ? $options['variants'] : array();
                $variants = array_fill_keys( $allowedVariants, array( 'color' => 'red' ) );
-               return new ResourceLoaderImageTestable( $name, 'test', $fileDescriptor, $this->imagesPath, $variants );
+               return new ResourceLoaderImageTestable(
+                       $name,
+                       'test',
+                       $fileDescriptor,
+                       $this->imagesPath,
+                       $variants
+               );
        }
 
        public static function provideGetPath() {
@@ -86,7 +93,10 @@ class ResourceLoaderImageTest extends ResourceLoaderTestCase {
                $data = file_get_contents( $this->imagesPath . '/remove.svg' );
                $dataConstructive = file_get_contents( $this->imagesPath . '/remove_variantize.svg' );
                $this->assertEquals( $image->getImageData( $context, null, 'original' ), $data );
-               $this->assertEquals( $image->getImageData( $context, 'destructive', 'original' ), $dataConstructive );
+               $this->assertEquals(
+                       $image->getImageData( $context, 'destructive', 'original' ),
+                       $dataConstructive
+               );
                // Stub, since we don't know if we even have a SVG handler, much less what exactly it'll output
                $this->assertEquals( $image->getImageData( $context, null, 'rasterized' ), 'RASTERIZESTUB' );
 
index 41653fb..145698c 100644 (file)
@@ -75,7 +75,10 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                ) );
                $this->assertEquals(
                        $module->getScript( $context ),
-                       'mw.log.error("JavaScript parse error: Parse error: Unexpected token; token } expected in file \'input\' on line 3");',
+                       'mw.log.error(' .
+                               '"JavaScript parse error: Parse error: Unexpected token; ' .
+                               'token } expected in file \'input\' on line 3"' .
+                       ');',
                        'Replace invalid syntax with error logging'
                );
 
@@ -88,4 +91,41 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                        'Leave valid scripts as-is'
                );
        }
+
+       /**
+        * @covers ResourceLoaderModule::getRelativePaths
+        * @covers ResourceLoaderModule::expandRelativePaths
+        */
+       public function testPlaceholderize() {
+               $getRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'getRelativePaths' );
+               $getRelativePaths->setAccessible( true );
+               $expandRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'expandRelativePaths' );
+               $expandRelativePaths->setAccessible( true );
+
+               $this->setMwGlobals( array(
+                       'IP' => '/srv/example/mediawiki/core',
+               ) );
+               $raw = array(
+                               '/srv/example/mediawiki/core/resources/foo.js',
+                               '/srv/example/mediawiki/core/extensions/Example/modules/bar.js',
+                               '/srv/example/mediawiki/skins/Example/baz.css',
+                               '/srv/example/mediawiki/skins/Example/images/quux.png',
+               );
+               $canonical = array(
+                               'resources/foo.js',
+                               'extensions/Example/modules/bar.js',
+                               '../skins/Example/baz.css',
+                               '../skins/Example/images/quux.png',
+               );
+               $this->assertEquals(
+                       $getRelativePaths->invoke( null, $raw ),
+                       $canonical,
+                       'Insert placeholders'
+               );
+               $this->assertEquals(
+                       $expandRelativePaths->invoke( null, $canonical ),
+                       $raw,
+                       'Substitute placeholders'
+               );
+       }
 }
index 8cefec7..49e42b4 100644 (file)
@@ -61,7 +61,12 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                        array( $params, new HashConfig( array( 'UseSiteJs' => false ) + $settings ), array(
                                'MediaWiki:Common.css' => array( 'type' => 'style' ),
                        ) ),
-                       array( $params, new HashConfig( array( 'UseSiteJs' => false, 'UseSiteCss' => false ) ), array() ),
+                       array( $params,
+                               new HashConfig(
+                                       array( 'UseSiteJs' => false, 'UseSiteCss' => false )
+                               ),
+                               array()
+                       ),
                );
        }
 
index ef2ccca..3b95c46 100644 (file)
@@ -38,7 +38,7 @@ class MediaWikiSiteTest extends SiteTest {
                $site = new MediaWikiSite();
                $site->setGlobalId( 'enwiki' );
 
-               //NOTE: this does not actually call out to the enwiki site to perform the normalization,
+               // NOTE: this does not actually call out to the enwiki site to perform the normalization,
                //      but uses a local Title object to do so. This is hardcoded on SiteLink::normalizePageTitle
                //      for the case that MW_PHPUNIT_TEST is set.
                $this->assertEquals( 'Foo', $site->normalizePageName( ' foo ' ) );
index 63d90d2..2f785b5 100644 (file)
@@ -228,23 +228,23 @@ class SiteTest extends MediaWikiTestCase {
        }
 
        public static function provideGetPageUrl() {
-               //NOTE: the assumption that the URL is built by replacing $1
+               // NOTE: the assumption that the URL is built by replacing $1
                //      with the urlencoded version of $page
                //      is true for Site but not guaranteed for subclasses.
                //      Subclasses need to override this provider appropriately.
 
                return array(
-                       array( #0
+                       array( # 0
                                'http://acme.test/TestPath/$1',
                                'Foo',
                                '/TestPath/Foo',
                        ),
-                       array( #1
+                       array( # 1
                                'http://acme.test/TestScript?x=$1&y=bla',
                                'Foo',
                                'TestScript?x=Foo&y=bla',
                        ),
-                       array( #2
+                       array( # 2
                                'http://acme.test/TestPath/$1',
                                'foo & bar/xyzzy (quux-shmoox?)',
                                '/TestPath/foo%20%26%20bar%2Fxyzzy%20%28quux-shmoox%3F%29',
@@ -259,7 +259,7 @@ class SiteTest extends MediaWikiTestCase {
        public function testGetPageUrl( $path, $page, $expected ) {
                $site = new Site();
 
-               //NOTE: the assumption that getPageUrl is based on getLinkPath
+               // NOTE: the assumption that getPageUrl is based on getLinkPath
                //      is true for Site but not guaranteed for subclasses.
                //      Subclasses need to override this test case appropriately.
                $site->setLinkPath( $path );
index 4c40248..ac51183 100644 (file)
@@ -79,7 +79,7 @@ class TestSites {
                $languageCodes = array(
                        'de',
                        'en',
-                       'fa', //right-to-left
+                       'fa', // right-to-left
                        'nl',
                        'nn',
                        'no',
index c3d75aa..0a6336f 100644 (file)
@@ -26,7 +26,7 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->rc->setContext( $context );
                $formOptions = $this->rc->setup( null );
 
-               # Filter out rc_timestamp conditions which depends on the test runtime
+               #  Filter out rc_timestamp conditions which depends on the test runtime
                # This condition is not needed as of march 2, 2011 -- hashar
                # @todo FIXME: Find a way to generate the correct rc_timestamp
                $queryConditions = array_filter(
index 13c2838..df9b552 100644 (file)
@@ -207,7 +207,12 @@ class SpecialSearchTestMockResultSet extends SearchResultSet {
        protected $results;
        protected $suggestion;
 
-       public function __construct( $suggestion = null, $rewrittenQuery = null, array $results = array(), $containedSyntax = false) {
+       public function __construct(
+               $suggestion = null,
+               $rewrittenQuery = null,
+               array $results = array(),
+               $containedSyntax = false
+       ) {
                $this->suggestion = $suggestion;
                $this->rewrittenQuery = $rewrittenQuery;
                $this->results = $results;
index 1e5f9d0..6cfddf0 100644 (file)
@@ -93,15 +93,15 @@ class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
                                '!<a .*href=".*?Foo_Bar.*?".*?>Foo Bar</a>!'
                        ),
                        array(
-                               //NOTE: Linker doesn't include fragments in "broken" links
-                               //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
+                               // NOTE: Linker doesn't include fragments in "broken" links
+                               // NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
                                new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
                                'Hansi Maier\'s Stuff',
                                '!<a .*href=".*?User:Hansi_Maier.*?>Hansi Maier\'s Stuff</a>!'
                        ),
                        array(
-                               //NOTE: Linker doesn't include fragments in "broken" links
-                               //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
+                               // NOTE: Linker doesn't include fragments in "broken" links
+                               // NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
                                new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
                                null,
                                '!<a .*href=".*?User:Hansi_Maier.*?>User:Hansi Maier#stuff</a>!'
index 78d304c..d0a9831 100644 (file)
@@ -199,8 +199,8 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
        }
 
        public static function provideParseTitle() {
-               //TODO: test capitalization and trimming
-               //TODO: test unicode normalization
+               // TODO: test capitalization and trimming
+               // TODO: test unicode normalization
 
                return array(
                        array( '  : Hansi_Maier _ ', NS_MAIN, 'en',
@@ -233,7 +233,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        array( ' _ Foo __ Bar_ _', NS_MAIN, 'en',
                                new TitleValue( NS_MAIN, 'Foo_Bar' ) ),
 
-                       //NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
+                       // NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
                        array( 'Sandbox', NS_MAIN, 'en', ),
                        array( 'A "B"', NS_MAIN, 'en', ),
                        array( 'A \'B\'', NS_MAIN, 'en', ),
@@ -284,7 +284,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
        }
 
        public static function provideParseTitle_invalid() {
-               //TODO: test unicode errors
+               // TODO: test unicode errors
 
                return array(
                        array( '#' ),
@@ -299,7 +299,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        array( '::1' ), // only valid in user namespace
                        array( 'User::x' ), // leading ":" in a user name is only valid of IPv6 addresses
 
-                       //NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
+                       // NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
                        array( '' ),
                        array( ':' ),
                        array( '__  __' ),
@@ -319,9 +319,9 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        // XML/HTML character entity references
                        // Note: Commented out because they are not marked invalid by the PHP test as
                        // Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
-                       //array( 'A &eacute; B' ),
-                       //array( 'A &#233; B' ),
-                       //array( 'A &#x00E9; B' ),
+                       // array( 'A &eacute; B' ),
+                       // array( 'A &#233; B' ),
+                       // array( 'A &#x00E9; B' ),
                        // Subject of NS_TALK does not roundtrip to NS_MAIN
                        array( 'Talk:File:Example.svg' ),
                        // Directory navigation
index 9441b77..9ec1b46 100644 (file)
@@ -136,6 +136,7 @@ class UploadBaseTest extends MediaWikiTestCase {
        }
 
        public static function provideCheckSvgScriptCallback() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // html5sec SVG vectors
                        array(
@@ -389,6 +390,7 @@ class UploadBaseTest extends MediaWikiTestCase {
                                'SVG with local urls, including filter: in style'
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
 
index 52c242c..d63af9a 100644 (file)
@@ -19,6 +19,10 @@ class AvroValidatorTest extends PHPUnit_Framework_TestCase {
 
        public function getErrorsProvider() {
                $stringSchema = AvroSchema::parse( json_encode( array( 'type' => 'string' ) ) );
+               $stringArraySchema = AvroSchema::parse( json_encode( array(
+                       'type' => 'array',
+                       'items' => 'string',
+               ) ) );
                $recordSchema = AvroSchema::parse( json_encode( array(
                        'type' => 'record',
                        'name' => 'ut',
@@ -80,6 +84,18 @@ class AvroValidatorTest extends PHPUnit_Framework_TestCase {
                                        )
                                ) )
                        ),
+                       array(
+                               'Empty array is accepted',
+                               $stringArraySchema, array(), array()
+                       ),
+                       array(
+                               'correct array element accepted',
+                               $stringArraySchema, array( 'fizzbuzz' ), array()
+                       ),
+                       array(
+                               'incorrect array element rejected',
+                               $stringArraySchema, array( '12', 34 ), array( 'Expected string, but recieved integer' )
+                       ),
                );
        }
 
index a2b35f3..d224af8 100644 (file)
@@ -23,7 +23,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                $writer->write( $updates );
        }
 
-       static protected function mockUpdate( array $changes ) {
+       protected static function mockUpdate( array $changes ) {
                static $i = 0;
                return array(
                        'primaryKey' => array( 'event_id' => $i++ ),
@@ -53,7 +53,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                $this->assertEquals( count( $response ) - 1, $pos );
        }
 
-       static public function provider_readerGetPrimaryKey() {
+       public static function provider_readerGetPrimaryKey() {
                $row = array(
                        'id_field' => 42,
                        'some_col' => 'dvorak',
@@ -84,7 +84,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $reader->extractPrimaryKeys( (object) $row ), $message );
        }
 
-       static public function provider_readerSetFetchColumns() {
+       public static function provider_readerSetFetchColumns() {
                return array(
 
                        array(
@@ -123,11 +123,14 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_readerSetFetchColumns
         */
-       public function testReaderSetFetchColumns( $message, array $columns, array $primaryKeys, array $fetchColumns ) {
+       public function testReaderSetFetchColumns(
+               $message, array $columns, array $primaryKeys, array $fetchColumns
+       ) {
                $db = $this->mockDb();
                $db->expects( $this->once() )
                        ->method( 'select' )
-                       ->with( 'some_table', $columns ) // only testing second parameter of DatabaseBase::select
+                       // only testing second parameter of DatabaseBase::select
+                       ->with( 'some_table', $columns )
                        ->will( $this->returnValue( new ArrayIterator( array() ) ) );
 
                $reader = new BatchRowIterator( $db, 'some_table', $primaryKeys, 22 );
@@ -136,7 +139,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                $reader->rewind();
        }
 
-       static public function provider_readerSelectConditions() {
+       public static function provider_readerSelectConditions() {
                return array(
 
                        array(
@@ -148,7 +151,8 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                        ),
 
                        array(
-                               'With multiple primary keys the first conditions must use >= and the final condition must use >',
+                               'With multiple primary keys the first conditions ' .
+                                       'must use >= and the final condition must use >',
                                // Expected second iteration
                                array( "( id_field = '3' AND foo > '103' ) OR ( id_field > '3' )" ),
                                // Primary key(s)
@@ -164,7 +168,9 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
         *
         * @dataProvider provider_readerSelectConditions
         */
-       public function testReaderSelectConditionsMultiplePrimaryKeys( $message, $expectedSecondIteration, $primaryKeys, $batchSize = 3 ) {
+       public function testReaderSelectConditionsMultiplePrimaryKeys(
+               $message, $expectedSecondIteration, $primaryKeys, $batchSize = 3
+       ) {
                $results = $this->genSelectResult( $batchSize, $batchSize * 3, function() {
                        static $i = 0, $j = 100, $k = 1000;
                        return array( 'id_field' => ++$i, 'foo' => ++$j, 'bar' => ++$k );
@@ -232,12 +238,16 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
        protected function mockDb() {
                // Cant mock from DatabaseType or DatabaseBase, they dont
                // have the full gamut of methods
+               // FIXME: the constructor normally sets mAtomicLevels and mSrvCache
                $databaseMysql = $this->getMockBuilder( 'DatabaseMysql' )
                        ->disableOriginalConstructor()
                        ->getMock();
                $databaseMysql->expects( $this->any() )
                        ->method( 'isOpen' )
                        ->will( $this->returnValue( true ) );
+               $databaseMysql->expects( $this->any() )
+                       ->method( 'getApproximateLagStatus' )
+                       ->will( $this->returnValue( array( 'lag' => 0, 'since' => 0 ) ) );
                return $databaseMysql;
        }
 }
diff --git a/tests/phpunit/includes/utils/FileContentsHasherTest.php b/tests/phpunit/includes/utils/FileContentsHasherTest.php
new file mode 100644 (file)
index 0000000..a03e1fc
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @covers FileContentsHasherTest
+ */
+class FileContentsHasherTest extends MediaWikiTestCase {
+
+       public function provideSingleFile() {
+               return array_map( function ( $file ) {
+                       return array( $file, file_get_contents( $file ) );
+               }, glob( __DIR__ . '/../../data/filecontentshasher/*.*' ) );
+       }
+
+       public function provideMultipleFiles() {
+               return array(
+                       array( $this->provideSingleFile() )
+               );
+       }
+
+       /**
+        * @covers FileContentsHasher::getFileContentHash
+        * @covers FileContentsHasher::getFileContentsHashInternal
+        * @dataProvider provideSingleFile
+        */
+       public function testSingleFileHash( $fileName, $contents ) {
+               foreach ( array( 'md4', 'md5' ) as $algo ) {
+                       $expectedHash = hash( $algo, $contents );
+                       $actualHash = FileContentsHasher::getFileContentsHash( $fileName, $algo );
+                       $this->assertEquals( $expectedHash, $actualHash );
+                       $actualHashRepeat = FileContentsHasher::getFileContentsHash( $fileName, $algo );
+                       $this->assertEquals( $expectedHash, $actualHashRepeat );
+               }
+       }
+
+       /**
+        * @covers FileContentsHasher::getFileContentHash
+        * @covers FileContentsHasher::getFileContentsHashInternal
+        * @dataProvider provideMultipleFiles
+        */
+       public function testMultipleFileHash( $files ) {
+               $fileNames = array();
+               $hashes = array();
+               foreach ( $files as $fileInfo ) {
+                       list( $fileName, $contents ) = $fileInfo;
+                       $fileNames[] = $fileName;
+                       $hashes[] = md5( $contents );
+               }
+
+               $expectedHash = md5( implode( '', $hashes ) );
+               $actualHash = FileContentsHasher::getFileContentsHash( $fileNames, 'md5' );
+               $this->assertEquals( $expectedHash, $actualHash );
+               $actualHashRepeat = FileContentsHasher::getFileContentsHash( $fileNames, 'md5' );
+               $this->assertEquals( $expectedHash, $actualHashRepeat );
+       }
+}
index 73e4c1a..2c51af3 100644 (file)
@@ -41,6 +41,7 @@ class MWCryptHKDFTest extends MediaWikiTestCase {
         */
        public static function providerRfc5869() {
 
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // A.1
                        array( 'sha256',
@@ -88,7 +89,7 @@ class MWCryptHKDFTest extends MediaWikiTestCase {
                                '0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4' // okm
                        ),
                );
-
+               // @codingStandardsIgnoreEnd
        }
 
 
diff --git a/tests/phpunit/includes/utils/MWCryptHashTest.php b/tests/phpunit/includes/utils/MWCryptHashTest.php
new file mode 100644 (file)
index 0000000..ad54e2f
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ *
+ * @group Hash
+ */
+
+class MWCryptHashTest extends MediaWikiTestCase {
+
+       public function testHashLength() {
+               if ( MWCryptHash::hashAlgo() !== 'whirlpool' ) {
+                       $this->markTestSkipped( 'Hash algorithm isn\'t whirlpool' );
+               }
+
+               $this->assertEquals( 64, MWCryptHash::hashLength(), 'Raw hash length' );
+               $this->assertEquals( 128, MWCryptHash::hashLength( false ), 'Hex hash length' );
+       }
+
+       public function testHash() {
+               if ( MWCryptHash::hashAlgo() !== 'whirlpool' ) {
+                       $this->markTestSkipped( 'Hash algorithm isn\'t whirlpool' );
+               }
+
+               $data = 'foobar';
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
+               $hash = '9923afaec3a86f865bb231a588f453f84e8151a2deb4109aebc6de4284be5bebcff4fab82a7e51d920237340a043736e9d13bab196006dcca0fe65314d68eab9';
+               // @codingStandardsIgnoreEnd
+
+               $this->assertEquals(
+                       pack( 'H*', $hash ),
+                       MWCryptHash::hash( $data ),
+                       'Raw hash'
+               );
+               $this->assertEquals(
+                       $hash,
+                       MWCryptHash::hash( $data, false ),
+                       'Hex hash'
+               );
+       }
+
+       public function testHmac() {
+               if ( MWCryptHash::hashAlgo() !== 'whirlpool' ) {
+                       $this->markTestSkipped( 'Hash algorithm isn\'t whirlpool' );
+               }
+
+               $data = 'foobar';
+               $key = 'secret';
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
+               $hash = 'ddc94177b2020e55ce2049199fd9cc6327f416ff6dc621cc34cb43d9bec61d73372b4790c0e24957f565ecaf2d42821e6303619093e99cbe14a3b9250bda5f81';
+               // @codingStandardsIgnoreEnd
+
+               $this->assertEquals(
+                       pack( 'H*', $hash ),
+                       MWCryptHash::hmac( $data, $key ),
+                       'Raw hmac'
+               );
+               $this->assertEquals(
+                       $hash,
+                       MWCryptHash::hmac( $data, $key, false ),
+                       'Hex hmac'
+               );
+       }
+
+}
index 1381afb..a301479 100644 (file)
@@ -110,6 +110,71 @@ class LanguageRuTest extends LanguageClassesTestCase {
                                'Викиданные',
                                'prepositional',
                        ),
+                       array(
+                               'русского',
+                               'русский',
+                               'languagegen',
+                       ),
+                       array(
+                               'немецкого',
+                               'немецкий',
+                               'languagegen',
+                       ),
+                       array(
+                               'иврита',
+                               'иврит',
+                               'languagegen',
+                       ),
+                       array(
+                               'эсперанто',
+                               'эсперанто',
+                               'languagegen',
+                       ),
+                       array(
+                               'русском',
+                               'русский',
+                               'languageprep',
+                       ),
+                       array(
+                               'немецком',
+                               'немецкий',
+                               'languageprep',
+                       ),
+                       array(
+                               'идише',
+                               'идиш',
+                               'languageprep',
+                       ),
+                       array(
+                               'эсперанто',
+                               'эсперанто',
+                               'languageprep',
+                       ),
+                       array(
+                               'по-русски',
+                               'русский',
+                               'languageadverb',
+                       ),
+                       array(
+                               'по-немецки',
+                               'немецкий',
+                               'languageadverb',
+                       ),
+                       array(
+                               'на иврите',
+                               'иврит',
+                               'languageadverb',
+                       ),
+                       array(
+                               'на эсперанто',
+                               'эсперанто',
+                               'languageadverb',
+                       ),
+                       array(
+                               'на языке гуарани',
+                               'гуарани',
+                               'languageadverb',
+                       ),
                );
        }
 }
index bfb199f..7643f84 100644 (file)
@@ -65,35 +65,35 @@ class LanguageSrTest extends LanguageClassesTestCase {
         * @covers LanguageConverter::convertTo
         */
        public function testConversionToCyrillic() {
-               //A simple convertion of Latin to Cyrillic
+               // A simple convertion of Latin to Cyrillic
                $this->assertEquals( 'абвг',
                        $this->convertToCyrillic( 'abvg' )
                );
-               //Same as above, but assert that -{}-s must be removed and not converted
+               // Same as above, but assert that -{}-s must be removed and not converted
                $this->assertEquals( 'ljабnjвгdž',
                        $this->convertToCyrillic( '-{lj}-ab-{nj}-vg-{dž}-' )
                );
-               //A simple convertion of Cyrillic to Cyrillic
+               // A simple convertion of Cyrillic to Cyrillic
                $this->assertEquals( 'абвг',
                        $this->convertToCyrillic( 'абвг' )
                );
-               //Same as above, but assert that -{}-s must be removed and not converted
+               // Same as above, but assert that -{}-s must be removed and not converted
                $this->assertEquals( 'ljабnjвгdž',
                        $this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{dž}-' )
                );
-               //This text has some Latin, but is recognized as Cyrillic, so it should not be converted
+               // This text has some Latin, but is recognized as Cyrillic, so it should not be converted
                $this->assertEquals( 'abvgшђжчћ',
                        $this->convertToCyrillic( 'abvgшђжчћ' )
                );
-               //Same as above, but assert that -{}-s must be removed
+               // Same as above, but assert that -{}-s must be removed
                $this->assertEquals( 'љabvgњшђжчћџ',
                        $this->convertToCyrillic( '-{љ}-abvg-{њ}-шђжчћ-{џ}-' )
                );
-               //This text has some Cyrillic, but is recognized as Latin, so it should be converted
+               // This text has some Cyrillic, but is recognized as Latin, so it should be converted
                $this->assertEquals( 'абвгшђжчћ',
                        $this->convertToCyrillic( 'абвгšđžčć' )
                );
-               //Same as above, but assert that -{}-s must be removed and not converted
+               // Same as above, but assert that -{}-s must be removed and not converted
                $this->assertEquals( 'ljабвгnjшђжчћdž',
                        $this->convertToCyrillic( '-{lj}-абвг-{nj}-šđžčć-{dž}-' )
                );
@@ -107,19 +107,19 @@ class LanguageSrTest extends LanguageClassesTestCase {
         * @covers LanguageConverter::convertTo
         */
        public function testConversionToLatin() {
-               //A simple convertion of Latin to Latin
+               // A simple convertion of Latin to Latin
                $this->assertEquals( 'abcd',
                        $this->convertToLatin( 'abcd' )
                );
-               //A simple convertion of Cyrillic to Latin
+               // A simple convertion of Cyrillic to Latin
                $this->assertEquals( 'abcd',
                        $this->convertToLatin( 'абцд' )
                );
-               //This text has some Latin, but is recognized as Cyrillic, so it should be converted
+               // This text has some Latin, but is recognized as Cyrillic, so it should be converted
                $this->assertEquals( 'abcdšđžčć',
                        $this->convertToLatin( 'abcdшђжчћ' )
                );
-               //This text has some Cyrillic, but is recognized as Latin, so it should not be converted
+               // This text has some Cyrillic, but is recognized as Latin, so it should not be converted
                $this->assertEquals( 'абцдšđžčć',
                        $this->convertToLatin( 'абцдšđžčć' )
                );
@@ -177,7 +177,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
                );
        }
 
-       ##### HELPERS #####################################################
+       # #### HELPERS #####################################################
        /**
         *Wrapper to verify text stay the same after applying conversion
         * @param string $text Text to convert
index 9051bcf..5912df6 100644 (file)
@@ -69,4 +69,42 @@ class LanguageUkTest extends LanguageClassesTestCase {
                        array( 'other', 121 ),
                );
        }
+
+       /**
+        * @dataProvider providerGrammar
+        * @covers Language::convertGrammar
+        */
+       public function testGrammar( $result, $word, $case ) {
+               $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
+       }
+
+       public static function providerGrammar() {
+               return array(
+                       array(
+                               'Вікіпедії',
+                               'Вікіпедія',
+                               'genitive',
+                       ),
+                       array(
+                               'Віківидів',
+                               'Віківиди',
+                               'genitive',
+                       ),
+                       array(
+                               'Вікіцитат',
+                               'Вікіцитати',
+                               'genitive',
+                       ),
+                       array(
+                               'Вікіпідручника',
+                               'Вікіпідручник',
+                               'genitive',
+                       ),
+                       array(
+                               'Вікіпедію',
+                               'Вікіпедія',
+                               'accusative',
+                       ),
+               );
+       }
 }
index 4881103..7ef87bf 100644 (file)
@@ -56,7 +56,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
                );
        }
 
-       ##### HELPERS #####################################################
+       # #### HELPERS #####################################################
        /**
         * Wrapper to verify text stay the same after applying conversion
         * @param string $text Text to convert
diff --git a/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php b/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
deleted file mode 100644 (file)
index 8e3b114..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström
- * @file
- */
-
-/**
- * @covers CLDRPluralRuleEvaluator
- */
-class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
-       /**
-        * @dataProvider validTestCases
-        */
-       function testValidRules( $expected, $rules, $number, $comment ) {
-               $result = CLDRPluralRuleEvaluator::evaluate( $number, (array)$rules );
-               $this->assertEquals( $expected, $result, $comment );
-       }
-
-       /**
-        * @dataProvider invalidTestCases
-        * @expectedException CLDRPluralRuleError
-        */
-       function testInvalidRules( $rules, $comment ) {
-               CLDRPluralRuleEvaluator::evaluate( 1, (array)$rules );
-       }
-
-       function validTestCases() {
-               $tests = array(
-                       # expected, rule, number, comment
-                       array( 0, 'n is 1', 1, 'integer number and is' ),
-                       array( 0, 'n is 1', "1", 'string integer number and is' ),
-                       array( 0, 'n is 1', 1.0, 'float number and is' ),
-                       array( 0, 'n is 1', "1.0", 'string float number and is' ),
-                       array( 1, 'n is 1', 1.1, 'float number and is' ),
-                       array( 1, 'n is 1', 2, 'float number and is' ),
-
-                       array( 0, 'n in 1,3,5', 3, '' ),
-                       array( 1, 'n not in 1,3,5', 5, '' ),
-
-                       array( 1, 'n in 1,3,5', 2, '' ),
-                       array( 0, 'n not in 1,3,5', 4, '' ),
-
-                       array( 0, 'n in 1..3', 2, '' ),
-                       array( 0, 'n in 1..3', 3, 'in is inclusive' ),
-                       array( 1, 'n in 1..3', 0, '' ),
-
-                       array( 1, 'n not in 1..3', 2, '' ),
-                       array( 1, 'n not in 1..3', 3, 'in is inclusive' ),
-                       array( 0, 'n not in 1..3', 0, '' ),
-
-                       array( 1, 'n is not 1 and n is not 2 and n is not 3', 1, 'and relation' ),
-                       array( 0, 'n is not 1 and n is not 2 and n is not 4', 3, 'and relation' ),
-
-                       array( 0, 'n is not 1 or n is 1', 1, 'or relation' ),
-                       array( 1, 'n is 1 or n is 2', 3, 'or relation' ),
-
-                       array( 0, 'n              is      1', 1, 'extra whitespace' ),
-
-                       array( 0, 'n mod 3 is 1', 7, 'mod' ),
-                       array( 0, 'n mod 3 is not 1', 4.3, 'mod with floats' ),
-
-                       array( 0, 'n within 1..3', 2, 'within with integer' ),
-                       array( 0, 'n within 1..3', 2.5, 'within with float' ),
-                       array( 0, 'n in 1..3', 2, 'in with integer' ),
-                       array( 1, 'n in 1..3', 2.5, 'in with float' ),
-
-                       array( 0, 'n in 3 or n is 4 and n is 5', 3, 'and binds more tightly than or' ),
-                       array( 1, 'n is 3 or n is 4 and n is 5', 4, 'and binds more tightly than or' ),
-
-                       array( 0, 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99', 24, 'breton rule' ),
-                       array( 1, 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99', 25, 'breton rule' ),
-
-                       array( 0, 'n within 0..2 and n is not 2', 0, 'french rule' ),
-                       array( 0, 'n within 0..2 and n is not 2', 1, 'french rule' ),
-                       array( 0, 'n within 0..2 and n is not 2', 1.2, 'french rule' ),
-                       array( 1, 'n within 0..2 and n is not 2', 2, 'french rule' ),
-
-                       array( 1, 'n in 3..10,13..19', 2, 'scottish rule - ranges with comma' ),
-                       array( 0, 'n in 3..10,13..19', 4, 'scottish rule - ranges with comma' ),
-                       array( 1, 'n in 3..10,13..19', 12.999, 'scottish rule - ranges with comma' ),
-                       array( 0, 'n in 3..10,13..19', 13, 'scottish rule - ranges with comma' ),
-
-                       array( 0, '5 mod 3 is n', 2, 'n as result of mod - no need to pass' ),
-
-                       # Revision 33 new operand examples
-                       # expected, rule, number, comment
-                       array( 0, 'i is 1', '1.00', 'new operand i' ),
-                       array( 0, 'v is 2', '1.00', 'new operand v' ),
-                       array( 0, 'w is 0', '1.00', 'new operand w' ),
-                       array( 0, 'f is 0', '1.00', 'new operand f' ),
-                       array( 0, 't is 0', '1.00', 'new operand t' ),
-
-                       array( 0, 'i is 1', '1.30', 'new operand i' ),
-                       array( 0, 'v is 2', '1.30', 'new operand v' ),
-                       array( 0, 'w is 1', '1.30', 'new operand w' ),
-                       array( 0, 'f is 30', '1.30', 'new operand f' ),
-                       array( 0, 't is 3', '1.30', 'new operand t' ),
-
-                       array( 0, 'i is 1', '1.03', 'new operand i' ),
-                       array( 0, 'v is 2', '1.03', 'new operand v' ),
-                       array( 0, 'w is 2', '1.03', 'new operand w' ),
-                       array( 0, 'f is 3', '1.03', 'new operand f' ),
-                       array( 0, 't is 3', '1.03', 'new operand t' ),
-
-                       # Revision 33 new operator aliases
-                       # expected, rule, number, comment
-                       array( 0, 'n % 3 is 1', 7, 'new % operator' ),
-                       array( 0, 'n = 1,3,5', 3, 'new = operator' ),
-                       array( 1, 'n != 1,3,5', 5, 'new != operator' ),
-
-                       # Revision 33 samples
-                       # expected, rule, number, comment
-                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
-                       array( 0, 'n in 1,3,5@integer 3~10, 103~110, 1003, … @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 103.0, 1003.0, …', 3, 'samples' ),
-                       // @codingStandardsIgnoreEnd
-
-                       # Revision 33 some test cases from CLDR
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.1', 'pt one' ),
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.01', 'pt one' ),
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.10', 'pt one' ),
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.010', 'pt one' ),
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.100', 'pt one' ),
-                       array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '0.0', 'pt other' ),
-                       array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '0.2', 'pt other' ),
-                       array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '10.0', 'pt other' ),
-                       array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '100.0', 'pt other' ),
-                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '2', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '4', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '22', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '102', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '0.2', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '0.4', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '10.2', 'bs few' ),
-                       array( 1, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '10.0', 'bs other' ),
-                       // @codingStandardsIgnoreEnd
-               );
-
-               return $tests;
-       }
-
-       function invalidTestCases() {
-               $tests = array(
-                       array( 'n mod mod 5 is 1', 'mod mod' ),
-                       array( 'n', 'just n' ),
-                       array( 'n is in 5', 'is in' ),
-               );
-
-               return $tests;
-       }
-}
index e2fc824..454e9c1 100644 (file)
@@ -816,7 +816,10 @@ class MaintenanceTest extends MediaWikiTestCase {
         */
        public function testGetConfig() {
                $this->assertInstanceOf( 'Config', $this->m->getConfig() );
-               $this->assertSame( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ), $this->m->getConfig() );
+               $this->assertSame(
+                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
+                       $this->m->getConfig()
+               );
        }
 
        /**
index 587d6d0..49b91c3 100755 (executable)
@@ -42,14 +42,28 @@ class PHPUnitMaintClass extends Maintenance {
                        false, # not required
                        false # no arg needed
                );
-               $this->addOption( 'regex', 'Only run parser tests that match the given regex.', false, true );
+               $this->addOption(
+                       'regex',
+                       'Only run parser tests that match the given regex.',
+                       false,
+                       true
+               );
                $this->addOption( 'file', 'File describing parser tests.', false, true );
                $this->addOption( 'use-filebackend', 'Use filebackend', false, true );
                $this->addOption( 'use-bagostuff', 'Use bagostuff', false, true );
                $this->addOption( 'use-jobqueue', 'Use jobqueue', false, true );
-               $this->addOption( 'keep-uploads', 'Re-use the same upload directory for each test, don\'t delete it.', false, false );
+               $this->addOption(
+                       'keep-uploads',
+                       'Re-use the same upload directory for each test, don\'t delete it.',
+                       false,
+                       false
+               );
                $this->addOption( 'use-normal-tables', 'Use normal DB tables.', false, false );
-               $this->addOption( 'reuse-db', 'Init DB only if tables are missing and keep after finish.', false, false );
+               $this->addOption(
+                       'reuse-db', 'Init DB only if tables are missing and keep after finish.',
+                       false,
+                       false
+               );
        }
 
        public function finalSetup() {
@@ -66,11 +80,21 @@ class PHPUnitMaintClass extends Maintenance {
                // wfWarn should cause tests to fail
                $wgDevelopmentWarnings = true;
 
+               // Make sure all caches and stashes are either disabled or use
+               // in-process cache only to prevent tests from using any preconfigured
+               // cache meant for the local wiki from outside the test run.
+               // See also MediaWikiTestCase::run() which mocks CACHE_DB and APC.
+
+               // Disabled in DefaultSettings, override local settings
+               $wgMainWANCache =
                $wgMainCacheType = CACHE_NONE;
-               $wgMainWANCache = CACHE_NONE;
-               $wgMessageCacheType = CACHE_NONE;
-               $wgParserCacheType = CACHE_NONE;
-               $wgLanguageConverterCacheType = CACHE_NONE;
+               // Uses CACHE_ANYTHING in DefaultSettings, use hash instead of db
+               $wgMessageCacheType =
+               $wgParserCacheType =
+               $wgSessionCacheType =
+               $wgLanguageConverterCacheType = 'hash';
+               // Uses db-replicated in DefaultSettings
+               $wgMainStash = 'hash';
 
                $wgUseDatabaseMessages = false; # Set for future resets
 
@@ -104,7 +128,7 @@ class PHPUnitMaintClass extends Maintenance {
 
                # Make sure we have --configuration or PHPUnit might complain
                if ( !in_array( '--configuration', $_SERVER['argv'] ) ) {
-                       //Hack to eliminate the need to use the Makefile (which sucks ATM)
+                       // Hack to eliminate the need to use the Makefile (which sucks ATM)
                        array_splice( $_SERVER['argv'], 1, 0,
                                array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
                }
index eefc926..ae0d325 100644 (file)
@@ -198,7 +198,14 @@ class ResourcesTest extends MediaWikiTestCase {
                                                        $media,
                                                        $file,
                                                        // XXX: Wrapped in an object to keep it out of PHPUnit output
-                                                       (object)array( 'cssText' => $readStyleFile->invoke( $module, $file, $flip ) ),
+                                                       (object)array(
+                                                               'cssText' => $readStyleFile->invoke(
+                                                                       $module,
+                                                                       $file,
+                                                                       $flip,
+                                                                       $data['context']
+                                                               )
+                                                       ),
                                                );
                                        }
                                }
index 1acbc24..d93dafb 100644 (file)
@@ -26,6 +26,8 @@ phpunit.php enables colors for other OSs at runtime
                </testsuite>
                <testsuite name="skins">
                        <directory>skins</directory>
+                       <directory>structure</directory>
+                       <file>suites/LessTestSuite.php</file>
                </testsuite>
                <!-- As there is a class Maintenance, we cannot use the
                     name "maintenance" directly -->
index 01f9625..e7b45bd 100644 (file)
@@ -8,9 +8,9 @@
        /**
         * Add bogus to url to prevent IE crazy caching
         *
-        * @param {String} value a relative path (eg. 'data/foo.js'
+        * @param {string} value a relative path (eg. 'data/foo.js'
         * or 'data/test.php?foo=bar').
-        * @return {String} Such as 'data/foo.js?131031765087663960'
+        * @return {string} Such as 'data/foo.js?131031765087663960'
         */
        QUnit.fixurl = function ( value ) {
                return value + ( /\?/.test( value ) ? '&' : '?' )
index 032551d..cab4080 100644 (file)
@@ -5,7 +5,7 @@
         */
 
        var text, ipv4,
-               simpleMDYDatesInMDY, simpleMDYDatesInDMY, oldMDYDates, complexMDYDates, clobberedDates, MYDates, YDates,
+               simpleMDYDatesInMDY, simpleMDYDatesInDMY, oldMDYDates, complexMDYDates, clobberedDates, MYDates, YDates, ISODates,
                currencyData, transformedCurrencyData;
 
        QUnit.module( 'jquery.tablesorter.parsers', QUnit.newMwEnvironment( {
@@ -44,9 +44,9 @@
        /**
         * For a value, check if the parser recognizes it and how it transforms it
         *
-        * @param {String} msg text to pass on to qunit describing the test case
-        * @param {String[]} parserId of the parser that will be tested
-        * @param {String[][]} data Array of testcases. Each testcase, array of
+        * @param {string} msg text to pass on to qunit describing the test case
+        * @param {string[]} parserId of the parser that will be tested
+        * @param {string[][]} data Array of testcases. Each testcase, array of
         *              inputValue: The string value that we want to test the parser for
         *              recognized: If we expect that this value's type is detectable by the parser
         *              outputValue: The value the parser has converted the input to
        ];
        parserTest( 'Y Dates', 'date', YDates );
 
+       ISODates = [
+               [ '2000',               false, 946684800000, 'Plain 4-digit year' ],
+               [ '2000-01',            false, 946684800000, 'Year with month' ],
+               [ '2000-01-01', true, 946684800000, 'Year with month and day' ],
+               [ '2000-13-01', true, 0, 'Non existant month' ],
+               [ '2000-01-32', true, 0, 'Non existant day' ],
+               [ '2000-01-01T12:30:30',                true, 946729830000, 'Date with a time' ],
+               [ '2000-01-01T12:30:30Z',       true, 946729830000, 'Date with a UTC+0 time' ],
+               [ '2000-01-01T24:30:30Z',       true, 0, 'Date with invalid hours' ],
+               [ '2000-01-01T12:60:30Z',       true, 0, 'Date with invalid minutes' ],
+               [ '2000-01-01T12:30:61Z',       true, 0, 'Date with invalid amount of seconds' ],
+               [ '2000-01-01T23:59:59Z',       true, 946771199000, 'Edges of time' ],
+               [ '2000-01-01T12:30:30.111Z',   true, 946729830111, 'Date with milliseconds' ],
+               [ '2000-01-01T12:30:30.11111Z', true, 946729830111, 'Date with too high precision' ],
+               [ '2000-01-01T12:30:30,111Z',   true, 0, 'Date with milliseconds and , separator' ],
+               [ '2000-01-01T12:30:30+01:00',  true, 946726230000, 'Date time in UTC+1' ],
+               [ '2000-01-01T12:30:30+01:30',  true, 946724430000, 'Date time in UTC+1:30' ],
+               [ '2000-01-01T12:30:30-01:00',  true, 946733430000, 'Date time in UTC-1' ],
+               [ '2000-01-01T12:30:30-01:30',  true, 946735230000, 'Date time in UTC-1:30' ],
+               [ '2000-01-01T12:30:30.111+01:00', true, 946726230111, 'Date time and milliseconds in UTC+1 ' ]
+               /* Disable testcases, because behavior is browser dependant */
+               /*
+               [ '2000-11-31', true, 0, '31 days in 30 day month' ],
+               [ '50-01-01',   false, -60589296000000, 'Year with just two digits' ],
+               [ '-1000-01-01',        true, -93724128000000, 'Year BC' ],
+               [ '+1000-01-01',        true, -30610224000000, 'Date with +sign' ],
+               [ '2000-01-01 12:30:30Z',       true, 0, 'Date and time with no T marker' ],
+               [ '2000-01-01T12:30:60Z',       true, 946729860000, 'Date with leap second' ],
+               [ '2000-01-01T12:30:30-24:00',  true, 946816230000, 'Date time in UTC-24' ],
+               [ '2000-01-01T12:30:30+24:00',  true, 946643430000, 'Date time in UTC+24' ],
+               [ '2000-01-01T12:30:30+0100',   true, 946726230000, 'Time without separator in timezone offset' ]
+               */
+       ];
+       parserTest( 'ISO Dates', 'isoDate', ISODates );
+
        currencyData = [
                [ '1.02 $',     true, 1.02, '' ],
                [ '$ 3.00',     true, 3, '' ],
index d4d0ce1..6805eab 100644 (file)
                        [ 'January 01 2010' ],
                        [ 'January 16 2010' ],
                        [ 'February 05 2010' ]
+               ],
+               isoDateSorting = [
+                       [ '2010-02-01' ],
+                       [ '2009-12-25T12:30:45.001Z' ],
+                       [ '2010-01-31' ],
+                       [ '2009' ],
+                       [ '2009-12-25T12:30:45' ],
+                       [ '2009-12-25T12:30:45.111' ],
+                       [ '2009-12-25T12:30:45+01:00' ]
+               ],
+               isoDateSortingSorted = [
+                       [ '2009' ],
+                       [ '2009-12-25T12:30:45' ],
+                       [ '2009-12-25T12:30:45+01:00' ],
+                       [ '2009-12-25T12:30:45.001Z' ],
+                       [ '2009-12-25T12:30:45.111' ],
+                       [ '2010-01-31' ],
+                       [ '2010-02-01' ]
                ];
 
        QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment( {
         * Create an HTML table from an array of row arrays containing text strings.
         * First row will be header row. No fancy rowspan/colspan stuff.
         *
-        * @param {String[]} header
-        * @param {String[][]} data
+        * @param {string[]} header
+        * @param {string[][]} data
         * @return {jQuery}
         */
        function tableCreate( header, data ) {
         * Extract text from table.
         *
         * @param {jQuery} $table
-        * @return {String[][]}
+        * @return {string[][]}
         */
        function tableExtract( $table ) {
                var data = [];
         * Run a table test by building a table with the given data,
         * running some callback on it, then checking the results.
         *
-        * @param {String} msg text to pass on to qunit for the comparison
-        * @param {String[]} header cols to make the table
-        * @param {String[][]} data rows/cols to make the table
-        * @param {String[][]} expected rows/cols to compare against at end
+        * @param {string} msg text to pass on to qunit for the comparison
+        * @param {string[]} header cols to make the table
+        * @param {string[][]} data rows/cols to make the table
+        * @param {string[][]} expected rows/cols to compare against at end
         * @param {function($table)} callback something to do with the table before we compare
         */
        function tableTest( msg, header, data, expected, callback ) {
         * Run a table test by building a table with the given HTML,
         * running some callback on it, then checking the results.
         *
-        * @param {String} msg text to pass on to qunit for the comparison
-        * @param {String} HTML to make the table
-        * @param {String[][]} expected rows/cols to compare against at end
-        * @param {function($table)} callback something to do with the table before we compare
+        * @param {string} msg text to pass on to qunit for the comparison
+        * @param {string} html HTML to make the table
+        * @param {string[][]} expected Rows/cols to compare against at end
+        * @param {function($table)} callback Something to do with the table before we compare
         */
        function tableTestHTML( msg, html, expected, callback ) {
                QUnit.test( msg, 1, function ( assert ) {
                }
        );
 
+       tableTest(
+               'ISO date sorting',
+               [ 'isoDate' ],
+               isoDateSorting,
+               isoDateSortingSorted,
+               function ( $table ) {
+                       mw.config.set( 'wgDefaultDateFormat', 'dmy' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+
        QUnit.test( 'Sorting images using alt text', 1, function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
index 2e6f05e..1001679 100644 (file)
@@ -11,7 +11,7 @@
         * @param {string} options.output Output
         * @param {int} options.start Starting char for selection
         * @param {int} options.end Ending char for selection
-        * @param {object} options.params Additional parameters for $().textSelection( 'encapsulateText' )
+        * @param {Object} options.params Additional parameters for $().textSelection( 'encapsulateText' )
         */
        function encapsulateTest( options ) {
                var opt = $.extend( {
index 51374bd..b12803d 100644 (file)
@@ -60,7 +60,7 @@
                } );
        } );
 
-       QUnit.test( 'Constructor( String[, Object ] )', 10, function ( assert ) {
+       QUnit.test( 'Constructor( String[, Object ] )', 11, function ( assert ) {
                var uri;
 
                uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
                        strictMode: false
                } );
                assert.equal( uri.toString(), 'http://example.com/bar/baz', 'normalize URI without protocol or // in loose mode' );
+
+               /*jshint -W001 */
+               uri = new mw.Uri( 'http://example.com/index.php?key=key&hasOwnProperty=hasOwnProperty&constructor=constructor&watch=watch' );
+               assert.deepEqual(
+                       uri.query,
+                       {
+                               key: 'key',
+                               constructor: 'constructor',
+                               hasOwnProperty: 'hasOwnProperty',
+                               watch: 'watch'
+                       },
+                       'Keys in query strings support names of Object prototypes (bug T114344)'
+               );
+               /*jshint +W001 */
        } );
 
        QUnit.test( 'Constructor( Object )', 3, function ( assert ) {
                relativePath = uri.getRelativePath();
                assert.ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
                assert.ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
-               assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' );
+               assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragment in relative path' );
        } );
 
        QUnit.test( 'Parse a uri with an @ symbol in the path and query', 1, function ( assert ) {
index e7f4517..7e488ee 100644 (file)
@@ -1,5 +1,6 @@
 ( function ( mw, $ ) {
-       var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers, expectedEntrypoints,
+       var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers,
+               expectedListUsersSitename, expectedEntrypoints,
                mwLanguageCache = {},
                hasOwn = Object.hasOwnProperty;
 
@@ -16,6 +17,8 @@
                        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>';
 
                        expectedEntrypoints = '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>';
 
@@ -41,7 +44,7 @@
                        'gender-msg-currentuser': '{{GENDER:|blue|pink|green}}',
 
                        'plural-msg': 'Found $1 {{PLURAL:$1|item|items}}',
-                       // See https://bugzilla.wikimedia.org/69993
+                       // See https://phabricator.wikimedia.org/T71993
                        'plural-msg-explicit-forms-nested': 'Found {{PLURAL:$1|$1 results|0=no results in {{SITENAME}}|1=$1 result}}',
                        // Assume the grammar form grammar_case_foo is not valid in any language
                        'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
@@ -52,6 +55,7 @@
                        'see-portal-url': '{{Int:portal-url}} is an important community page.',
 
                        'jquerymsg-test-statistics-users': '注册[[Special:ListUsers|用户]]',
+                       'jquerymsg-test-statistics-users-sitename': '注册[[Special:ListUsers|用户{{SITENAME}}]]',
 
                        'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
 
                process( tasks, QUnit.start );
        } );
 
-       QUnit.test( 'Links', 6, function ( assert ) {
-               var expectedDisambiguationsText,
+       QUnit.test( 'Links', 11, function ( assert ) {
+               var testCases,
+                       expectedDisambiguationsText,
                        expectedMultipleBars,
                        expectedSpecialCharacters;
 
                        expectedSpecialCharacters,
                        'Special characters'
                );
+
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-test-statistics-users-sitename' ),
+                       expectedListUsersSitename,
+                       'Piped wikilink with parser function in the text'
+               );
+
+               testCases = [
+                       [
+                               'extlink-html-full',
+                               'asd [http://example.org <strong>Example</strong>] asd',
+                               'asd <a href="http://example.org"><strong>Example</strong></a> asd'
+                       ],
+                       [
+                               'extlink-html-partial',
+                               'asd [http://example.org foo <strong>Example</strong> bar] asd',
+                               'asd <a href="http://example.org">foo <strong>Example</strong> bar</a> asd'
+                       ],
+                       [
+                               'wikilink-html-full',
+                               'asd [[Example|<strong>Example</strong>]] asd',
+                               'asd <a title="Example" href="/wiki/Example"><strong>Example</strong></a> asd'
+                       ],
+                       [
+                               'wikilink-html-partial',
+                               'asd [[Example|foo <strong>Example</strong> bar]] asd',
+                               'asd <a title="Example" href="/wiki/Example">foo <strong>Example</strong> bar</a> asd'
+                       ]
+               ];
+
+               $.each( testCases, function () {
+                       var
+                               key = this[ 0 ],
+                               input = this[ 1 ],
+                               output = this[ 2 ];
+                       mw.messages.set( key, input );
+                       assert.htmlEqual(
+                               formatParse( key ),
+                               output,
+                               'HTML in links: ' + key
+                       );
+               } );
+       } );
+
+       QUnit.test( 'Replacements in links', 14, function ( assert ) {
+               var testCases = [
+                       [
+                               'extlink-param-href-full',
+                               'asd [$1 Example] asd',
+                               'asd <a href="http://example.com">Example</a> asd'
+                       ],
+                       [
+                               'extlink-param-href-partial',
+                               'asd [$1/example Example] asd',
+                               'asd <a href="http://example.com/example">Example</a> asd'
+                       ],
+                       [
+                               'extlink-param-text-full',
+                               'asd [http://example.org $2] asd',
+                               'asd <a href="http://example.org">Text</a> asd'
+                       ],
+                       [
+                               'extlink-param-text-partial',
+                               'asd [http://example.org Example $2] asd',
+                               'asd <a href="http://example.org">Example Text</a> asd'
+                       ],
+                       [
+                               'extlink-param-both-full',
+                               'asd [$1 $2] asd',
+                               'asd <a href="http://example.com">Text</a> asd'
+                       ],
+                       [
+                               'extlink-param-both-partial',
+                               'asd [$1/example Example $2] asd',
+                               'asd <a href="http://example.com/example">Example Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-href-full',
+                               'asd [[$1|Example]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Example</a> asd'
+                       ],
+                       [
+                               'wikilink-param-href-partial',
+                               'asd [[$1/Test|Example]] asd',
+                               'asd <a title="Example/Test" href="/wiki/Example/Test">Example</a> asd'
+                       ],
+                       [
+                               'wikilink-param-text-full',
+                               'asd [[Example|$2]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-text-partial',
+                               'asd [[Example|Example $2]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Example Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-both-full',
+                               'asd [[$1|$2]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-both-partial',
+                               'asd [[$1/Test|Example $2]] asd',
+                               'asd <a title="Example/Test" href="/wiki/Example/Test">Example Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-unpiped-full',
+                               'asd [[$1]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Example</a> asd'
+                       ],
+                       [
+                               'wikilink-param-unpiped-partial',
+                               'asd [[$1/Test]] asd',
+                               'asd <a title="Example/Test" href="/wiki/Example/Test">Example/Test</a> asd'
+                       ]
+               ];
+
+               $.each( testCases, function () {
+                       var
+                               key = this[ 0 ],
+                               input = this[ 1 ],
+                               output = this[ 2 ],
+                               paramHref = key.slice( 0, 8 ) === 'wikilink' ? 'Example' : 'http://example.com',
+                               paramText = 'Text';
+                       mw.messages.set( key, input );
+                       assert.htmlEqual(
+                               formatParse( key, paramHref, paramText ),
+                               output,
+                               'Replacements in links: ' + key
+                       );
+               } );
        } );
 
        // Tests that {{-transformation vs. general parsing are done as requested
        } );
 
        // HTML in wikitext
-       QUnit.test( 'HTML', 26, function ( assert ) {
+       QUnit.test( 'HTML', 32, function ( assert ) {
                mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
 
                assertBothModes( assert, [ 'jquerymsg-italics-msg' ], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
                        'Mismatched HTML start and end tag treated as text'
                );
 
-               // TODO (mattflaschen, 2013-03-18): It's not a security issue, but there's no real
-               // reason the htmlEmitter span needs to be here. It's an artifact of how emitting works.
                mw.messages.set( 'jquerymsg-script-and-external-link', '<script>alert( "jquerymsg-script-and-external-link test" );</script> [http://example.com <i>Foo</i> bar]' );
                assert.htmlEqual(
                        formatParse( 'jquerymsg-script-and-external-link' ),
-                       '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><span class="mediaWiki_htmlEmitter"><i>Foo</i> bar</span></a>',
+                       '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><i>Foo</i> bar</a>',
                        'HTML tags in external links not interfering with escaping of other tags'
                );
 
                mw.messages.set( 'jquerymsg-link-script', '[http://example.com <script>alert( "jquerymsg-link-script test" );</script>]' );
                assert.htmlEqual(
                        formatParse( 'jquerymsg-link-script' ),
-                       '<a href="http://example.com"><span class="mediaWiki_htmlEmitter">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</span></a>',
+                       '<a href="http://example.com">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</a>',
                        'Non-whitelisted HTML tag in external link anchor treated as text'
                );
 
                mw.messages.set( 'jquerymsg-wikitext-contents-script', '<i><script>Script inside</script></i>' );
                assert.htmlEqual(
                        formatParse( 'jquerymsg-wikitext-contents-script' ),
-                       '<i><span class="mediaWiki_htmlEmitter">&lt;script&gt;Script inside&lt;/script&gt;</span></i>',
+                       '<i>&lt;script&gt;Script inside&lt;/script&gt;</i>',
                        'Contents of valid tag are treated as wikitext, so invalid HTML element is treated as text'
                );
 
                        'Foo&lt;tag/&gt;bar',
                        'Self-closing tags don\'t cause a parse error'
                );
+
+               mw.messages.set( 'jquerymsg-entities1', 'A&B' );
+               mw.messages.set( 'jquerymsg-entities2', 'A&gt;B' );
+               mw.messages.set( 'jquerymsg-entities3', 'A&rarr;B' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities1' ),
+                       'A&amp;B',
+                       'Lone "&" is escaped in text'
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities2' ),
+                       'A&amp;gt;B',
+                       '"&gt;" entity is double-escaped in text' // (WHY?)
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities3' ),
+                       'A&amp;rarr;B',
+                       '"&rarr;" entity is double-escaped in text'
+               );
+
+               mw.messages.set( 'jquerymsg-entities-attr1', '<i title="A&B"></i>' );
+               mw.messages.set( 'jquerymsg-entities-attr2', '<i title="A&gt;B"></i>' );
+               mw.messages.set( 'jquerymsg-entities-attr3', '<i title="A&rarr;B"></i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr1' ),
+                       '<i title="A&amp;B"></i>',
+                       'Lone "&" is escaped in attribute'
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr2' ),
+                       '<i title="A&gt;B"></i>',
+                       '"&gt;" entity is not double-escaped in attribute' // (WHY?)
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr3' ),
+                       '<i title="A&amp;rarr;B"></i>',
+                       '"&rarr;" entity is double-escaped in attribute'
+               );
        } );
 
        QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) {
index 399290c..e4c3851 100644 (file)
@@ -99,7 +99,7 @@
                                word: 'Wikipedia',
                                grammarForm: 'תחילית',
                                expected: '־Wikipedia',
-                               description: 'GAdd a hyphen (maqaf) before non-Hebrew letters'
+                               description: 'Add a hyphen (maqaf) before non-Hebrew letters'
                        },
                        {
                                word: '1995',
                                grammarForm: 'prepositional',
                                expected: 'данных',
                                description: 'Grammar test for prepositional case, данные -> данных'
+                       },
+                       {
+                               word: 'русский',
+                               grammarForm: 'languagegen',
+                               expected: 'русского',
+                               description: 'Grammar test for languagegen case, русский -> русского'
+                       },
+                       {
+                               word: 'немецкий',
+                               grammarForm: 'languagegen',
+                               expected: 'немецкого',
+                               description: 'Grammar test for languagegen case, немецкий -> немецкого'
+                       },
+                       {
+                               word: 'иврит',
+                               grammarForm: 'languagegen',
+                               expected: 'иврита',
+                               description: 'Grammar test for languagegen case, иврит -> иврита'
+                       },
+                       {
+                               word: 'эсперанто',
+                               grammarForm: 'languagegen',
+                               expected: 'эсперанто',
+                               description: 'Grammar test for languagegen case, эсперанто -> эсперанто'
+                       },
+                       {
+                               word: 'русский',
+                               grammarForm: 'languageprep',
+                               expected: 'русском',
+                               description: 'Grammar test for languageprep case, русский -> русском'
+                       },
+                       {
+                               word: 'немецкий',
+                               grammarForm: 'languageprep',
+                               expected: 'немецком',
+                               description: 'Grammar test for languageprep case, немецкий -> немецком'
+                       },
+                       {
+                               word: 'идиш',
+                               grammarForm: 'languageprep',
+                               expected: 'идише',
+                               description: 'Grammar test for languageprep case, идиш -> идише'
+                       },
+                       {
+                               word: 'эсперанто',
+                               grammarForm: 'languageprep',
+                               expected: 'эсперанто',
+                               description: 'Grammar test for languageprep case, эсперанто -> эсперанто'
+                       },
+                       {
+                               word: 'русский',
+                               grammarForm: 'languageadverb',
+                               expected: 'по-русски',
+                               description: 'Grammar test for languageadverb case, русский -> по-русски'
+                       },
+                       {
+                               word: 'немецкий',
+                               grammarForm: 'languageadverb',
+                               expected: 'по-немецки',
+                               description: 'Grammar test for languageadverb case, немецкий -> по-немецки'
+                       },
+                       {
+                               word: 'иврит',
+                               grammarForm: 'languageadverb',
+                               expected: 'на иврите',
+                               description: 'Grammar test for languageadverb case, иврит -> на иврите'
+                       },
+                       {
+                               word: 'эсперанто',
+                               grammarForm: 'languageadverb',
+                               expected: 'на эсперанто',
+                               description: 'Grammar test for languageadverb case, эсперанто -> на эсперанто'
+                       },
+                       {
+                               word: 'гуарани',
+                               grammarForm: 'languageadverb',
+                               expected: 'на языке гуарани',
+                               description: 'Grammar test for languageadverb case, гуарани -> на языке гуарани'
                        }
                ],
 
                ],
 
                uk: [
-                       {
-                               word: 'тесть',
-                               grammarForm: 'genitive',
-                               expected: 'тестя',
-                               description: 'Grammar test for genitive case'
-                       },
                        {
                                word: 'Вікіпедія',
                                grammarForm: 'genitive',
                                description: 'Grammar test for genitive case'
                        },
                        {
-                               word: 'установка',
-                               grammarForm: 'genitive',
-                               expected: 'установки',
-                               description: 'Grammar test for genitive case'
-                       },
-                       {
-                               word: 'похоти',
+                               word: 'Віківиди',
                                grammarForm: 'genitive',
-                               expected: 'поÑ\85оÑ\82ей',
+                               expected: 'Ð\92Ñ\96кÑ\96видÑ\96в',
                                description: 'Grammar test for genitive case'
                        },
                        {
-                               word: 'доводÑ\8b',
+                               word: 'Ð\92Ñ\96кÑ\96Ñ\86иÑ\82аÑ\82и',
                                grammarForm: 'genitive',
-                               expected: 'доводов',
+                               expected: 'Ð\92Ñ\96кÑ\96Ñ\86иÑ\82аÑ\82',
                                description: 'Grammar test for genitive case'
                        },
                        {
-                               word: 'пеÑ\81Ñ\87аник',
+                               word: 'Ð\92Ñ\96кÑ\96пÑ\96дÑ\80Ñ\83Ñ\87ник',
                                grammarForm: 'genitive',
-                               expected: 'пеÑ\81Ñ\87аника',
+                               expected: 'Ð\92Ñ\96кÑ\96пÑ\96дÑ\80Ñ\83Ñ\87ника',
                                description: 'Grammar test for genitive case'
                        },
                        {
index c25641d..6cef4a7 100644 (file)
@@ -1,53 +1,36 @@
 ( function ( mw ) {
-       QUnit.module( 'mediawiki.storage: normal case.', {
-               setup: function () {
-                       this.sandbox.stub( mw.storage, 'isLocalStorageSupported', true );
-                       this.spy = this.sandbox.spy( localStorage, 'setItem' );
-                       this.sandbox.stub( localStorage, 'getItem' )
-                               .withArgs( 'foo' ).returns( 'test' )
-                               .withArgs( 'bar' ).returns( null );
-               }
-       } );
+       QUnit.module( 'mediawiki.storage' );
+
+       QUnit.test( 'set/get with localStorage', 3, function ( assert ) {
+               this.sandbox.stub( mw.storage, 'localStorage', {
+                       setItem: this.sandbox.spy(),
+                       getItem: this.sandbox.stub()
+               } );
 
-       QUnit.test( 'set/get with localStorage', 4, function ( assert ) {
                mw.storage.set( 'foo', 'test' );
-               assert.strictEqual( this.spy.calledOnce, true, 'Check localStorage called.' );
-               assert.strictEqual( this.spy.calledWith( 'foo', 'test' ), true,
-                       'Check prefixed.' );
+               assert.ok( mw.storage.localStorage.setItem.calledOnce );
+
+               mw.storage.localStorage.getItem.withArgs( 'foo' ).returns( 'test' );
+               mw.storage.localStorage.getItem.returns( null );
                assert.strictEqual( mw.storage.get( 'foo' ), 'test', 'Check value gets stored.' );
                assert.strictEqual( mw.storage.get( 'bar' ), null, 'Unset values are null.' );
        } );
 
-       QUnit.module( 'mediawiki.storage: localStorage does not exist', {
-               setup: function () {
-                       this.sandbox.stub( mw.storage, 'isLocalStorageSupported', false );
-                       this.sandbox.stub( localStorage, 'setItem' ).throws();
-               }
-       } );
-
        QUnit.test( 'set/get without localStorage', 3, function ( assert ) {
-               assert.strictEqual( mw.storage.set( 'foo', 'test' ), false,
-                       'When localStorage not available save fails.' );
-
-               assert.strictEqual( mw.storage.remove( 'foo', 'test' ), false,
-                       'When localStorage not available remove fails.' );
+               this.sandbox.stub( mw.storage, 'localStorage', {
+                       getItem: this.sandbox.stub(),
+                       removeItem: this.sandbox.stub(),
+                       setItem: this.sandbox.stub()
+               } );
 
-               assert.strictEqual( mw.storage.get( 'foo' ), false,
-                               'Inability to retrieve values return false to differentiate from null (not set).' );
-       } );
+               mw.storage.localStorage.getItem.throws();
+               assert.strictEqual( mw.storage.get( 'foo' ), false );
 
-       QUnit.module( 'mediawiki.storage: localStorage exhausted', {
-               setup: function () {
-                       this.sandbox.stub( mw.storage, 'isLocalStorageSupported', true );
-                       this.sandbox.stub( localStorage, 'setItem' ).throws();
-                       this.sandbox.stub( localStorage, 'getItem' ).returns( null );
-               }
-       } );
+               mw.storage.localStorage.setItem.throws();
+               assert.strictEqual( mw.storage.set( 'foo', 'test' ), false );
 
-       QUnit.test( 'set/get without localStorage', 2, function ( assert ) {
-               assert.strictEqual( mw.storage.set( 'foo', 'test' ), false,
-                       'When localStorage not available inform user with false.' );
-               assert.strictEqual( mw.storage.get( 'foo' ), null, 'No value registered.' );
+               mw.storage.localStorage.removeItem.throws();
+               assert.strictEqual( mw.storage.remove( 'foo', 'test' ), false );
        } );
 
 }( mediaWiki ) );
index 111d85b..cec0552 100644 (file)
 
                hello = mw.message( 'hello' );
 
-               // https://bugzilla.wikimedia.org/show_bug.cgi?id=44459
+               // https://phabricator.wikimedia.org/T46459
                assert.equal( hello.format, 'text', 'Message property "format" defaults to "text"' );
 
                assert.strictEqual( hello.map, mw.messages, 'Message property "map" defaults to the global instance in mw.messages' );
index 16f458b..d73496f 100644 (file)
@@ -458,8 +458,11 @@ class TestFileIterator implements Iterator {
                        $this->sectionData['config'] = '';
                }
 
-               $isDisabled = preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled;
-               $isParsoidOnly = preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && $result == 'html' && !$this->parserTest->runParsoid;
+               $isDisabled = preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) &&
+                       !$this->parserTest->runDisabled;
+               $isParsoidOnly = preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) &&
+                       $result == 'html' &&
+                       !$this->parserTest->runParsoid;
                $isFiltered = !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] );
                if ( $input == false || $result == false || $isDisabled || $isParsoidOnly || $isFiltered ) {
                        # disabled test
index d39d43b..bd14e41 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -38,7 +38,7 @@ if ( defined( 'THUMB_HANDLER' ) ) {
 $mediawiki = new MediaWiki();
 $mediawiki->doPostOutputShutdown( 'fast' );
 
-//--------------------------------------------------------------------------
+// --------------------------------------------------------------------------
 
 /**
  * Handle a thumbnail request via thumbnail file URL
@@ -250,11 +250,16 @@ function wfStreamThumb( array $params ) {
        try {
                $thumbName = $img->thumbName( $params );
                if ( !strlen( $thumbName ) ) { // invalid params?
-                       throw new MediaTransformInvalidParametersException( 'Empty return from File::thumbName' );
+                       throw new MediaTransformInvalidParametersException(
+                               'Empty return from File::thumbName'
+                       );
                }
                $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
        } catch ( MediaTransformInvalidParametersException $e ) {
-               wfThumbError( 400, 'The specified thumbnail parameters are not valid: ' . $e->getMessage() );
+               wfThumbError(
+                       400,
+                       'The specified thumbnail parameters are not valid: ' . $e->getMessage()
+               );
                return;
        } catch ( MWException $e ) {
                wfThumbError( 500, $e->getHTML() );
@@ -294,7 +299,8 @@ function wfStreamThumb( array $params ) {
        $dispositionType = isset( $params['download'] ) ? 'attachment' : 'inline';
 
        // Suggest a good name for users downloading this thumbnail
-       $headers[] = "Content-Disposition: {$img->getThumbDisposition( $thumbName, $dispositionType )}";
+       $headers[] =
+               "Content-Disposition: {$img->getThumbDisposition( $thumbName, $dispositionType )}";
 
        if ( count( $varyHeader ) ) {
                $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
@@ -333,7 +339,9 @@ function wfStreamThumb( array $params ) {
        $errorCode = 500;
        if ( !$thumb ) {
                $errorMsg = $errorMsg ?: $msg->rawParams( 'File::transform() returned false' )->escaped();
-               if ( $errorMsg instanceof MessageSpecifier && $errorMsg->getKey() === 'thumbnail_image-failure-limit' ) {
+               if ( $errorMsg instanceof MessageSpecifier &&
+                       $errorMsg->getKey() === 'thumbnail_image-failure-limit'
+               ) {
                        $errorCode = 429;
                }
        } elseif ( $thumb->isError() ) {
@@ -341,8 +349,9 @@ function wfStreamThumb( array $params ) {
        } elseif ( !$thumb->hasFile() ) {
                $errorMsg = $msg->rawParams( 'No path supplied in thumbnail object' )->escaped();
        } elseif ( $thumb->fileIsSource() ) {
-               $errorMsg = $msg->
-                       rawParams( 'Image was not scaled, is the requested width bigger than the source?' )->escaped();
+               $errorMsg = $msg
+                       ->rawParams( 'Image was not scaled, is the requested width bigger than the source?' )
+                       ->escaped();
                $errorCode = 400;
        }
 
@@ -585,7 +594,9 @@ function wfThumbError( $status, $msgHtml ) {
        }
        if ( $wgShowHostnames ) {
                header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );
-               $url = htmlspecialchars( isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '' );
+               $url = htmlspecialchars(
+                       isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : ''
+               );
                $hostname = htmlspecialchars( wfHostname() );
                $debug = "<!-- $url -->\n<!-- $hostname -->\n";
        } else {